すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:内部ネットワークで最大 100 Gbit/s の帯域幅を使用する

最終更新日:Apr 08, 2025

Object Storage Service (OSS) は、中国 (上海)、中国 (深セン)、中国 (北京)、中国 (杭州) の各リージョンにおいて、内部ネットワーク上で最大 100 Gbit/s の単一アカウント帯域幅を提供します。このトピックでは、重要なポイントを分析し、OSS SDK for Go を使用してオブジェクトをダウンロードし、ピーク帯域幅をテストするケーススタディを提供することにより、OSS の 100 Gbit/s 帯域幅を最大限に活用する方法について説明します。また、一般的なツールを使用して OSS のオブジェクト同時ダウンロードパフォーマンスを向上させる方法についても説明します。

シナリオ

大量のデータ、高同時アクセス、または非常に高いリアルタイム要件を伴うビジネスシナリオでは、通常、最大 100 Gbit/s の内部ネットワーク帯域幅が必要です。例:

  • ビッグデータ分析およびコンピューティング: 単一のタスクでテラバイトまたはペタバイト単位のデータを読み取るなど、大量のデータを読み取る必要があり、高いリアルタイムパフォーマンスが求められます。コンピューティング効率を向上させるには、パフォーマンスボトルネックを回避するためにデータの読み取り速度が十分に速くなければなりません。

  • AI トレーニングデータセットの読み込み: トレーニングデータセットにはペタバイト単位のデータが含まれている場合があり、高いスループットが必要です。複数のトレーニングノードが同時にデータを読み込む場合、合計帯域幅は 100 Gbit/s に達する可能性があります。

  • データのバックアップと復元: データ量が多い場合、フルデータバックアップなどのバックアップ操作と復元操作には、ペタバイト単位のデータが関係します。短期間でバックアップ操作と復元操作を完了する必要がある場合、帯域幅は 100 Gbit/s に達する可能性があります。

  • 高性能科学計算: 科学計算タスクでは、ペタバイト単位のデータ、またはさらに大きなデータセットを処理する場合があります。複数の研究チームが同じデータに同時にアクセスする可能性があり、高同時アクセスと高帯域幅要件が発生します。リアルタイム分析とチームコラボレーションをサポートするには、データ転送を高速化する必要があります。

重要なポイント

最大 100 Gbit/s の帯域幅を使用するには、まず適切な Elastic Compute Service (ECS) インスタンスタイプを選択して、帯域幅の上限を設定する必要があります。次に、ディスクにデータを保存する場合、効率を向上させるために高性能ディスクを選択する必要があります。さらに、アクセス速度を向上させるために、Virtual Private Cloud (VPC) 経由でデータにアクセスすることをお勧めします。同時ダウンロードが必要な場合は、適切な最適化手法を使用してダウンロード帯域幅を活用できます。

ネットワーク受信機能

OSS クライアントを ECS インスタンスにインストールした場合、データのダウンロード速度は ECS インスタンスのネットワーク速度によって制限されます。ネットワーク機能が最も強力な Alibaba Cloud モデルは、160 Gbit/s の帯域幅を提供できます。複数のインスタンスをクラスターにデプロイする場合、クライアントが同時にアクセスされると、合計帯域幅は 100 Gbit/s に達する可能性があります。単一のインスタンスのみをデプロイする場合は、ネットワーク拡張型インスタンスファミリまたはクロック速度の高いインスタンスファミリを使用することをお勧めします。後者は、大量のデータパケットを受信するときにパフォーマンスが向上します。

説明

単一の ENI (Elastic Network Interface) は、インスタンスの仕様に基づいて最大 100 Gbit/s の帯域幅をサポートすることに注意してください。単一インスタンスの帯域幅が 100 Gbit/s を超える場合、ECS では複数の ENI をバインドする必要があります。詳細については、「Elastic Network Interface」をご参照ください。

ディスク I/O

