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

Platform For AI:OSS の使用

最終更新日:Mar 28, 2026

Platform for AI (PAI) サービス(例:Deep Learning Containers (DLC)、Data Science Workshop (DSW))では、ossfs 2.0 クライアントまたは Alibaba Cloud EMR が提供する JindoFuse コンポーネントを使用して、Object Storage Service (OSS) データソースをコンテナ内の指定パスにマウントできます。また、OSS Connector for AI/ML や OSS ソフトウェア開発キット(SDK)を用いて OSS データを読み取ることも可能です。ご利用のシナリオに応じて、適切な OSS データ読み取り方法を選択してください。

背景情報

人工知能(AI)開発においては、ソースデータが通常 Object Storage Service (OSS) に格納され、その後トレーニング環境にダウンロードされてモデル開発およびトレーニングが実行されます。しかし、この方法には以下のような課題があります:

  • データセットのダウンロードに時間がかかるため、GPU がアイドル状態になる。

  • 各トレーニングタスクごとにデータを再ダウンロードする必要がある。

  • ランダムなデータサンプリングを行う場合、各トレーニングノードにデータセット全体をダウンロードする必要がある。

これらの課題を解決するため、OSS からのデータ読み取りに関する以下の推奨事項をご検討ください:

OSS データ読み取り方法

説明

推奨される利用シーン

JindoFuse

JindoFuse コンポーネントを使用すると、OSS データセットをコンテナ内の指定パスにマウントできます。これにより、データの読み取りおよび書き込みを直接実行できます。

  • OSS データをローカルデータセットのように扱いたい場合、およびデータセットが比較的小規模で、JindoFuse のローカルキャッシュによる高速化効果を十分に享受できる場合。

  • 使用中のフレームワークが PyTorch でない場合。

  • OSS にデータを書き込む必要があります。

ossfs 2.0

ossfs 2.0 は、OSS をローカルファイルシステムとしてマウントすることで、OSS への高性能アクセスを実現するクライアントです。優れた順次読み取りおよび書き込み性能を提供し、OSS の高帯域幅を最大限に活用します。

ossfs 2.0 は、AI トレーニング、推論、ビッグデータ処理、自動運転など、コンピューティング集約型ワークロードにおける高性能ストレージアクセスを必要とするシナリオに適しています。これらのワークロードでは、主に順次およびランダムな読み取り、および順次(追記専用)書き込みが行われ、完全な POSIX セマンティクスは不要です。

OSS Connector for AI/ML

PAI は OSS Connector for AI/ML を統合しており、PyTorch コード内から OSS ファイルをストリーミング方式で直接読み取ることができます。この方法は、シンプルかつ効率的なデータ読み取りを実現し、以下の利点があります:

  • ストリーミング読み込み:トレーニング環境へのダウンロードを経ずにデータを直接ストリーミングできます。これにより GPU のアイドル時間とコストを削減できます。

  • PyTorch ネイティブインターフェイス:このコネクタは PyTorch の Dataset インターフェイスと互換性があり、使いやすくなっています。また、OSS SDK と比較してカプセル化がより高度であるため、カスタマイズおよび変更が容易です。

  • 効率的な読み取り:このコネクタは高性能データ読み取り向けに最適化されており、標準の OSS SDK よりも効率的なデータ読み込みを実現します。

この方法では、マウントを行わずに OSS データの読み取りおよび書き込みが可能です。PyTorch を用いたトレーニング、数百万件の小規模ファイルの読み取り、および高スループット要件がある場合に推奨されます。OSS Connector for AI/ML は、このようなシナリオにおいてデータセット読み取りを大幅に高速化できます。

OSS SDK

OSS2 を使用して OSS からデータをストリーミングできます。OSS2 は柔軟かつ効率的なソリューションであり、データ要求のレイテンシを大幅に短縮し、トレーニング効率を向上させます。

