Deep Learning Containers (DLC) や Data Science Workshop (DSW) などの PAI 製品では、ossfs 2.0 または Alibaba Cloud E-MapReduce の JindoFuse を使用して、Object Storage Service (OSS) のデータソースをコンテナ内の指定されたパスにマウントできます。また、OSS Connector for AI/ML または OSS SDK を使用して OSS データを読み取ることもできます。ユースケースに最適なデータアクセス方法を選択してください。
背景情報
AI 開発では、ソースデータは OSS に保存されることが多く、モデル開発やトレーニングのためにトレーニング環境にダウンロードされます。しかし、この一般的な手法にはいくつかの課題があります。
-
データセットのダウンロードに時間がかかり、GPU がアイドル状態になる可能性があります。
-
トレーニングジョブごとにデータを繰り返しダウンロードする必要があります。
-
ランダムデータサンプリングでは、データセット全体を各トレーニングノードにダウンロードする必要があります。
これらの課題に対処するために、OSS データを読み取る次の方法を検討してください。
|
アクセス方法 |
説明 |
ユースケース |
|
JindoFuse コンポーネントを使用して、OSS データセットをコンテナ内の指定されたパスにマウントし、データの直接的な読み取りと書き込みを可能にします。 |
|
|
|
ossfs 2.0 は、OSS への高性能なマウントアクセスを実現するクライアントです。シーケンシャル読み取りおよび書き込み操作に優れており、OSS の高帯域幅を最大限に活用できます。 |
ossfs 2.0 は、AI トレーニング、推論、ビッグデータ処理、自動運転、その他のコンピューティング集約型ワークロードなど、高性能なストレージアクセスを必要とするシナリオに適しています。これらのワークロードは、主にシーケンシャル読み取りとランダム読み取り、シーケンシャル (追記専用) 書き込みを伴い、完全な POSIX セマンティクスを必要としません。 |
|
|
PAI は AI/ML 向け OSS コネクタを統合しており、PyTorch コード内から OSS のファイルを直接ストリーミングすることで、データアクセスを簡素化および高速化します。主な利点は次のとおりです:
|
このコネクタは、PyTorch トレーニング用のデータセットの読み取りを高速化するための非マウントアクセスに使用します。特に、数百万の小さなファイルを読み取る場合や、高いスループットが必要な場合に有効です。 |
|
|
OSS SDK を使用して OSS からデータをストリーミングします。柔軟で効率的なソリューションを提供し、データリクエスト時間を大幅に短縮してトレーニング効率を向上させます。 |
OSS データへの一時的な非マウントアクセスが必要な場合、またはアプリケーションロジックで OSS へのアクセスタイミングを決定する場合は、OSS Python SDK または OSS Python API を使用します。 |
JindoFuse または ossfs 2.0 を使用して OSS をマウントする場合、OSS アクセス用の RAM ロールを指定することで、よりきめ細かい権限制御を実現できます。また、ワークスペースの全般設定で [OSS Mount Requires RAM Role] を有効にすることもできます。このオプションを有効にすると、次のようになります:
-
DSW、DLC、EAS などの機能で OSS マウントを作成する場合、RAM ロールを選択する必要があります。PAI デフォルトロールは使用できません。
-
OSS マウントを含む高度なデータセットまたは論理データセットを作成する場合も、この設定に基づいて RAM ロールが適用されます。
-
DSW インスタンス、DLC ジョブ、または EAS サービスを作成する場合、RAM ロールとして PAI デフォルトロールを選択することはできません。
JindoFuse
DLC と DSW では、JindoFuse コンポーネントを使用して、OSS データセットまたは OSS パスをコンテナ内の指定されたパスにマウントできます。これにより、トレーニング中に OSS に保存されているデータを直接読み書きできます。
マウント方法
DLC
DLC ジョブを作成する際に、OSS データをマウントできます。次の 2 つのマウントタイプがサポートされています。設定手順の詳細は、「トレーニングジョブの作成」をご参照ください。
データセット セクションと 直接マウント セクションの両方で、[Expand Advanced Configuration] をクリックして詳細なマウントオプションを表示し、[Read-Only] トグルを使用してマウントモードを制御できます。
|
マウントタイプ |
説明 |
|
[データセット] |
[Object Storage Service (OSS)] タイプのデータセットを選択し、マウントパス を設定します。パブリックデータセットの場合、読み取り専用モードのみがサポートされます。 |
|
[直接マウント] |
OSS バケットパスを直接マウントします。 ローカルキャッシュが有効になっている Lingjun インテリジェントコンピューティングリソースクォータを使用する場合は、[Use Cache] スイッチをオンにしてキャッシュを有効にできます。 |
DSW
DSW インスタンスを作成する際に、OSS データをマウントできます。次の 2 つのマウントタイプがサポートされています。設定手順の詳細は、「DSWインスタンスの作成」をご参照ください。
両方のマウントタイプで [Expand Advanced Configuration] オプションが提供されます。ストレージパスのマウント でサポートされるストレージタイプには、OSS、General-purpose NAS、Extreme NAS、CPFS、Intelligent Computing CPFS が含まれます。
|
マウントタイプ |
説明 |
|
[データセットのマウント] |
[Object Storage Service (OSS)] タイプのデータセットを選択し、マウントパス を設定します。パブリックデータセットを使用する場合、読み取り専用モードのみがサポートされます。 |
|
[ストレージパスのマウント] |
OSS バケットパスを直接マウントします。 |
デフォルト設定の制限事項
詳細設定 パラメータを未設定のままにした場合、デフォルト設定が適用されます。デフォルト設定には次の制限があります:
-
OSS ファイルの読み取りを高速化するため、OSS のマウント時にメタデータ (ディレクトリとファイルリスト) がキャッシュされます。
分散トレーニングにおいて、複数のノードが同じディレクトリを作成しようとする場合、メタデータキャッシュにより各ノードが作成を試みる可能性があります。1 つのノードのみが成功し、他のノードはエラーを返します。
-
デフォルトでは、OSS MultiPart API を使用してファイルが作成されます。オブジェクトは、書き込み操作が完了した後にのみ OSS 上で可視になります。
-
同じファイルに対する同時読み書き操作はサポートされていません。
-
ファイルに対するランダム書き込み操作はサポートされていません。
一般的な JindoFuse 設定
ユースケースに応じて、詳細設定で JindoFuse パラメータをカスタマイズすることもできます。
このトピックでは、いくつかの一般的なシナリオに対する JindoFuse 設定の推奨事項を提供します。これらの設定は、すべてのワークロードに対して最適なパフォーマンスを提供するとは限りません。より柔軟な設定オプションについては、「JindoFuse ユーザーガイド」をご参照ください。
クイック読み取り /書き込み: クイック読み取りと書き込みを保証します。 ただし、同時読み取りまたは書き込み中にデータの不整合が発生する可能性があります。 トレーニングデータとモデルをこのモードのマウントパスにマウントできます。 このモードのマウントパスを作業ディレクトリとして使用しないことを推奨します。
{ "fs.oss.download.thread.concurrency": "Twice the number of CPU cores", "fs.oss.upload.thread.concurrency": "Twice the number of CPU cores", "fs.jindo.args": "-oattr_timeout=3 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink" }増分読み取り /書き込み: 増分書き込み中のデータの一貫性を保証します。 元のデータを上書きすると、データの不整合が発生する可能性があります。 読み取り速度はやや遅いです。 このモードを使用して、モデル重みファイルをトレーニングデータ用に保存できます。
{ "fs.oss.upload.thread.concurrency": "Twice the number of CPU cores", "fs.jindo.args": "-oattr_timeout=3 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink" }一貫性のある読み取り /書き込み: 同時読み取りまたは同時書き込み中のデータの一貫性を確保し、高いデータの一貫性が必要で、迅速な読み取りを必要としないシナリオに適しています。 このモードを使用して、プロジェクトのコードを保存できます。
{ "fs.jindo.args": "-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink" }読み取り専用: 読み取りのみを許可します。 このモードを使用して、パブリックデータセットをマウントできます。
{ "fs.oss.download.thread.concurrency": "Twice the number of CPU cores", "fs.jindo.args": "-oro -oattr_timeout=7200 -oentry_timeout=7200 -onegative_timeout=7200 -okernel_cache -ono_symlink" }
その他の一般的な設定操作には次のものがあります:
-
別の JindoFuse バージョンの選択:
{ "fs.jindo.fuse.pod.image.tag": "6.7.0" } -
メタデータキャッシュの無効化:分散トレーニングで、複数のノードが同時に同じディレクトリへ書き込みを試みる場合、キャッシュが原因で一部のノードで書き込み操作が失敗する可能性があります。この問題を解決するには、JindoFuse コマンドラインに
-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0引数を追加します。{ "fs.jindo.args": "-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0" } -
アップロード/ダウンロードのスレッド数の調整:次のパラメータを使用してスレッド数を調整できます。
{ "fs.oss.upload.thread.concurrency": "32", "fs.oss.download.thread.concurrency": "32", "fs.oss.read.readahead.buffer.count": "64", "fs.oss.read.readahead.buffer.size": "4194304" } -
AppendObjectによる書き込み:マウント上にローカルで作成されたすべてのファイルは、
AppendObjectAPI を呼び出すことによって OSS 内のオブジェクトとして作成されます。AppendObject を使用して作成されたオブジェクトのサイズは 5 GB を超えることはできません。使用制限の詳細については、「AppendObject」をご参照ください。次に設定例を示します:{ "fs.jindo.args": "-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0", "fs.oss.append.enable": "true", "fs.oss.flush.interval.millisecond": "1000", "fs.oss.read.readahead.buffer.size": "4194304", "fs.oss.write.buffer.size": "262144" } -
OSS-HDFS のマウント:OSS-HDFS を有効にする方法については、「OSS-HDFS サービスとは」をご参照ください。分散トレーニングシナリオでは、次のパラメータを追加することを推奨します。
{ "fs.jindo.args": "-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0 -ono_symlink -ono_xattr -ono_flock -odirect_io", "fs.oss.flush.interval.millisecond": "10000", "fs.oss.randomwrite.sync.interval.millisecond": "10000" } -
メモリリソースの設定:
fs.jindo.fuse.pod.mem.limitパラメータを設定して、メモリ制限を調整できます。次にコード例を示します:{ "fs.jindo.fuse.pod.mem.limit": "10Gi" }
ossfs 2.0
ossfs を使用して OSS データソースをマウントするには、[詳細設定] で {"mountType":"ossfs"} を設定します。
マウント方法
DLC での OSS のマウント
DLC ジョブを作成する際に、OSS データをマウントできます。DLC は、次の 2 つのマウントタイプをサポートしています。設定の詳細については、「トレーニングジョブの作成」をご参照ください。
|
マウントタイプ |
説明 |
|
データセット |
Object Storage Service (OSS) データセットを選択し、マウントパス を設定します。パブリックデータセットは読み取り専用モードのみをサポートします。 |
|
直接マウント |
OSS バケットストレージパスを直接マウントします。 ローカルキャッシュが有効な Lingjun リソースクォータを使用している場合は、[キャッシュを使用] をオンにできます。 |
DSW での OSS のマウント
DSW インスタンスを作成する際に、OSS データをマウントできます。DSW は、次の 2 つのマウントタイプをサポートしています。設定の詳細については、「DSW インスタンスの作成」をご参照ください。
|
マウントタイプ |
説明 |
|
データセットのマウント |
Object Storage Service (OSS) データセットを選択し、マウントパス を設定します。パブリックデータセットは読み取り専用モードのみをサポートします。 |
|
ストレージパスのマウント |
OSS バケットストレージパスを直接マウントします。 |
一般的な ossfs 設定
[詳細設定] では、fs.ossfs.args を使用して詳細パラメーターを設定できます。複数のパラメーターはカンマ (,) で区切ります。これらのパラメーターの詳細については、「ossfs 2.0」をご参照ください。以下に、いくつかの一般的なユースケースを示します。
-
ジョブ中の静的データソース:ジョブ中に変更されないファイルについては、キャッシュのタイムアウトを長く設定してメタデータリクエストを削減します。一般的なユースケースは、既存ファイルの一括読み取りと、処理後の新しいファイルセットの生成です。
{ "mountType":"ossfs", "fs.ossfs.args": "-oattr_timeout=7200" } -
高速読み書き:メタデータキャッシュのタイムアウトを短くして、キャッシュ効率とデータの鮮度のバランスを取ります。
{ "mountType":"ossfs", "fs.ossfs.args": "-oattr_timeout=3, -onegative_timeout=0" } -
分散ジョブのための一貫性のある読み書き:デフォルトでは、ossfs はメタデータキャッシュに基づいてファイルデータを更新します。複数のノード間で一貫したビューを確保するには、次の設定を使用します。
{ "mountType":"ossfs", "fs.ossfs.args": "-onegative_timeout=0, -oclose_to_open" } -
DLC または DSW でのファイル開きすぎによるメモリ不足 (OOM):DLC と DSW でジョブの並行性が高いと、多数のファイルが同時に開かれ、メモリ不足 (OOM) の問題が発生する可能性があります。次の設定は、メモリプレッシャーを軽減するのに役立ちます。
{ "mountType":"ossfs", "fs.ossfs.args": "-oreaddirplus=false, -oinode_cache_eviction_threshold=300000" } -
大きなファイルの書き込み失敗:
-oupload_buffer_sizeは、マルチパートアップロードのバッファサイズ (バイト単位) を設定します。このパラメーターは、書き込み可能な最大ファイルサイズを決定し、upload_buffer_size * 10000として計算されます。デフォルトでは、ossfs 2.0 は 8 MiB のパートサイズを使用し、書き込み可能な最大ファイルサイズは 78.125 GiB に制限されます。この制限を超えるファイルを書き込むと、操作は失敗します。サポートされる最大ファイルサイズを増やすには、
-oupload_buffer_sizeオプションを設定してパートサイズを大きくします。たとえば、パートサイズを 32 MiB (33,554,432 バイト) に設定すると、最大ファイルサイズは 312.5 GiB になります。-oupload_buffer_sizeを大きくすると、より多くのメモリが消費されることに注意してください。-total_mem_limitを設定することで、メモリ使用量を制御できます。詳細については、「マウントオプション」をご参照ください。{ "mountType":"ossfs", "fs.ossfs.args": "-oupload_buffer_size=33554432" }
OSS Connector for AI/ML
OSS Connector for AI/ML は、Alibaba Cloud OSS チームが提供する AI および機械学習ワークロード向けのクライアントライブラリです。大規模な PyTorch トレーニングのデータ読み込みを簡素化し、データ転送の時間と複雑さを軽減し、データ読み込みのボトルネックを解消することでモデルトレーニングを高速化します。データアクセスを効率化するため、PAI プラットフォームは OSS Connector for AI/ML を統合しており、PyTorch コード内で OSS から直接データをストリーミングして効率的なデータ読み込みを実現できます。
制限事項
-
公式イメージ:OSS Connector for AI/ML は、PyTorch 2.0 以降の公式イメージを使用する DLC ジョブおよび DSW インスタンスでのみ利用可能です。
-
カスタムイメージ:PyTorch 2.0 以降のみがサポートされています。サポートされているバージョンを使用するカスタムイメージの場合は、次のコマンドを実行して OSS Connector for AI/ML をインストールしてください:
pip install -i http://yum.tbsite.net/aliyun-pypi/simple/ --extra-index-url http://yum.tbsite.net/pypi/simple/ --trusted-host=yum.tbsite.net osstorchconnector -
Python バージョン:Python 3.8–3.12 のみがサポートされています。
前提条件
-
認証情報ファイルを設定してください。
認証情報は、次のいずれかの方法で設定できます:
-
DLC ジョブの OSS へのパスワードなしアクセスを設定してください。詳細については、「DLC RAM ロールの設定」をご参照ください。この方法では、DLC ジョブは STS から一時的な認証情報を取得して OSS や他のクラウドリソースに安全にアクセスするため、明示的な認証情報が不要になり、アクセスキーの漏洩リスクを軽減します。
-
コードプロジェクトに認証情報ファイルを設定して、認証情報を管理します。次のコードは設定例です:
説明アクセスキー情報を平文で保存すると、セキュリティリスクが生じます。RAM ロールを使用して、DLC インスタンス内で認証情報を自動的に設定することを推奨します。詳細については、「DLC RAM ロールの設定」をご参照ください。
OSS Connector for AI/ML を使用する際、認証情報ファイルのパスを指定して、OSS データリクエストの署名に必要な認証情報を自動的に取得できます。
{ "AccessKeyId": "<Access-key-id>", "AccessKeySecret": "<Access-key-secret>", "SecurityToken": "<Security-Token>", "Expiration": "2024-08-20T00:00:00Z" }次の表で各フィールドについて説明します。
パラメータ
必須
説明
例
AccessKeyId
はい
Alibaba Cloud アカウントまたは RAM ユーザーのアクセスキー ID とアクセスキーシークレット。
説明STS からの一時的な認証情報を使用して OSS にアクセスする場合、これらのパラメータを一時的なアクセスキー ID とアクセスキーシークレットに設定してください。
NTS****
AccessKeySecret
はい
7NR2****
SecurityToken
いいえ
STS からのセキュリティトークン。このパラメータは、STS からの一時的な認証情報を使用して OSS にアクセスする場合にのみ必要です。
STS.6MC2****
Expiration
いいえ
認証情報の有効期限。このフィールドが空の場合、認証情報は期限切れになりません。認証情報が期限切れになると、OSS Connector for AI/ML は認証情報ファイルを再読み込みします。
2024-08-20T00:00:00Z
-
-
config.jsonファイルを設定してください。次のコードは設定例です:このファイルは、同時実行レベル、プリフェッチパラメータ、ログファイルの場所など、プロジェクトの設定を管理するために使用します。OSS Connector for AI/ML を使用する際に、この
config.jsonファイルのパスを指定すると、コネクタは設定を自動的に適用し、OSS データリクエストに関連するログを指定のログファイルに書き込みます。{ "logLevel": 1, "logPath": "/var/log/oss-connector/connector.log", "auditPath": "/var/log/oss-connector/audit.log", "datasetConfig": { "prefetchConcurrency": 24, "prefetchWorker": 2 }, "checkpointConfig": { "prefetchConcurrency": 24, "prefetchWorker": 4, "uploadConcurrency": 64 } }次の表で各フィールドについて説明します。
パラメータ
必須
説明
例
logLevel
はい
ログレベル。デフォルト値は 1 (INFO) です。有効な値:
-
0: DEBUG
-
1: INFO
-
2: WARN
-
3: ERROR
1
logPath
はい
コネクタのログパス。デフォルトパスは
/var/log/oss-connector/connector.logです。/var/log/oss-connector/connector.log
auditPath
はい
コネクタ I/O の監査ログパス。監査ログは、100 ミリ秒を超えるレイテンシーの読み書きリクエストを記録します。デフォルトパスは
/var/log/oss-connector/audit.logです。/var/log/oss-connector/audit.log
DatasetConfig
prefetchConcurrency
はい
データセットを使用する際に、OSS からデータをプリフェッチするための同時タスク数。デフォルト値は 24 です。
24
prefetchWorker
はい
データセットを使用する際に、OSS からデータをプリフェッチするために利用可能な vCPU 数。デフォルト値は 2 です。
2
checkpointConfig
prefetchConcurrency
はい
チェックポイント読み取り中に OSS からデータをプリフェッチするための同時タスク数。デフォルト値は 24 です。
24
prefetchWorker
はい
チェックポイント読み取り中に OSS からデータをプリフェッチするために利用可能な vCPU 数。デフォルト値は 4 です。
4
uploadConcurrency
はい
チェックポイント書き込み中にデータをアップロードするための同時タスク数。デフォルト値は 64 です。
64
-
使用方法
OSS Connector for AI/ML は、PyTorch の Dataset および IterableDataset インターフェースをそれぞれ拡張した、OssMapDataset と OssIterableDataset という 2 つのデータセットアクセスインターフェースを提供します。OssIterableDataset は、より高いトレーニング効率のためにプリフェッチで最適化されています。OssMapDataset のデータ読み取り順序は DataLoader によって決定され、シャッフル操作をサポートします。次の推奨事項に基づいて、データセットアクセスインターフェースを選択できます:
-
メモリが限られており、データセットが大規模で、並列度が低いシーケンシャル読み取りのみが必要な場合は、
OssIterableDatasetを使用します。 -
メモリが十分にあり、データセットが比較的小さく、ランダムアクセスと並列処理が必要な場合は、
OssMapDatasetを使用します。
OSS Connector for AI/ML は、モデルの読み込みと保存のための OssCheckpoint インターフェースも提供します。現在、OssCheckpoint 機能は汎用コンピューティングリソース環境でのみ利用可能です。
以下のセクションでは、これら 3 つのインターフェースの使用方法について説明します。
OssMapDataset
次の3つのデータセットアクセス方法をサポートしています:
-
OSS パスプレフィックスによるフォルダーへのアクセス
インデックスファイルを設定する必要なく、フォルダー名のみを指定できるため、メンテナンスとスケーラビリティを簡素化できます。OSS フォルダーが次のように構成されている場合は、この方法を使用してください:
dataset_folder/ ├── class1/ │ ├── image1.JPEG │ └── ... ├── class2/ │ ├── image2.JPEG │ └── ...この方法を使用する場合、OSS パスプレフィックスを指定し、ファイルストリームを解析するためのカスタムメソッドを定義する必要があります。次の例は、画像ファイルを解析して変換する方法を示しています:
def read_and_transform(data): normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) transform = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), normalize, ]) try: img = accimage.Image((data.read())) val = transform(img) label = data.label # ファイル名 except Exception as e: print("read failed", e) return None, 0 return val, label dataset = OssMapDataset.from_prefix("{oss_data_folder_uri}", endpoint="{oss_endpoint}", transform=read_and_transform, cred_path=cred_path, config_path=config_path) -
マニフェストファイルからのファイルへのアクセス
この方法では、複数の OSS バケットからデータにアクセスでき、より柔軟なデータ管理が可能です。OSS フォルダーが次のように構成されており、ファイル名をラベルにマッピングするマニフェストファイルがある場合は、この方法を使用してください。
dataset_folder/ ├── class1/ │ ├── image1.JPEG │ └── ... ├── class2/ │ ├── image2.JPEG │ └── ... └── .manifestマニフェストファイルは次の形式です:
{'data': {'source': 'oss://examplebucket.oss-cn-wulanchabu.aliyuncs.com/dataset_folder/class1/image1.JPEG'}} {'data': {'source': ''}}この方法を使用する場合、マニフェストファイルを解析するためのカスタムメソッドを定義する必要があります。次のコードは例です:
def transform_oss_path(input_path): pattern = r'oss://(.*?)\.(.*?)/(.*)' match = re.match(pattern, input_path) if match: return f'oss://{match.group(1)}/{match.group(3)}' else: return input_path def manifest_parser(reader: io.IOBase) -> Iterable[Tuple[str, str]]: lines = reader.read().decode("utf-8").strip().split("\n") data_list = [] for i, line in enumerate(lines): data = json.loads(line) yield transform_oss_path(data["data"]["source"]), "" dataset = OssMapDataset.from_manifest_file("{manifest_file_path}", manifest_parser, "", endpoint=endpoint, transform=read_and_transform, cred_path=cred_path, config_path=config_path) -
OSS URI のリストからのファイルへのアクセス
インデックスファイルを設定することなく、OSS URI を指定して OSS ファイルにアクセスできます。次のコードは例です:
uris =["oss://examplebucket.oss-cn-wulanchabu.aliyuncs.com/dataset_folder/class1/image1.JPEG", "oss://examplebucket.oss-cn-wulanchabu.aliyuncs.com/dataset_folder/class2/image2.JPEG"] dataset = OssMapDataset.from_objects(uris, endpoint=endpoint, transform=read_and_transform, cred_path=cred_path, config_path=config_path)
OssIterableDataset
OssIterableDataset は、OssMapDataset と同じ 3 つのデータセットアクセス方法をサポートしています。次の例は、これら 3 つの方法の使用方法を示しています:
-
OSS パスプレフィックスによるフォルダーへのアクセス
dataset = OssIterableDataset.from_prefix("{oss_data_folder_uri}", endpoint="{oss_endpoint}", transform=read_and_transform, cred_path=cred_path, config_path=config_path) -
マニフェストファイルからのファイルへのアクセス
dataset = OssIterableDataset.from_manifest_file("{manifest_file_path}", manifest_parser, "", endpoint=endpoint, transform=read_and_transform, cred_path=cred_path, config_path=config_path) -
OSS URI のリストからのファイルへのアクセス
dataset = OssIterableDataset.from_objects(uris, endpoint=endpoint, transform=read_and_transform, cred_path=cred_path, config_path=config_path)
OssCheckpoint
現在、OssCheckpoint 機能は汎用コンピューティングリソース環境でのみ利用可能です。OssCheckpoint インターフェースを使用して、OSS 内のモデルファイルにアクセスして保存できます。次のコードは、インターフェースの使用方法を示しています:
checkpoint = OssCheckpoint(endpoint="{oss_endpoint}", cred_path=cred_path, config_path=config_path)
checkpoint_read_uri = "{checkpoint_path}"
checkpoint_write_uri = "{checkpoint_path}"
with checkpoint.reader(checkpoint_read_uri) as reader:
state_dict = torch.load(reader)
model.load_state_dict(state_dict)
with checkpoint.writer(checkpoint_write_uri) as writer:
torch.save(model.state_dict(), writer)
コード例
次のコードは、OSS Connector for AI/ML を使用して OSS データにアクセスする方法の完全な例です:
from osstorchconnector import OssMapDataset, OssCheckpoint
import torchvision.transforms as transforms
import accimage
import torchvision.models as models
import torch
# DLC ジョブまたは DSW インスタンスに RAM ロールを設定した後のデフォルトの認証情報パス。
cred_path = "/mnt/.alibabacloud/credentials"
config_path = "config.json"
checkpoint = OssCheckpoint(endpoint="{oss_endpoint}", cred_path=cred_path, config_path=config_path)
model = models.__dict__["resnet18"]()
epochs = 100 # エポック数を指定します。
checkpoint_read_uri = "{checkpoint_path}"
checkpoint_write_uri = "{checkpoint_path}"
with checkpoint.reader(checkpoint_read_uri) as reader:
state_dict = torch.load(reader)
model.load_state_dict(state_dict)
def read_and_transform(data):
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
transform = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
normalize,
])
try:
img = accimage.Image((data.read()))
val = transform(img)
label = data.label # ファイル名
except Exception as e:
print("read failed", e)
return None, 0
return val, label
dataset = OssMapDataset.from_prefix("{oss_data_folder_uri}", endpoint="{oss_endpoint}", transform=read_and_transform, cred_path=cred_path, config_path=config_path)
data_loader = torch.utils.data.DataLoader(
dataset, batch_size="{batch_size}", num_workers="{num_workers}", pin_memory=True)
for epoch in range(epochs):
for step, (images, target) in enumerate(data_loader):
# バッチ処理
# モデルトレーニング
# モデルの保存
with checkpoint.writer(checkpoint_write_uri) as writer:
torch.save(model.state_dict(), writer)
この例の要点:
-
OssMapDatasetを使用して、指定された OSS URI から直接データセットを構築し、標準的な PyTorch のDataLoaderパターンに従います。 -
このデータセットを使用して標準的な PyTorch の
DataLoaderを作成し、通常のトレーニングループを実行して各バッチを処理し、モデルをトレーニングし、チェックポイントを保存します。 -
これによりオンデマンド読み込みが可能になり、コンテナ環境にデータセットをマウントしたり、事前にローカルストレージにダウンロードしたりする必要がなくなります。
OSS SDK
OSS Python SDK
OSS Python SDK を使用して、OSS からデータを読み取り、OSS にデータを書き込みます。
-
OSS Python SDK をインストールします。詳細については、「インストール (Python SDK V1)」をご参照ください。
-
OSS Python SDK のアクセス認証情報を設定します。詳細については、「アクセス認証情報の設定 (Python SDK V1)」をご参照ください。
-
OSS のデータを読み書きします。
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 環境変数から RAM ユーザーのアクセスキーを使用してアクセス認証情報を設定します。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) bucket = oss2.Bucket(auth, '<Endpoint>', '<your_bucket_name>') # ファイル全体を読み取ります。 result = bucket.get_object('<your_file_path/your_file>') print(result.read()) # 範囲を指定してデータを読み取ります。 result = bucket.get_object('<your_file_path/your_file>', byte_range=(0, 99)) # OSS にデータを書き込みます。 bucket.put_object('<your_file_path/your_file>', '<your_object_content>') # 追加可能ファイルにデータを追加します。 result = bucket.append_object('<your_file_path/your_file>', 0, '<your_object_content>') result = bucket.append_object('<your_file_path/your_file>', result.next_position, '<your_object_content>')必要に応じて次のパラメーターを変更します。
パラメーター
説明
<Endpoint>
バケットのリージョンのエンドポイント。たとえば、China (Hangzhou) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。エンドポイントの取得方法の詳細については、「リージョンとエンドポイント」をご参照ください。
<your_bucket_name>
バケットの名前。
<your_file_path/your_file>
読み取りまたは書き込むファイルのパス。オブジェクトの完全なパスを指定しますが、バケット名は含めません。たとえば、
testfolder/exampleobject.txtのように指定します。<your_object_content>
書き込みまたは追加するコンテンツ。必要に応じて置き換えてください。
OSS Python API
OSS Python API を使用して、トレーニングデータとモデルを OSS に簡単に保存できます。開始する前に、OSS Python SDK がインストールされており、アクセス認証情報が設定されていることを確認してください。詳細については、「インストール (Python SDK V1)」および「アクセス認証情報の設定 (Python SDK V1)」をご参照ください。
-
トレーニングデータの読み込み
データを OSS バケットに保存し、データパスと対応するラベルを同じバケット内のインデックスファイルに保存できます。カスタムデータセットを作成することで、PyTorch の
DataLoaderAPI を使用して、複数のプロセスで並列にデータを読み取ることができます。以下にコード例を示します。import io import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider from PIL import Image import torch class OSSDataset(torch.utils.data.dataset.Dataset): def __init__(self, endpoint, bucket, auth, index_file): self._bucket = oss2.Bucket(auth, endpoint, bucket) self._indices = self._bucket.get_object(index_file).read().split(',') def __len__(self): return len(self._indices) def __getitem__(self, index): img_path, label = self._indices[index].strip().split(':') img_str = self._bucket.get_object(img_path) img_buf = io.BytesIO() img_buf.write(img_str.read()) img_buf.seek(0) img = Image.open(img_buf).convert('RGB') img_buf.close() return img, label # 環境変数からアクセス認証情報を取得します。このコードサンプルを実行する前に、 # OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) dataset = OSSDataset(endpoint, bucket, auth, index_file) data_loader = torch.utils.data.DataLoader( dataset, batch_size=batch_size, num_workers=num_loaders, pin_memory=True)次の表で、主要なパラメーターについて説明します。
パラメーター
説明
endpoint
バケットのリージョンのエンドポイント。たとえば、China (Hangzhou) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。エンドポイントの取得方法の詳細については、「リージョンとエンドポイント」をご参照ください。
bucket
バケットの名前。
index_file
インデックスファイルのパス。
説明この例のインデックスファイルでは、カンマ (,) で各サンプルを区切り、コロン (:) でサンプルパスとラベルを区切ります。
-
モデルの保存または読み込み
OSS Python API を使用して、PyTorch モデルを保存または読み込みます。PyTorch でモデルを保存および読み込む方法の詳細については、「PyTorch」をご参照ください。以下にコード例を示します。
-
モデルの保存
from io import BytesIO import torch import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # bucket_name bucket_name = "<your_bucket_name>" bucket = oss2.Bucket(auth, endpoint, bucket_name) buffer = BytesIO() torch.save(model.state_dict(), buffer) bucket.put_object("<your_model_path>", buffer.getvalue())各項目の説明:
-
endpoint は、バケットのリージョンのエンドポイントです。たとえば、China (Hangzhou) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
-
<your_bucket_name> は、oss:// プレフィックスを除いた OSS バケットの名前です。
-
<your_model_path> は、モデルのパスです。必要に応じて置き換えてください。
-
-
モデルの読み込み
from io import BytesIO import torch import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) bucket_name = "<your_bucket_name>" bucket = oss2.Bucket(auth, endpoint, bucket_name) buffer = BytesIO(bucket.get_object("<your_model_path>").read()) model.load_state_dict(torch.load(buffer))各項目の説明:
-
endpoint は、バケットのリージョンのエンドポイントです。たとえば、China (Hangzhou) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
-
<your_bucket_name> は、oss:// プレフィックスを除いた OSS バケットの名前です。
-
<your_model_path> は、モデルのパスです。必要に応じて置き換えてください。
-
-