ossfsを使用すると、ローカルファイルを管理するのと同じ方法で、Object Storage Service (OSS) オブジェクトにシームレスにアクセスして管理できます。 このトピックでは、ossfs V1.91.2およびV1.91.3の新機能について説明します。
V1.91.2の新機能
直接読み取り
ossfsを使用してバケット内のオブジェクトを読み取る場合、ossfsはバケットからオブジェクトをダウンロードし、ファイルとしてローカルディスクに書き込み、デフォルトでローカルディスクからファイルを返します。 ossfsでは、ディスク書き込みは非同期です。つまり、ossfsは最初にダウンロードしたファイルをメモリ内のページキャッシュに書き込み、次にダーティページのコンテンツをローカルディスクに非同期にフラッシュします。 ファイルを読み取り、キャッシュヒットを経験すると、ファイルはキャッシュから直接提供されます。
デフォルトでは、ossfsは、使用可能なディスク容量が使い果たされるまで、ローカルディスク上のすべてのプリフェッチされたデータを保持します。
メモリサイズが十分に大きい場合、ダウンロードされたすべてのデータがページキャッシュに書き込まれます。 読み取りパフォーマンスは、ディスク帯域幅ではなく、マシンのネットワーク帯域幅にのみ依存します。
メモリサイズがファイル全体を保持するのに十分な大きさでない場合、ファイルはローカルディスクに書き込まれ、読み取り要求を満たすためにディスクから提供される。 その結果、読み取りパフォーマンスはディスク帯域幅とネットワーク帯域幅に依存します。 これらのうち、前者は主要な性能制約である。
デフォルトの読み取りモードでは、大きなファイルを読み取るパフォーマンスはディスク帯域幅によって制限されます。 このパフォーマンスの制限に対処するために、ossfsは直接読み取りモードを提供します。
直接読み取りモードでは、ossfsはデータをメモリバッファにダウンロードし、そのバッファからの読み取り要求を処理します。 このモードでは、データ読み取りプロセスからディスクが排除され、ネットワーク帯域幅を活用するシーケンシャル読み取りパフォーマンスが向上します。
直接読み取りモードでは、ossfsはダウンロードしたデータをチャンクで管理します。 各チャンクのサイズはデフォルトで4 MBで、direct_read_chunk_sizeパラメーターを使用して変更できます。 ossfsは、現在のチャンクの前のチャンクから、現在のチャンクの後の次のdirect_read_prefetch_chunksまでの範囲のデータをメモリに保持します。 次の読み取り動作のオフセットがこの範囲を超える場合、ossfsは既にダウンロードされたデータを破棄し、新しいオフセットからデータのプリフェッチを開始します。
直接読み出しモードは、順次読み出しにのみ適している。 次のシナリオでは適用されません。
ランダム読み取り: ossfsは、現在のオフセットウィンドウでのみデータを保持します。 ランダム読み取りのオフセットがウィンドウ内に収まらない場合、データは複数回ダウンロードされ、リリースされます。これにより、不要なネットワークリソースが消費され、読み取りパフォーマンスが低下します。
書き込み: ossfsは引き続き最初にローカルディスクにデータを書き込みます。 ファイルの直接読み取り操作中にファイルの書き込み要求が発生すると、ossfsは自動的にデフォルトの読み取りモードに切り替わります。このモードでは、ファイルが最初にローカルディスクにダウンロードされます。 直接読み取り操作中のファイルへの書き込み操作は、他のファイルを直接読み取りモードから終了させません。
次の表に、直接読み取りに関連するパラメーターを示します。
パラメーター | 説明 | デフォルト値 |
direct_read | 直接読み取りモードを有効にします。 直接読み取りモードを有効にするには、コマンドラインで-odirect_readを指定します。 |
|
direct_read_chunk_size | 各プリフェッチタスクによってプリフェッチされるデータのサイズ (MB単位) 。 | 4 |
direct_read_prefetch_chunks | プリフェッチするチャンクの数。 | 32 |
direct_read_prefetch_limit | プリフェッチできるデータの最大サイズ (MB単位) 。 | 1024 |
direct_read_prefetch_thread | プリフェッチを実行するスレッドの数。 | 64 |
V1.91.3の新機能
新しいパラメーターdirect_read_backward_chunks
ossfs V1.91.2では、カレントチャンクの前のチャンクからカレントチャンクの後のdirect_read_prefetch_chunksまでの範囲のデータをメモリに保持する。 現在の読み取り位置の1つ前のチャンクのみが保持されます。 現在の読み取り位置よりも2つ前のチャンクでデータを読み取ろうとすると、プリフェッチされたデータが大量に破棄され、追加の帯域幅消費、リソースの浪費、パフォーマンスの低下を引き起こす可能性があります。
ossfs V1.91.3では、direct_read_backward_chunksパラメーターが追加され、ossfsが現在のチャンクの前に指定された数のチャンクをメモリに保持できるようになります。 direct_read_backward_chunksパラメーターとdirect_read_prefetch_chunksパラメーターを併用すると、現在のチャンクの前の指定数から現在のチャンクの後の指定数の範囲のデータをメモリに保持できます。 Safetensorsファイル (ランダム読み取り) をロードする場合などのAI推論シナリオでは、direct_read_backward_chunksパラメーターの値を合理的に大きくして、メモリ内のデータをより多く保持し、データの繰り返しダウンロードを減らしてパフォーマンスを向上させることができます。
パラメーター | 説明 | デフォルト値 | |
direct_read_backward_chunks | 直接読み取りモードで保持できる現在の読み取り位置の前のチャンクの数。 チャンクのデフォルトサイズは4 MBです。
| 1 | |
stat_cache_expire | メタデータの有効期間 (秒単位) 。 このバージョンから、パラメーターは-1に設定できます。これは、メタデータが期限切れにならないことを指定します。 メタデータの有効期限が切れると、データはバッファにリロードされます。 | 900 |
ハイブリッド読み取りモード
ランダムな読み取りが頻繁に行われ、読み取りオフセットが広範囲に及ぶシナリオでは、
直接読み取りモードでは、ossfsは頻繁にデータをダウンロードし、データを破棄し、データを再ダウンロードします。 これは、読み取り性能を著しく低下させる。
デフォルトの読み取りモードでは、ossfsはデータをローカルディスクにダウンロードし、ディスク容量が使い果たされるまでダウンロードしたデータを破棄しません。 その結果、ダウンロードの繰り返しは発生しません。
要求されたファイルのサイズが大きくない場合、それはメモリ内のページキャッシュに書き込まれ、ページキャッシュから直接要求者に提供される。 このように、読み取り性能はディスク性能によって制限されない。
要求されたファイルのサイズが大きすぎてページキャッシュに完全に書き込まれない場合、読み取りパフォーマンスはディスクパフォーマンスによって制限されます。
ハイブリッド読み取りモードは、デフォルトモード (ディスクからデータを読み取る) と直接読み取りモードの利点を兼ね備えています。 ハイブリッド読み取りモードでは、小さなファイルはページキャッシュの高速化を最大限に活用しますが、大きなファイルは最初はページキャッシュを効率的に利用し、定義されたしきい値に達すると直接読み取りモードに切り替えられます。 ハイブリッド読み取りモードは、小さなファイルと大きなファイルの両方を読み取るときの潜在的なディスクパフォーマンスの制約を回避できます。
パラメーター | 説明 | デフォルト値 |
direct_read_local_file_cache_size_mb | ハイブリッド読み取りモードでは、データはデフォルトでローカルディスクに最初にダウンロードされます。 ダウンロードされたデータがこのパラメーターで指定されたサイズのしきい値 (MB) を超えると、直接読み取りモードが使用されます。 | 0 (この値を設定することは、直接読み取りモードのみを使用することと同等です。) |
ossfs V1.91.3以降のベストプラクティス
直読
直接読み取りモードは、大きなファイルの順次読み取りを含むシナリオに適しており、制限された程度のランダム読み取りアクセス (いくつかのチャンクをスキップする読み取りなど) を可能にします。 たとえば、AI推論シナリオでは、直接読み取りモードを使用して、大きなSafetensorsファイルを読み込むことができます。
直接読み取りモードを有効にするには、-odirect_readパラメーターを指定する必要があります。
直接読み取りモードでは、ossfsはメモリに
[-direct_read_backward_chunks * direct_read_chunk_size, + direct_read_prefetch_chunks * direct_read_chunk_size]
の範囲内のデータを保持します。 デフォルトでは、ossfsは[-4 MB, + 128 MB]
の範囲内のデータをメモリに保持します。 直接読み取りモードは、小さな範囲に制限されたランダム読み取りもサポートします。 たとえば、Safetensorsファイルからの2つの連続した読み取りが[-32 MB, + 32 MB]
の範囲内にある場合、現在のオフセットの前に32 MBのデータを保持するように "-odirect_read_backward_chunks=8" を設定できます。direct_read_prefetch_chunksおよびdirect_read_chunk_sizeパラメーターを調整して、帯域幅の使用量を最大化するために並列にプリフェッチできるデータ量を増やすことができます。
デフォルトの読み取りモード
デフォルトの読み取りモードは、小さなファイル (ページキャッシュに完全にキャッシュできるファイル) と大きなファイルに対するランダムな読み取り専用操作に適しています。 たとえば、AIトレーニングプロジェクトで直接読み取りモードで画像を読み取るパフォーマンスが低い場合、ランダム読み取り操作を追加しても、デフォルトの読み取りモードに切り替えることをお勧めします。
ossfsがファイルを読み取ると、カーネルはマウントポイントからメモリにファイルのコピーをキャッシュし、ローカルディスクのファイルにデータを書き込みます。 その結果、このような読み出し動作によって消費されるキャッシュサイズは、ファイルサイズの2倍になる。
システムのページキャッシュがダーティページに最大6 GBのデータをキャッシュできる場合、理論的には、サイズが3 GB未満のファイルを読み取るにはデフォルトの読み取りモードが適しています。
parallel_countパラメーターを使用して同時ダウンロードタスクの数を調整し、multipart_sizeパラメーターを使用して1つのタスクでダウンロードできるデータ量を設定できます。
ハイブリッド読み取り
ハイブリッド読み取りモードは、小さなファイル (ページキャッシュに完全にキャッシュできるファイル) と大きなファイルの組み合わせに対する読み取り専用操作に適しており、制限された程度のランダム読み取りアクセス (いくつかのチャンクをスキップする読み取りなど) も可能にします。 たとえば、AI推論シナリオで大規模なSafetensorsファイルをロードする場合、ランダム読み取りが広いオフセット範囲に及ぶ場合、ハイブリッド読み取りモードはデフォルトの読み取りモードよりも読み取りパフォーマンスが低くなります。
ハイブリッド読み取りモードを有効にするには、-odirect_readパラメーターを指定する必要があります。
直接読み取りモードが使用されるデータサイズのしきい値を設定するには、direct_read_local_file_cache_size_mbパラメーターを設定する必要があります。 たとえば、マシンが最大6 GBのページキャッシュを提供している場合、ダウンロードしたデータが3 GBに達したときに「-odirect_read_local_file_cache_size_mb=3072」を設定して直接読み取りモードに切り替えることができます。
直接読み取りモードでは、ossfsはメモリに
[-direct_read_backward_chunks * direct_read_chunk_size, + direct_read_prefetch_chunks * direct_read_chunk_size]
の範囲内のデータを保持します。 デフォルトでは、ossfsは[-4 MB, + 128 MB]
の範囲内のデータをメモリに保持します。 直接読み取りモードは、小さな範囲に制限されたランダム読み取りもサポートします。 たとえば、Safetensorsファイルからの2つの連続した読み取りが[-32 MB, + 32 MB]
の範囲内にある場合、現在のオフセットの前に32 MBのデータを保持するように "-odirect_read_backward_chunks=8" を設定できます。direct_read_prefetch_chunksおよびdirect_read_chunk_sizeパラメーターを調整して、帯域幅の使用量を最大化するために並列にプリフェッチできるデータ量を増やすことができます。
モード選択ガイダンス
ossfsがファイルを読み取り、同時にファイルを書き込む場合は、デフォルトの読み取りモードを使用します。
ossfsがファイルのみを読み取る場合、またはファイルを読み取って別のファイルを書き込む場合:
説明直接読み取りモードまたはハイブリッド読み取りモードでパフォーマンスが不十分な場合は、デフォルトの読み取りモードに切り替えて、データをローカルディスクに保存します。 デフォルトの読み取りモードでは、ディスクパフォーマンスはossfs読み取りパフォーマンスのパフォーマンス制約です。 パフォーマンスレベルの高いディスクを使用することを推奨します。 たとえば、適切にプロビジョニングされたパフォーマンスとバーストパフォーマンスの設定でESSD AutoPLディスクを使用できます。
シナリオ
説明
小さなファイルのみ
デフォルトの読み取りモードを使用します。
大きなファイルのみ
大きなファイルを連続的に読み取るか、読み取りオフセットが狭い範囲をカバーするSafetensorsファイルをランダムに読み取るには、直接読み取りモードを使用します。
広いオフセット範囲をカバーするランダム読み取り操作を実行するには、デフォルトの読み取りモードを使用します。
ビジネスシナリオに適した読み取りモードがわからない場合、または直接読み取りモードでdirect_read_backward_chunksパラメーターを調整した後もパフォーマンスが不十分な場合は、デフォルトの読み取りモードを使用します。
小さなファイルと大きなファイル
大きなファイルを連続的に読み取るか、読み取りオフセットが狭い範囲をカバーするSafetensorsファイルをランダムに読み取るには、ハイブリッド読み取りモードを使用します。
広範囲にわたるオフセットでランダム読み取りを実行する必要がある場合、適切な読み取りモードが不明な場合、またはハイブリッド読み取りモードでdirect_read_backward_chunksパラメーターを調整した後でもパフォーマンスが不十分な場合は、デフォルトの読み取りモードを使用します。
パフォーマンステスト
テスト1: シーケンシャル読み取り
マシン仕様
メモリ: 32 GB
ディスク帯域幅: 130メガバイト/秒
内部帯域幅: 750メガバイト/秒
マウントコマンド
ossfsをデフォルトの読み取りモードでマウントする:
ossfs [bucket name] [mountpoint] -ourl=[endpoint] -oparallel_count=32 -omultipart_size=16
直接読み取りモードでossfsをマウントする:
ossfs [bucket name] [mountpoint] -ourl=[endpoint] -odirect_read -odirect_read_chunk_size=8 -odirect_read_prefetch_chunks=64
Performance testingコマンド
dd if=testfile of=/dev/null bs=1M status=progress
次の表にテスト結果を示します。
ファイルサイズ
デフォルト読み取りモード
直接読み取りモード
1 GB
646 MB/s
592 MB/s
5 GB
630 MB/s
611 MB/s
10 GB
260 MB/s
574 MB/s
テスト2: PyTorchを使用したファイルの読み込み
マシン仕様
メモリ: 15 GB
ディスク帯域幅: 150メガバイト/秒
内部帯域幅: 500メガバイト/秒
マウントコマンド
ossfsをデフォルトの読み取りモードでマウントする:
ossfs [bucket name] [mountpoint] -ourl=[endpoint] -oparallel_count=32 -omultipart_size=16
直接読み取りモードでossfsをマウントする:
ossfs [bucket name] [mountpoint] -ourl=[endpoint] -odirect_read -odirect_read_chunk_size=8 -odirect_read_prefetch_chunks=64 -odirect_read_backward_chunks=16
ハイブリッド読み取りモードでのossfsのマウント
ossfs [bucket name] [mountpoint] -ourl=[endpoint] -oparallel_count=32 -omultipart_size=16 -odirect_read -odirect_read_chunk_size=8 -odirect_read_prefetch_chunks=64 -odirect_read_backward_chunks=3072
テスト
次のサンプルコードは、パフォーマンステスト用のサンプルスクリプトを提供します。
インポート時間 safetensors.torch import load_fileから file_path = "./my_folder/bert.safetensors" start = time.perf_counter() load_file(file_path) load_file end = time.perf_counter() 経過=end - start プリント ("time_spent: " 、経過)
次の表にテスト結果を示します。
説明テスト結果は参照だけのためです。 実際の読み取りパフォーマンスは、ファイルサイズとSafetensorsモデルの構造によって異なります。
ファイルサイズ
デフォルト読み取りモード
直接読み取りモード
ハイブリッド読み取りモード
2.0 GB
4.00s
5.86s
3.94s
5.3 GB
20.54s
27.33s
19.91s
6.5 GB
30.14s
24.23s
17.93s