マウントを行わず一時的に OSS データにアクセスする場合、またはビジネスロジックに基づいてプログラム的にデータアクセスを制御する場合に適しています。このような場合は、OSS Python SDK または OSS Python API を使用します。

JindoFuse

DLC および DSW では、JindoFuse コンポーネントを使用して、OSS データセットまたは OSS パスをコンテナ内の指定パスにマウントできます。これにより、トレーニング中に OSS に格納されたデータを直接読み取りおよび書き込みできます。

マウント方法

DLC での OSS のマウント

DLC ジョブの作成時に OSS データセットをマウントできます。サポートされるマウントタイプは 2 種類です。設定方法の詳細については、「トレーニングジョブの作成」をご参照ください。

image

マウントタイプ

説明

データセット

Object Storage Service (OSS) 型のデータセットを選択し、マウントパス を設定します。パブリックデータセットを使用する場合は、読み取り専用マウントモードのみがサポートされます。

ダイレクトマウント

OSS バケットのストレージパスを直接マウントします。

ローカルキャッシュが有効な Lingjun リソースクォータを使用する場合、キャッシュの使用 スイッチをオンにしてキャッシュ機能を有効化できます。

DSW での OSS のマウント

DSW インスタンスの作成時に OSS データセットをマウントできます。サポートされるマウントタイプは 2 種類です。設定方法の詳細については、「DSW インスタンスの作成」をご参照ください。

image

マウントタイプ

説明

データセットのマウント

Object Storage Service (OSS) 型のデータセットを選択し、マウントパス を設定します。パブリックデータセットは読み取り専用モードでのみマウントできます。

ストレージパスのマウント

OSS バケットのストレージパスを直接マウントします。

デフォルト設定の制限事項

詳細設定 パラメーターが空の場合、デフォルト設定が適用されます。デフォルト設定には以下の制限があります:

  • OSS ファイルの高速読み取りを実現するため、OSS のマウント時にディレクトリおよびファイル一覧などのメタデータがキャッシュされます。

    分散タスクにおいて、複数のノードが同一ディレクトリの作成および存在確認を試行する場合、メタデータキャッシュにより各ノードが独立して作成を試行します。その結果、1 つのノードのみがディレクトリ作成に成功し、他のノードはエラーを報告します。

  • デフォルトでは、OSS のマルチパート API を使用してファイルを作成します。ファイルの書き込み中は、OSS 上でオブジェクトは非表示になります。すべての書き込み操作が完了した後、OSS ページ上でオブジェクトを確認できます。

  • ファイルの同時書き込みおよび読み取り操作はサポートされていません。

  • ファイルのランダム書き込み操作はサポートされていません。

一般的な JindoFuse 設定

シナリオに応じて、詳細設定内で JindoFuse パラメーターをカスタマイズすることもできます。

本トピックでは、特定のシナリオにおける JindoFuse の設定方法について推奨事項を紹介します。ただし、これらはすべてのシナリオにおいて最適な設定ではありません。より柔軟な設定については、「JindoFuse ユーザーガイド」をご参照ください。
  • 高速読み取り/書き込み:高速な読み取りおよび書き込みを保証しますが、同時読み取り/書き込み時にはデータの不整合が発生する可能性があります。トレーニングデータおよびモデルをこのモードのマウントパスにマウントできます。ただし、このモードのマウントパスを作業ディレクトリとして使用することは推奨しません。

    {
      "fs.oss.download.thread.concurrency": "CPU コア数の 2 倍",
      "fs.oss.upload.thread.concurrency": "CPU コア数の 2 倍",
      "fs.jindo.args": "-oattr_timeout=3 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink"
    }
    
  • 増分読み取り/書き込み:増分書き込み時のデータ整合性を保証します。元のデータが上書きされた場合、データの不整合が発生する可能性があります。読み取り速度はやや遅くなります。トレーニングデータのモデル重みファイルの保存にこのモードを使用できます。

    {
      "fs.oss.upload.thread.concurrency": "CPU コア数の 2 倍",
      "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": "CPU コア数の 2 倍",
      "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 メソッドを用いた OSS ファイルのマウント:ローカルで作成したすべてのファイルは、OSS AppendObject API を呼び出してオブジェクト(ファイル)として作成されます。AppendObject メソッドで作成されたオブジェクトの最終サイズは、5 GB を超えることはできません。AppendObject の制限事項の詳細については、「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"
    }