データがローカルコンピュータにダウンロードされた後、データをディスクに保存する場合、ダウンロード速度はディスクのパフォーマンスによって制限されます。デフォルトでは、ossutil や ossfs などのツールはデータをディスクに保存します。この場合、次の図に示すように、高性能ディスクまたはメモリディスクを使用してダウンロード速度を向上させることができます。

説明

Enterprise SSD (ESSD) は 32 Gbit/s のスループットを実現できますが、メモリディスクのパフォーマンスは大幅に向上します。最大ダウンロード帯域幅に到達するには、データをディスクに保存しないでください。 ossfs を使用してデータをディスクに保存せず、データの読み取りパフォーマンスを向上させる方法の詳細については、「読み取り専用シナリオでのパフォーマンスの最適化」をご参照ください。

image

VPC を使用する

Alibaba Cloud 内部ネットワークは、ネットワークデータリクエスト用に最適化されています。VPC エンドポイントを使用する場合、ネットワークはインターネットよりも安定しています。最大ダウンロード帯域幅に到達するには、VPC を使用する必要があります。

ECS インスタンスは VPC 内で実行されます。OSS は、VPC 経由で任意の顧客がアクセスできる統一された内部ドメイン名を提供します。例: oss-cn-beijing-internal.aliyuncs.com。ECS と OSS 間のデータフローは Server Load Balancer (SLB) を通過し、リクエストはバックエンドの分散クラスターに送信されます。これにより、データリクエストがクラスター全体に均等に分散され、OSS に強力な高同時実行処理機能が付与されます。

同時ダウンロード

OSS は HTTP プロトコルを使用してデータを送信します。単一の HTTP リクエストのパフォーマンス制限のため、同時ダウンロードを使用してデータダウンロードを高速化します。たとえば、オブジェクトを複数の範囲に分割して、各リクエストが 1 つの範囲のみにアクセスするようにすることで、最大ダウンロード帯域幅に到達できます。API 操作の数に基づいて課金されます。範囲の数が多いほど API 操作の数が増え、範囲の数が多いほど、シングルストリームデータダウンロード中のピークダウンロード速度が保証されるわけではありません。一般的なツールを使用して同時ダウンロードを行う方法の詳細については、「一般的なツールを使用して同時ダウンロードを最適化する」をご参照ください。

ユースケース

最大帯域幅のダウンロード機能をテストするために、OSS から 100 GB のバイナリ bin オブジェクトをダウンロードする Go 言語テストプログラムを作成しました。データをディスクに保存しない特別なデータ処理戦略を設計しました。つまり、データは一度読み取られてから破棄されます。同時に、大きなオブジェクトは複数の範囲に分割され、範囲サイズと同時データ量は調整可能なパラメーターとして構成されます。これらのパラメーターを簡単に調整して、最大ダウンロード帯域幅に到達できます。

テスト環境

インスタンスタイプ

vCPU

メモリ (GiB)

ネットワークベースライン/バースト帯域幅 (Gbit/s)

パケット転送速度 (PPS)

接続数

NIC キュー

ENI

ENI あたりのプライベート IPv4/IPv6 アドレス

接続できるディスクの数

ディスクベースライン/バースト IOPS

ディスクベースライン/バースト帯域幅 (Gbit/s)

ecs.hfg8i.32xlarge

128

512

100/なし

3,000 万

400 万

64

15

50/50

64

900,000/なし

64/なし

