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 (この値を設定することは、直接読み取りモードのみを使用することと同等です。) |
パフォーマンステスト
シーケンシャル読み取り
マシン仕様
メモリ: 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
次のサンプルコードは、パフォーマンステスト用のサンプルスクリプトを提供します。
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
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=16 -odirect_read_local_file_cache_size_mb=3072
テスト
次のサンプルコードは、パフォーマンステスト用のサンプルスクリプトを提供します。
import time from safetensors.torch import load_file file_path = "./my_folder/bert.safetensors" start = time.perf_counter() loaded = load_file(file_path) end = time.perf_counter() elapsed = end - start print("time_spent: ", elapsed)
次の表にテスト結果を示します。
説明テスト結果は参照だけのためです。 実際の読み取りパフォーマンスは、ファイルサイズと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