Python SDK を使用したデータセットの JindoFuse パラメーターの変更

Python SDK を使用して JindoFuse パラメーターを変更することもできます。

  1. 以下の手順を実行します:

    1. ワークスペース SDK をインストールします。

      !pip install alibabacloud-aiworkspace20210204
    2. 環境変数を設定します。詳細については、「認証情報ツールのインストール」および「Linux、macOS、Windows における環境変数の設定」をご参照ください。

  2. JindoFuse パラメーターを変更します。

    高速読み取り/書き込み

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    
    def change_config():
        # DLC ジョブが配置されているリージョンを使用します。たとえば、中国 (杭州) の場合は region_id を 'cn-hangzhou' に設定します。
        region_id = 'cn-hangzhou'
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持ちます。これらの認証情報を使用して操作を実行することは高リスク操作です。API オペレーションの呼び出しまたは日常的な運用管理(O&M)には、Resource Access Management (RAM) ユーザーの使用を推奨します。
        # AccessKey ペアの漏洩を防ぐため、AccessKey ID および AccessKey Secret をプロジェクトコード内に保存しないでください。
        # この例では、デフォルトの Credentials SDK を使用して、本人確認のための認証情報を環境変数から読み込む方法を示しています。まず、認証情報ツールをインストールし、環境変数を設定する必要があります。
        cred = CredClient()
        dataset_id = '** データセットの ID **'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. データセットの内容を取得します。
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
        # 推奨値は CPU コア数の 2 倍です。
        options['fs.oss.download.thread.concurrency'] = 32
        options['fs.oss.upload.thread.concurrency'] = 32
        options['fs.jindo.args'] = '-oattr_timeout=3 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink'
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. オプションを更新します。
        workspace_client.update_dataset(dataset_id, update_request)
        print('新しいオプションは: {}'.format(update_request.options))
    
    
    change_config()

    増分読み取り/書き込み

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    
    def change_config():
        # DLC ジョブが配置されているリージョンを使用します。たとえば、中国 (杭州) の場合は region_id を 'cn-hangzhou' に設定します。
        region_id = 'cn-hangzhou'
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持ちます。これらの認証情報を使用して操作を実行することは高リスク操作です。API オペレーションの呼び出しまたは日常的な運用管理(O&M)には、Resource Access Management (RAM) ユーザーの使用を推奨します。
        # AccessKey ペアの漏洩を防ぐため、AccessKey ID および AccessKey Secret をプロジェクトコード内に保存しないでください。
        # この例では、デフォルトの Credentials SDK を使用して、本人確認のための認証情報を環境変数から読み込む方法を示しています。まず、認証情報ツールをインストールし、環境変数を設定する必要があります。
        cred = CredClient()
        dataset_id = '** データセットの ID **'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. データセットの内容を取得します。
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
        # 推奨値は CPU コア数の 2 倍です。
        options['fs.oss.upload.thread.concurrency'] = 32
        options['fs.jindo.args'] = '-oattr_timeout=3 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink'
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. オプションを更新します。
        workspace_client.update_dataset(dataset_id, update_request)
        print('新しいオプションは: {}'.format(update_request.options))
    
    
    change_config()

    読み取り/書き込み整合性

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    
    def change_config():
        # DLC ジョブが配置されているリージョンを使用します。たとえば、中国 (杭州) の場合は region_id を 'cn-hangzhou' に設定します。
        region_id = 'cn-hangzhou'
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持ちます。これらの認証情報を使用して操作を実行することは高リスク操作です。API オペレーションの呼び出しまたは日常的な運用管理(O&M)には、Resource Access Management (RAM) ユーザーの使用を推奨します。
        # AccessKey ペアの漏洩を防ぐため、AccessKey ID および AccessKey Secret をプロジェクトコード内に保存しないでください。
        # この例では、デフォルトの Credentials SDK を使用して、本人確認のための認証情報を環境変数から読み込む方法を示しています。まず、認証情報ツールをインストールし、環境変数を設定する必要があります。
        cred = CredClient()
        dataset_id = '** データセットの ID **'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. データセットの内容を取得します。
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
        options['fs.jindo.args'] = '-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink'
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. オプションを更新します。
        workspace_client.update_dataset(dataset_id, update_request)
        print('新しいオプションは: {}'.format(update_request.options))
    
    
    change_config()

    読み取り専用

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    
    def change_config():
        # DLC ジョブが配置されているリージョンを使用します。たとえば、中国 (杭州) の場合は region_id を 'cn-hangzhou' に設定します。
        region_id = 'cn-hangzhou'
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持ちます。これらの認証情報を使用して操作を実行することは高リスク操作です。API オペレーションの呼び出しまたは日常的な運用管理(O&M)には、Resource Access Management (RAM) ユーザーの使用を推奨します。
        # AccessKey ペアの漏洩を防ぐため、AccessKey ID および AccessKey Secret をプロジェクトコード内に保存しないでください。
        # この例では、デフォルトの Credentials SDK を使用して、本人確認のための認証情報を環境変数から読み込む方法を示しています。まず、認証情報ツールをインストールし、環境変数を設定する必要があります。
        cred = CredClient()
        dataset_id = '** データセットの ID **'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. データセットの内容を取得します。
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
        # 推奨値は CPU コア数の 2 倍です。
        options['fs.oss.download.thread.concurrency'] = 32
        options['fs.jindo.args'] = '-oro -oattr_timeout=7200 -oentry_timeout=7200 -onegative_timeout=7200 -okernel_cache -ono_symlink'
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. オプションを更新します。
        workspace_client.update_dataset(dataset_id, update_request)
        print('新しいオプションは: {}'.format(update_request.options))
    
    
    change_config()

    異なる JindoFuse バージョンの選択

    以下にコード例を示します:

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    
    def change_version():
        # DLC ジョブが配置されているリージョンを使用します。たとえば、中国 (杭州) の場合は region_id を 'cn-hangzhou' に設定します。
        region_id = 'cn-hangzhou'
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持ちます。これらの認証情報を使用して操作を実行することは高リスク操作です。API オペレーションの呼び出しまたは日常的な運用管理(O&M)には、Resource Access Management (RAM) ユーザーの使用を推奨します。
        # AccessKey ペアの漏洩を防ぐため、AccessKey ID および AccessKey Secret をプロジェクトコード内に保存しないでください。
        # この例では、デフォルトの Credentials SDK を使用して、本人確認のための認証情報を環境変数から読み込む方法を示しています。まず、認証情報ツールをインストールし、環境変数を設定する必要があります。
        cred = CredClient()
        dataset_id = '** データセットの ID **'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. データセットの内容を取得します。
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
        # jindo-fuse バージョンを設定します。6.4.4、6.7.0、6.6.0 のいずれかを設定できます。リリースノートの詳細については、https://aliyun.github.io/alibabacloud-jindodata/releases/ をご参照ください。
        options['fs.jindo.fuse.pod.image.tag'] = "6.7.0"
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. オプションを更新します。
        workspace_client.update_dataset(dataset_id, update_request)
        print('新しいオプションは: {}'.format(update_request.options))
    change_version()

    メタデータキャッシュの無効化

    分散タスクを実行する際に、複数のノードが同時に同一ディレクトリへ書き込みを試行すると、キャッシュにより一部のノードで書き込み操作が失敗することがあります。この問題は、JindoFuse のコマンドラインパラメーターを変更し、-oattr_timeout=0-oentry_timeout=0-onegative_timeout=0 を追加することで解決できます。以下にコード例を示します:

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    
    def turnOffMetaCache():
        region_id = 'cn-hangzhou'
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持ちます。これらの認証情報を使用して操作を実行することは高リスク操作です。API オペレーションの呼び出しまたは日常的な運用管理(O&M)には、Resource Access Management (RAM) ユーザーの使用を推奨します。
        # AccessKey ペアの漏洩を防ぐため、AccessKey ID および AccessKey Secret をプロジェクトコード内に保存しないでください。
        # この例では、デフォルトの Credentials SDK を使用して、本人確認のための認証情報を環境変数から読み込む方法を示しています。まず、認証情報ツールをインストールし、環境変数を設定する必要があります。
        cred = CredClient()
        dataset_id = '** データセットの ID **'
        workspace_client = AIWorkspaceClient(
          config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
          )
        )
        # 1. データセットの内容を取得します。
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
    
        options['fs.jindo.args'] = '-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0'
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. オプションを更新します。
        workspace_client.update_dataset(dataset_id, update_request)
        print('新しいオプションは: {}'.format(update_request.options))
    
    
    turnOffMetaCache()
    

    アップロード/ダウンロードデータのスレッド数の調整

    以下のパラメーターを設定することで、スレッド数を調整できます:

    • 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

    以下にコード例を示します:

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    
    def adjustThreadNum():
        # DLC ジョブが配置されているリージョンを使用します。たとえば、中国 (杭州) の場合は region_id を 'cn-hangzhou' に設定します。
        region_id = 'cn-hangzhou'
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持ちます。これらの認証情報を使用して操作を実行することは高リスク操作です。API オペレーションの呼び出しまたは日常的な運用管理(O&M)には、Resource Access Management (RAM) ユーザーの使用を推奨します。
        # AccessKey ペアの漏洩を防ぐため、AccessKey ID および AccessKey Secret をプロジェクトコード内に保存しないでください。
        # この例では、デフォルトの Credentials SDK を使用して、本人確認のための認証情報を環境変数から読み込む方法を示しています。まず、認証情報ツールをインストールし、環境変数を設定する必要があります。
        cred = CredClient()
        dataset_id = '** データセットの ID **'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. データセットの内容を取得します。
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
    
        options['fs.oss.upload.thread.concurrency'] = 32
        options['fs.oss.download.thread.concurrency'] = 32
        options['fs.oss.read.readahead.buffer.count'] = 32
     
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. オプションを更新します。
        workspace_client.update_dataset(dataset_id, update_request)
        print('新しいオプションは: {}'.format(update_request.options))
     
     
    adjustThreadNum()
    

    AppendObject を使用した OSS ファイルのマウント

    ローカルで作成されたすべてのファイルは、AppendObject 操作を呼び出して OSS オブジェクトとして作成されます。AppendObject を使用して作成されたオブジェクトのサイズは、5 GB を超えることはできません。AppendObject の制限事項の詳細については、「AppendObject」をご参照ください。以下にコード例を示します:

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    
    def useAppendObject():
        # DLC ジョブが配置されているリージョンを使用します。たとえば、中国 (杭州) の場合は region_id を 'cn-hangzhou' に設定します。
        region_id = 'cn-hangzhou'
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持ちます。これらの認証情報を使用して操作を実行することは高リスク操作です。API オペレーションの呼び出しまたは日常的な運用管理(O&M)には、Resource Access Management (RAM) ユーザーの使用を推奨します。
        # AccessKey ペアの漏洩を防ぐため、AccessKey ID および AccessKey Secret をプロジェクトコード内に保存しないでください。
        # この例では、デフォルトの Credentials SDK を使用して、本人確認のための認証情報を環境変数から読み込む方法を示しています。まず、認証情報ツールをインストールし、環境変数を設定する必要があります。
        cred = CredClient()
        dataset_id = '** データセットの ID **'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. データセットの内容を取得します。
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
    
        options['fs.jindo.args'] = '-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0'
        options['fs.oss.append.enable'] = "true"
        options['fs.oss.flush.interval.millisecond'] = "1000"
        options['fs.oss.read.buffer.size'] = "262144"
        options['fs.oss.write.buffer.size'] = "262144"
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. オプションを更新します。
        workspace_client.update_dataset(dataset_id, update_request)
        print('新しいオプションは: {}'.format(update_request.options))
    
    
    useAppendObject()

    OSS-HDFS のマウント

    OSS-HDFS を有効化する方法については、「OSS-HDFS とは」をご参照ください。以下に、OSS-HDFS エンドポイントを使用してデータセットを作成するコード例を示します:

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import CreateDatasetRequest
    
    
    def createOssHdfsDataset():
        # DLC ジョブが配置されているリージョンを使用します。たとえば、中国 (杭州) の場合は region_id を 'cn-hangzhou' に設定します。
        region_id = 'cn-hangzhou'
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持ちます。これらの認証情報を使用して操作を実行することは高リスク操作です。API オペレーションの呼び出しまたは日常的な運用管理(O&M)には、Resource Access Management (RAM) ユーザーの使用を推奨します。
        # AccessKey ペアの漏洩を防ぐため、AccessKey ID および AccessKey Secret をプロジェクトコード内に保存しないでください。
        # この例では、デフォルトの Credentials SDK を使用して、本人確認のための認証情報を環境変数から読み込む方法を示しています。まず、認証情報ツールをインストールし、環境変数を設定する必要があります。
        cred = CredClient()
        workspace_id = '** DLC ジョブが配置されているワークスペースの ID **'
    
        oss_bucket = '** OSS バケット **'
        # OSS-HDFS エンドポイントを使用します。
        oss_endpoint = f'{region_id}.oss-dls.aliyuncs.com'
        # マウントする OSS-HDFS パス。
        oss_path = '/'
        # ローカルのマウントパス。
        mount_path = '/mnt/data/'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
    
        response = workspace_client.create_dataset(CreateDatasetRequest(
            workspace_id=workspace_id,
            name="** データセットの名前 **",
            data_type='COMMON',
            data_source_type='OSS',
            property='DIRECTORY',
            uri=f'oss://{oss_bucket}.{oss_endpoint}{oss_path}',
            accessibility='PRIVATE',
            source_type='USER',
            options=json.dumps({
                'mountPath': mount_path,
                # 分散トレーニングのシナリオでは、以下のパラメーターを追加することを推奨します。
                '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",
            })
        ))
        print(f'データセット ID: {response.body.dataset_id}')
    
    createOssHdfsDataset()
    
    

    メモリリソースの設定

    パラメーター fs.jindo.fuse.pod.mem.limit を設定することで、メモリリソースを調整できます。以下にコード例を示します:

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    
    def adjustResource():
        # DLC ジョブが配置されているリージョンを使用します。たとえば、中国 (杭州) の場合は region_id を 'cn-hangzhou' に設定します。
        region_id = 'cn-hangzhou'
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持ちます。これらの認証情報を使用して操作を実行することは高リスク操作です。API オペレーションの呼び出しまたは日常的な運用管理(O&M)には、Resource Access Management (RAM) ユーザーの使用を推奨します。
        # AccessKey ペアの漏洩を防ぐため、AccessKey ID および AccessKey Secret をプロジェクトコード内に保存しないでください。
        # この例では、デフォルトの Credentials SDK を使用して、本人確認のための認証情報を環境変数から読み込む方法を示しています。まず、認証情報ツールをインストールし、環境変数を設定する必要があります。
        cred = CredClient()
        dataset_id = '** データセットの ID **'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. データセットの内容を取得します。
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
        # 設定するメモリリソース。
        options['fs.jindo.fuse.pod.mem.limit'] = "10Gi"
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. オプションを更新します。
        workspace_client.update_dataset(dataset_id, update_request)
        print('新しいオプションは: {}'.format(update_request.options))
    
    
    adjustResource()
    