テスト手順

  1. 環境変数を構成します。

    export OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
  2. サンプルコード:

    package main
    
    import (
        "context"
        "flag"
        "fmt"
        "io"
        "log"
        "time"
        "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
        "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    // コマンドラインパラメータを格納するグローバル変数を指定します。
    var (
        region     string // バケットが配置されているリージョン。
        endpoint    string // バケットが配置されているバケットのエンドポイント。
        bucketName string                     // バケットの名前。
        objectName  string // オブジェクトの名前。
        chunkSize   int64  // チャンクのサイズ。単位: バイト。
        prefetchNum int // プリフェッチするチャンクの数。
    )
    
    // コマンドラインパラメータを解析する関数を初期化します。
    func init() {
        flag.StringVar(&region, "region", "", "バケットが配置されているリージョン。")
        flag.StringVar(&endpoint, "endpoint", "", "他のサービスが OSS にアクセスするために使用できるドメイン名。")
        flag.StringVar(&bucketName, "bucket", "", "バケットの `名前`。")
        flag.StringVar(&objectName, "object", "", "オブジェクトの `名前`。")
        flag.Int64Var(&chunkSize, "chunk-size", 0, "チャンクサイズ (バイト単位)")
        flag.IntVar(&prefetchNum, "prefetch-num", 0, "プリフェッチ数")
    }
    
    func main() {
        // コマンドラインパラメータを解析します。
        flag.Parse()
    
        // 必須パラメータが指定されているかどうかを確認します。
        if len(bucketName) == 0 {
            flag.PrintDefaults()
            log.Fatalf("無効なパラメータ、バケット名が必要です")
        }
    
        if len(region) == 0 {
            flag.PrintDefaults()
            log.Fatalf("無効なパラメータ、リージョンが必要です")
        }
    
        // OSSClient インスタンスを構成します。
        cfg := oss.LoadDefaultConfig().
            WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()). // 環境変数の認証情報を使用します。
            WithRegion(region) // リージョンを指定します。
    
        // カスタムエンドポイントが提供されている場合は、エンドポイントを指定します。
        if len(endpoint) > 0 {
            cfg.WithEndpoint(endpoint)
        }
    
        // OSSClient インスタンスを作成します。
        client := oss.NewClient(cfg)
    
        // OSS オブジェクトを開きます。
        f, err := client.OpenFile(context.TODO(), bucketName, objectName, func(oo *oss.OpenOptions) {
            oo.EnablePrefetch = true // プリフェッチモードを有効にします。
            oo.ChunkSize = chunkSize      // チャンクのサイズを指定します。
            oo.PrefetchNum=prefetchNum // プリフェッチするチャンクの数を指定します。
            oo.PrefetchThreshold=int64 (0) // プリフェッチしきい値を指定します。
        })
    
        if err != nil {
            log.Fatalf("オープン失敗、エラー:%v", err)
        }
    
        // 開始時刻を記録します。
        startTick := time.Now().UnixNano() / 1000 / 1000
    
        // 読み取り速度をテストするために使用されるファイルの内容を読み取って破棄します。
        written, err := io.Copy(io.Discard, f)
    
        // 終了時刻を記録します。
        endTick := time.Now().UnixNano() / 1000 / 1000
    
        if err != nil {
            log.Fatalf("コピー失敗、エラー:%v", err)
        }
    
        // 読み取り速度を計算します。単位: MiB/s。
        speed := float64(written/1024/1024) / float64((endTick-startTick)/1000)
    
        // 平均読み取り速度を表示します。
        fmt.Printf("平均速度:%.2f(MiB/s)\n", speed)
    }
  3. テストプログラムを開始します。

    go run down_object.go -bucket yourbucket -endpoint oss-cn-hangzhou-internal.aliyuncs.com  -object 100GB.file -region cn-hangzhou -chunk-size 419430400 -prefetch-num 256

テストの結論

前述のプロセスでは、同時実行性とチャンクサイズを調整して、ダウンロード期間とピークダウンロード帯域幅の変化を観察します。一般に、同時実行性をコア数の 1 ~ 4 倍に設定し、チャンクサイズを FileSize/Concurrency 値に設定することをお勧めします。チャンクサイズは 2 MB 以上にする必要があります。パラメータ構成に基づいて最短のダウンロード期間を達成でき、ピークダウンロード帯域幅は 100 Gbit/s に達します。

番号

同時実行性

チャンクサイズ (MB)

ピーク帯域幅 (Gbit/s)

E2E (秒)

1

128

800

100

16.321

2

256

400

100

14.881

3

512

200

100

15.349

4

1024

100

100

19.129

一般的なツールを使用して同時ダウンロードを最適化する

次のセクションでは、一般的なツールを使用して OSS オブジェクトのダウンロードパフォーマンスを最適化する方法について説明します。

ossutil

  • パラメータの説明

    パラメータ

    説明

    --bigfile-threshold

    再開可能なダウンロードを使用するためのオブジェクトサイズしきい値。デフォルト値: 104857600 ( 100 MB )。有効な値: 0 ~ 9223372036854775807。単位: バイト。

    --range

    ダウンロードするオブジェクトのバイト範囲。バイトは 0 から番号が付けられます。

    • 範囲を指定できます。たとえば、3-9 はバイト 3 からバイト 9 までの範囲を示し、バイト 3 とバイト 9 が含まれます。

    • ダウンロードの開始範囲を指定できます。たとえば、3- はバイト 3 からオブジェクトの末尾までの範囲を示し、バイト 3 が含まれます。

    • ダウンロードの終了範囲を指定できます。たとえば、-9 はバイト 0 からバイト 9 までの範囲を示し、バイト 9 が含まれます。

    --parallel

    単一オブジェクトに対して実行する同時操作の数。有効な値: 1 ~ 10000。デフォルトでは、ossutil は操作タイプとオブジェクトサイズに基づいてこのオプションの値を自動的に設定します。

    --part-size

    パートサイズ。単位: バイト。有効な値: 2097152 ~ 16777216 ( 2 ~ 16 MB )。ほとんどの場合、CPU コアの数が多い場合は、小さなパートサイズを設定できます。CPU コアの数が少ない場合は、パートサイズを適切に増やすことができます。

  • 次のコマンドを実行して、同時実行性を 256 に設定し、パートサイズを 468435456 に設定して、宛先バケットから 100GB.file オブジェクトを /dev/shm ディレクトリにダウンロードし、ダウンロード期間を記録します。

    time ossutil --parallel=256 --part-size=468435456 --endpoint=oss-cn-hangzhou-internal.aliyuncs.com cp oss://cache-test/EcsTest/100GB.file /dev/shm/100GB.file
  • パフォーマンスの説明

    平均エンドツーエンド速度は 2.94 GB/s (約 24 Gbit/s ) です。

    image