ossfs 2.0

OSS データソースをマウントする際には、詳細設定{"mountType":"ossfs"} を設定することで、ossfs マウント方式を使用できます。

マウント方法

DLC での OSS のマウント

DLC ジョブの作成時に OSS データセットをマウントできます。サポートされるマウントタイプは 2 種類です。設定方法の詳細については、「トレーニングジョブの作成」をご参照ください。

image

マウントタイプ

説明

データセット

Object Storage Service (OSS) 型のデータセットを選択し、マウントパス を設定します。パブリックデータセットを使用する場合は、読み取り専用マウントモードのみがサポートされます。

ダイレクトマウント

OSS バケットのストレージパスを直接マウントします。

ローカルキャッシュが有効な Lingjun リソースクォータを使用する場合、キャッシュの使用 スイッチをオンにしてキャッシュ機能を有効化できます。

DSW での OSS のマウント

DSW インスタンスの作成時に OSS データセットをマウントできます。サポートされるマウントタイプは 2 種類です。設定方法の詳細については、「DSW インスタンスの作成」をご参照ください。

image

マウントタイプ

説明

データセットのマウント

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 のファイルを書き込めるようになります。ただし、-upload_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 モジュールは、DLC ジョブまたは DSW インスタンスにおいて PyTorch 2.0 以降のイメージでのみ使用できます。

  • カスタムイメージ: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 のみがサポートされています。