ossfs

  • パラメータの説明

    パラメータ

    説明

    parallel_count

    マルチパートアップロードを使用して大きなオブジェクトをアップロードする場合に同時にダウンロードできるパートの数。デフォルト値: 5。

    multipart_size

    マルチパートアップロードを使用してデータをアップロードする場合のパートサイズ ( MB 単位)。デフォルト値: 10。このパラメータは、アップロードできるオブジェクトの最大サイズを制限します。マルチパートアップロードを使用する場合、オブジェクトを分割できるパートの最大数は 10,000 です。デフォルトでは、アップロードできるオブジェクトの最大サイズは 100 GB です。このオプションの値を変更して、より大きなオブジェクトをアップロードできます。

    direct_read

    ダイレクトリードモードを有効にします。デフォルトでは、ossfs はディスクストレージ容量を使用して、アップロードまたはダウンロードされた一時データを保存します。このオプションを指定すると、ローカルディスクではなく OSS から直接データを読み取ることができます。このオプションはデフォルトで無効になっています。-odirect_read を使用して、ダイレクトリードモードを有効にできます。

    説明

    読み取られているオブジェクトに対して書き込み、名前変更、または切り捨て操作が実行されると、ダイレクトリードは中断されます。この場合、オブジェクトはダイレクトリードモードを終了し、再度開く必要があります。

    direct_read_prefetch_chunks

    メモリにプリフェッチできるチャンクの数。このオプションを使用して、シーケンシャルリードのパフォーマンスを最適化できます。デフォルト値: 32。

    このオプションは、-odirect_read オプションが指定されている場合にのみ有効になります。

    direct_read_chunk_size

    単一の読み取りリクエストで OSS から直接読み取ることができるデータ量。単位: MB。デフォルト値: 4。有効な値: 1 ~ 32。

    このオプションは、-odirect_read オプションが指定されている場合にのみ有効になります。

    ensure_diskfree

    予約済みのディスク容量のサイズ。ディスク容量が完全に占有され、他のアプリケーションがデータの書き込みに影響を与えるのを防ぐために使用されます。デフォルトでは、ディスク容量は予約されていません。単位: MB。

    たとえば、ossfs 予約ディスク容量を 1024 MB に設定する場合は、-oensure_diskfree=1024 を指定できます。

    free_space_ratio

    予約する最小の残りのディスク容量比率。たとえば、ディスク容量が 50 GB で -o free_space_ratio を 20 に設定した場合、10 GB ( 50 GB × 20% = 10 GB ) が予約されます。

    max_stat_cache_size

    メタデータをメタデータキャッシュに保存できるファイルの最大数。デフォルトでは、最大 100,000 オブジェクトのメタデータをキャッシュできます。ディレクトリに多数のオブジェクトが含まれている場合は、このオプションを変更して、Is コマンドのオブジェクト一覧表示パフォーマンスを向上させることができます。メタデータのキャッシュを無効にするには、このオプションを 0 に設定します。

    stat_cache_expire

    オブジェクトメタデータキャッシュの有効期間。単位: 秒。デフォルト値: 900。

    readdir_optimize

    キャッシュの最適化を使用するかどうかを指定します。デフォルト値: false。

    パラメータを指定した場合、ls コマンドを実行するときに、ossfs は HeadObject リクエストを送信して giduid などのオブジェクトメタデータを取得しません。HeadObject リクエストは、アクセスされたオブジェクトのサイズが 0 の場合にのみ送信されます。ただし、権限チェックなどの理由により、特定の数の HeadObject リクエストが送信される場合があります。アプリケーションの特性に基づいてパラメータを指定します。キャッシュの最適化を使用するには、-oreaddir_optimize パラメータを指定します。

  • 説明

    CPU 処理能力とネットワーク帯域幅に基づいてパラメータを変更することをお勧めします。

    • デフォルトの読み取りモード: cache-test という名前のバケットをコンピュータの /mnt/cache-test フォルダにマウントし、同時にダウンロードできるパートの数を 128 に設定し、各パートのサイズを 32 MB に設定します。

      ossfs cache-test /mnt/cache-test -ourl=http://oss-cn-hangzhou-internal.aliyuncs.com  -oparallel_count=128 -omultipart_size=32 
    • ダイレクトリードモード: cache-test という名前のバケットをコンピュータの /mnt/cache-test フォルダにマウントし、ダイレクトリードモードを有効にし、プリフェッチされたチャンクの数を 128 に設定し、各チャンクのサイズを 32 MB に設定します。

      ossfs cache-test /mnt/cache-test -ourl=http://oss-cn-hangzhou-internal.aliyuncs.com  -odirect_read -odirect_read_prefetch_chunks=128 -odirect_read_chunk_size=32
  • パフォーマンスの説明

    デフォルトの読み取りモードでは、ossfs はデータをローカルディスクにダウンロードします。ダイレクトリードモードでは、データはメモリに保存されるため、アクセスが高速化されますが、より多くのメモリが消費されます。

    説明

    ダイレクトリードモードでは、ossfs はダウンロードされたデータをチャンク単位で管理します。各チャンクのサイズはデフォルトで 4 MB で、direct_read_chunk_size パラメータを使用して変更できます。メモリ内では、ossfs は [現在のチャンク - 1、現在のチャンク + direct_read_prefetch_chunks] の範囲内のデータを保持します。メモリサイズ、特にページキャッシュに基づいて、ダイレクトリードモードを使用するかどうかを決定します。ほとんどの場合、ダイレクトリードモードはページキャッシュ容量が不足しているシナリオに適しています。たとえば、コンピュータの合計メモリが 16 GB で、ページキャッシュが 6 GB を消費できる場合、オブジェクトサイズが 6 GB を超えると、ダイレクトリードモードを使用できます。詳細については、「ダイレクトリードモード」をご参照ください。

    モード

    同時実行性

    チャンクサイズ (MB)

    ピーク帯域幅 (Gbit/s)

    E2E 帯域幅 (Gbit/s)

    E2E 期間 (秒)

    デフォルトの読み取りモード

    128

    32

    24

    11.3

    72.01

    ダイレクトリードモード

    128

    32

    24

    16.1

    50.9

    モデルオブジェクト読み取りの最適化:

    モデルオブジェクトサイズ (GB)

    デフォルトの読み取りモード (期間: 秒、最大メモリ: 6 GB)

    ハイブリッド読み取りモード (期間: 秒)

    ハイブリッド読み取りモード (期間: 秒、データ保持: [-32、+32])

    1

    8.19

    8.20

    8.56

    2.4

    24.5

    20.43

    20.02

    5

    26.5

    22.3

    19.89

    5.5

    22.8

    23.1

    22.98

    8.5

    106.0

    36.6

    36.00

    12.6

    154.6

    42.1

    41.9

Python SDK

AI モデルトレーニングのシナリオでは、OSS SDK for Python はデフォルトでシリアルモードでバックエンドストレージサービスにアクセスします。Python の同時実行ライブラリのマルチスレッド変換を使用することにより、帯域幅が大幅に向上します。

  • 前提条件

    モデルオブジェクトのサイズは約 5.6 GB で、テストマシンの仕様は ECS48vCPU で、帯域幅は 16 Gbit/s、メモリは 180 GB です。

  • import oss2
    import time
    import os
    import threading
    from io import BytesIO
    
    # パラメータを構成します。
    OSS_CONFIG = {
        "bucket_endpoint": os.environ.get('OSS_BUCKET_ENDPOINT', 'oss-cn-hangzhou-internal.aliyuncs.com'), # リージョンのデフォルトエンドポイント (バケットが配置されているリージョン)。
        "bucket_name": os.environ.get('OSS_BUCKET_NAME', 'bucket_name'), # バケットの名前。
        "access_key_id": os.environ['ACCESS_KEY_ID'], # RAM ユーザーの AccessKey ID。
        "access_key_secret": os.environ['ACCESS_KEY_SECRET'] # RAM ユーザーの AccessKey シークレット。
    }
    
    # バケットを初期化します。
    def __bucket__():
        auth = oss2.Auth(OSS_CONFIG["access_key_id"], OSS_CONFIG["access_key_secret"])
        return oss2.Bucket(
            auth, 
            OSS_CONFIG["bucket_endpoint"], 
            OSS_CONFIG["bucket_name"], 
            enable_crc=False
        )
    
    # モデルオブジェクトのサイズをクエリします。
    def __get_object_size(object_name):
        simplifiedmeta = __bucket__().get_object_meta(object_name)
        return int(simplifiedmeta.headers['Content-Length'])
    
    # モデルオブジェクトの最終更新時刻をクエリします。
    def get_remote_model_mmtime(model_name):
        return __bucket__().head_object(model_name).last_modified
    
    # モデルオブジェクトを一覧表示します。
    def list_remote_models(ext_filter=('.ckpt',)): # デフォルトの拡張子フィルタを指定します。
        dir_prefix = ""
        output = []
        
        for obj in oss2.ObjectIteratorV2(
            __bucket__(),
            prefix=dir_prefix,
            delimiter='/',
            start_after=dir_prefix,
            fetch_owner=False
        ):
            if not obj.is_prefix():
                _, ext = os.path.splitext(obj.key)
                if ext.lower() in ext_filter:
                    output.append(obj.key)
        return output
    
    # チャンクごとにマルチパートダウンロードスレッド関数をダウンロードします。
    def __range_get(object_name, buffer, offset, start, end, read_chunk_size, progress_callback, total_bytes):
        chunk_size = int(read_chunk_size)
        with __bucket__().get_object(object_name, byte_range=(start, end)) as object_stream:
            s = start
            while True:
                chunk = object_stream.read(chunk_size)
                if not chunk:
                    break
                buffer.seek(s - offset)
                buffer.write(chunk)
                s += len(chunk)
                # ダウンロードされたバイト数を計算し、ダウンロード進捗コールバック関数を呼び出します。
                if progress_callback:
                    progress_callback(s - start, total_bytes)
    
    # モデルオブジェクトを読み取り、オプションの進捗コールバックパラメータを指定します。
    def read_remote_model(
        checkpoint_file, 
        start=0, 
        size=-1, 
        read_chunk_size=2*1024*1024,  # 2MB
        part_size=256*1024*1024,      # 256MB
        progress_callback=None # ダウンロード進捗コールバック。
    ):
        time_start = time.time()
        buffer = BytesIO()
        obj_size = __get_object_size(checkpoint_file)
        
        end = (obj_size if size == -1 else start + size) - 1
        s = start
        tasks = []
    
        # 進捗を計算します。
        total_bytes = end - start + 1
        downloaded_bytes = 0
    
        while s <= end:
            current_end = min(s + part_size - 1, end)
            task = threading.Thread(
                target=__range_get,
                args=(checkpoint_file, buffer, start, s, current_end, read_chunk_size, progress_callback, total_bytes)
            )
            tasks.append(task)
            task.start()
            s += part_size
    
        for task in tasks:
            task.join()
    
        time_end = time.time()
        # オブジェクトの合計ダウンロードを表示します。
        print(f"Downloaded {checkpoint_file} in {time_end - time_start:.2f} seconds.")
    
         # ダウンロードされたオブジェクトのサイズを計算して表示します。単位: GB。
        file_size_gb = obj_size / (1024 * 1024 * 1024)
        print(f"Total downloaded file size: {file_size_gb:.2f} GB")
    
        buffer.seek(0)
        return buffer
    
    # ダウンロード進捗コールバック関数を指定します。
    def show_progress(downloaded, total):
        progress = (downloaded / total) * 100
        print(f"Progress: {progress:.2f}%", end="\r")
    
    # ダウンロード進捗コールバック関数を呼び出します。
    if __name__ == "__main__":
        # list_remote_models メソッドを使用して、モデルオブジェクトを一覧表示します。
        models = list_remote_models()
        print("Remote models:", models)
    
        if models:
            # 最初のモデルオブジェクトをダウンロードします。
            first_model = models[0]
            buffer = read_remote_model(first_model, progress_callback=show_progress)
            print(f"\nDownloaded {first_model} to buffer.")
  • 結論

    バージョン

    OSS 期間 (秒)

    OSS 平均帯域幅 (Mbit/s)

    OSS ピーク帯域幅 (Mbit/s)

    OSS SDK for Python (シリアルモード)

    109

    53

    100

    OSS SDK for Python (同時ダウンロードモード)

    11.1

    516

    600

    前述の結果から、OSS SDK for Python (同時ダウンロードモード) は OSS SDK for Python (シリアルモード) で消費される期間の約 0.2% を消費し、OSS SDK for Python (同時ダウンロードモード) の平均帯域幅とピーク帯域幅はそれぞれ OSS SDK for Python (シリアルモード) の約 9.7 倍と 6 倍です。OSS SDK for Python を使用して AI モデルをトレーニングする場合、同時ダウンロードモードは処理効率と帯域幅パフォーマンスを大幅に向上させることができます。

  • その他のソリューション

    OSS SDK for Python に加えて、Alibaba Cloud は osstorchconnector という名前の Python ライブラリを提供しています。これは主に、PyTorch トレーニングタスクで OSS データに効率的にアクセスして保存するために使用されます。ライブラリは、ユーザー向けに同時ダウンロードの二次カプセル化を完了しています。次の表に、osstorchconnector を使用した AI モデル読み込みのテスト結果を示します。詳細については、「パフォーマンステスト」をご参照ください。

    項目

    説明

    テストシナリオ

    モデルの読み込みとチャット Q&A

    モデル名

    gpt3-finnish-3B

    モデルサイズ

    11 GB

    シナリオ

    チャット Q&A

    ハードウェア構成

    高仕様 ECS インスタンス: 96 vCPU、384 GiB メモリ、30 Gbit/s 内部帯域幅

    結論

    平均帯域幅は約 10 Gbit/s です。OSS は、同時にモデルを読み込む 10 個のタスクをサポートできます。