事前準備

  1. 認証情報ファイルを設定します。

    以下のいずれかの方法で認証情報を設定できます:

    • Deep Learning Containers (DLC) ジョブに対してパスワードなしの OSS アクセスを設定できます。詳細については、「DLC RAM ロールの設定」をご参照ください。認証情報ファイルを設定すると、DLC ジョブはセキュリティトークンサービス(STS)から一時的なアクセス認証情報を取得できます。これにより、認証情報の明示的な設定を伴わずに OSS やその他のクラウドリソースに安全にアクセスでき、キー漏洩のリスクを低減できます。

    • コードプロジェクト内で認証情報ファイルを設定して、認証情報を管理します。以下に設定例を示します:

      説明

      平文で AccessKey 情報を設定するとセキュリティリスクが生じます。DLC インスタンス内で認証情報を自動的に設定するには、RAM ロールの使用を推奨します。詳細については、「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 ユーザーの AccessKey ID および AccessKey Secret。

      説明

      STS から取得した一時的なアクセス認証情報を使用して OSS にアクセスする場合、これは一時的認証情報の AccessKey ID および AccessKey Secret に設定します。

      NTS****

      AccessKeySecret

      はい

      7NR2****

      SecurityToken

      いいえ

      一時的なアクセストークン。STS から取得した一時的なアクセス認証情報を使用して OSS にアクセスする場合、このパラメーターを設定する必要があります。

      STS.6MC2****

      Expiration

      いいえ

      認証情報の有効期限。Expiration が空の場合、認証情報は有効期限切れになりません。認証情報が有効期限切れになると、OSS Connector が認証情報を再読み込みします。

      2024-08-20T00:00:00Z

  2. config.json ファイルを設定します。以下に設定例を示します:

    コードプロジェクト内で 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

    はい

    ログ記録レベル。デフォルトは 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 ms を超える遅延を持つ読み取りおよび書き込み要求を記録します。デフォルトパスは /var/log/oss-connector/audit.log です。

    /var/log/oss-connector/audit.log

    DatasetConfig

    prefetchConcurrency

    はい

    データセットを使用して OSS からデータをプリフェッチする際の同時実行タスク数。デフォルト値は 24 です。

    24

    prefetchWorker

    はい

    データセットを使用して OSS からデータをプリフェッチする際に使用可能な vCPU 数。デフォルト値は 4 です。

    2

    checkpointConfig

    prefetchConcurrency

    はい

    チェックポイント読み取りを使用して OSS からデータをプリフェッチする際の同時実行タスク数。デフォルト値は 24 です。

    24

    prefetchWorker

    はい

    チェックポイント読み取りを使用して OSS からデータをプリフェッチする際に使用可能な vCPU 数。デフォルト値は 4 です。

    4

    uploadConcurrency

    はい

    チェックポイント書き込みを使用してデータをアップロードする際の同時実行タスク数。デフォルト値は 64 です。

    64

使用方法

OSS Connector for AI/ML は、OssMapDataset および OssIterableDataset の 2 種類のデータセットアクセスインターフェイスを提供します。これらはそれぞれ、PyTorch の Dataset および IterableDataset インターフェイスの拡張です。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("読み取り失敗", 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, int]]:
        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_trans, 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_trans, 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_trans, cred_path=cred_path, config_path=config_path)
  • OSS URI のリストに基づくファイルへのアクセス

    dataset = OssIterableDataset.from_objects(uris, endpoint=endpoint, transform=read_and_trans, cred_path=cred_path, config_path=config_path)

OssCheckpoint

現在、OssCheckpoint 機能は一般コンピューティングリソース環境でのみ使用可能です。OSS Connector for AI/ML は、OssCheckpoint を通じて OSS モデルファイルへのアクセスおよび 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

cred_path = "/mnt/.alibabacloud/credentials"  # DLC ジョブおよび DSW インスタンスにロール情報を設定した後のデフォルト認証情報パス。
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()))
        value = transform(img)
    except Exception as e:
        print("読み取り失敗", e)
        return None, 0
    return value, 0
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(args.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 の使用パターンに従います。

  • このデータセットを使用して、標準的な Torch Dataloader を構築します。その後、Dataloader を反復処理して各バッチを処理し、モデルをトレーニングおよび保存するという標準的なトレーニングプロセスを実行します。

  • このプロセスでは、データセットをコンテナ環境にマウントしたり、事前にローカルにデータを保存したりする必要がないため、オンデマンドでのデータ読み込みが可能になります。

OSS SDK

OSS Python SDK

OSS Python SDK を使用して、OSS 内のデータを読み取りおよび書き込みできます。手順は以下のとおりです:

  1. OSS SDK for Python をインストールします。詳細については、「インストール(Python SDK V1)」をご参照ください。

  2. OSS SDK for Python のアクセス認証情報を設定します。詳細については、「OSS SDK for Python 1.0 を使用したアクセス認証情報の設定」をご参照ください。

  3. OSS データの読み取りおよび書き込みを行います。

    # -*- coding: utf-8 -*-
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # 環境変数から取得した RAM ユーザーの AccessKey ペアを使用してアクセス認証情報を設定します。
    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>

    バケットが配置されているリージョンのエンドポイントです。たとえば、バケットが中国 (杭州) リージョンにある場合、このパラメーターを 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 バケットに保存し、データパスおよび対応するラベルを同じバケット内のインデックスファイルに配置できます。DataSet をカスタマイズすることで、PyTorch の DataLoader API を使用して、複数のプロセスによる並列データ読み込みが可能です。以下にコード例を示します:

    import io
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    import PIL
    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

    バケットが配置されているリージョンのエンドポイントです。たとえば、バケットが中国 (杭州) リージョンにある場合、このパラメーターを 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 は、バケットが配置されているリージョンのエンドポイントです。たとえば、中国 (杭州) の場合は 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 は、バケットが配置されているリージョンのエンドポイントです。たとえば、中国 (杭州) の場合は https://oss-cn-hangzhou.aliyuncs.com を入力します。

      • <your_bucket_name> は OSS バケットの名前です。名前の先頭に oss:// を付けることはできません。

      • <your_model_path> はモデルのパスです。必要に応じて変更してください。