OSS Connector for AI/ML は、コード変更を一切必要としない非侵入型のモデル読み込みソリューションです。`LD_PRELOAD` を活用し、OSS からの高性能な直接読み取りを実現します。また、プリフェッチおよびキャッシュ機能を備えており、モデル読み込み速度を大幅に向上させます。コンテナおよび主要な推論フレームワークとの連携が可能です。
高性能
OSS Connector for AI/ML は、OSS から大規模モデルを読み込む際のパフォーマンスを大幅に向上させます。十分な帯域幅が確保されている場合、スループットは 10 GB/s を超えることがあります。詳細については、「パフォーマンステスト」をご参照ください。
仕組み
OSS Connector for AI/ML は、クラウド環境で OSS から大規模モデルを読み込む際に発生するパフォーマンスボトルネックを解消します。
-
ユーザー空間ファイルシステム(FUSE)に基づく従来のマウント方式では、OSS の高帯域幅を十分に活用できないことが多く、結果としてモデル読み込みが遅くなります。OSS コネクタは、推論フレームワークからの I/O リクエストをインターセプトし、これを OSS への HTTP(s) リクエストに直接変換することで、データアクセス効率を向上させます。
-
`LD_PRELOAD` メカニズムを活用して、モデルデータをメモリ内にプリフェッチおよびキャッシュします。これにより、推論アプリケーションのコード変更は一切不要であり、モデル読み込みを大幅に高速化できます。
デプロイ環境
-
オペレーティングシステム:Linux x86-64
-
glibc:>=2.17
インストール OSS コネクタ
-
完全なインストールパッケージをダウンロードします。
-
oss-connector-lib-1.1.0rc7.x86_64.rpm:Red Hat ベースの Linux ディストリビューション向け
https://gosspublic.alicdn.com/oss-connector/oss-connector-lib-1.1.0rc7.x86_64.rpm -
oss-connector-lib-1.1.0rc7.x86_64.deb:Debian ベースの Linux ディストリビューション向け
https://gosspublic.alicdn.com/oss-connector/oss-connector-lib-1.1.0rc7.x86_64.deb
-
-
OSS コネクタをインストールします。
ダウンロードした .rpm または .deb パッケージを使用してインストールを行います。動的ライブラリファイル `libossc_preload.so` は自動的に
/usr/local/lib/ディレクトリに配置されます。-
oss-connector-lib-1.1.0rc7.x86_64.rpm のインストール
yum install -y oss-connector-lib-1.1.0rc7.x86_64.rpm -
oss-connector-lib-1.1.0rc7.x86_64.deb のインストール
dpkg -i oss-connector-lib-1.1.0rc7.x86_64.deb
-
-
インストール後に、`/usr/local/lib/libossc_preload.so` が存在することと、バージョンが正しいことを確認します。
nm -D /usr/local/lib/libossc_preload.so | grep version
構成 OSS コネクタ
-
構成ファイル
構成ファイルを使用して、ログ出力、キャッシュポリシー、プリフェッチ同時実行数を制御できます。これらのパラメーターを適切に設定することで、システムパフォーマンスおよびメンテナンス性を向上させることができます。
構成ファイルは
/etc/oss-connector/config.jsonに配置されます。インストールパッケージには、以下に示すデフォルトの構成ファイルが含まれています:{ "logLevel": 1, "logPath": "/var/log/oss-connector/connector.log", "auditPath": "/var/log/oss-connector/audit.log", "expireTimeSec": 120, "prefetch": { "vcpus": 16, "workers": 16 } }パラメーター
説明
logLevel
ログレベル。ログ出力の詳細度を制御します。
logPath
ログファイルパス。ランタイムログの出力先を指定します。
auditPath
監査ログファイルパス。セキュリティおよびコンプライアンス追跡のための監査情報を記録します。
expireTimeSec
キャッシュファイルの遅延解放時間(秒単位)。参照がない状態で一定時間が経過するとファイルが解放されます。デフォルト値は 120 秒です。
prefetch.vcpus
プリフェッチに使用する仮想 CPU(同時実行 CPU コア)の数。デフォルト値は 16 です。
prefetch.workers
vCPU あたりのコルーチン(ワーカー)数。同時実行数を増加させるために使用されます。デフォルト値は 16 です。
-
環境変数の構成
環境変数 KEY
説明
OSS_ACCESS_KEY_ID
Alibaba Cloud アカウントまたは Resource Access Management (RAM) ユーザーの AccessKey ID および AccessKey Secret です。
一時的なアクセストークンで権限を構成する場合は、この値を一時アクセス認証情報の AccessKey ID および AccessKey Secret に設定します。
OSS コネクタは、対象バケットディレクトリに対して `oss:ListObjects` 権限を必要とします。アクセス対象のバケットおよびファイルが匿名アクセスをサポートしている場合は、`OSS_ACCESS_KEY_ID` および `OSS_ACCESS_KEY_SECRET` 環境変数を未設定のままにするか、空文字列に設定できます。
OSS_ACCESS_KEY_SECRET
OSS_SESSION_TOKEN
一時的なアクセストークンです。Security Token Service (STS) から取得した一時アクセス認証情報を使用して OSS にアクセスする場合、このパラメーターを必ず設定してください。
Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID および AccessKey Secret を使用して権限を構成する場合は、このフィールドを空文字列に設定します。
OSS_ENDPOINT
OSS サービスのエンドポイントを指定します。例:
http://oss-cn-beijing-internal.aliyuncs.com。プロトコルを明示しない場合、デフォルトで HTTPS が使用されます。内部ネットワークなどのセキュアな環境では、パフォーマンス向上のため HTTP プロトコルの使用を推奨します。OSS_REGION
OSS のリージョン ID を指定します。例:cn-beijing。未指定の場合、認証に失敗する可能性があります。
OSS_PATH
OSS 上のモデルディレクトリを指定します。形式は `oss://bucketname/path/` です。例:
oss://examplebucket/qwen/Qwen3-8B/。MODEL_DIR
vllm またはその他の推論フレームワークに渡すローカルモデルディレクトリです。事前にディレクトリを空にしておくことを推奨します。使用時に一時データがダウンロードされ、その後削除可能です。
説明-
`MODEL_DIR` のパスは、vllm の `--model` パラメーターまたは sglang の `--model-path` パラメーターなど、推論フレームワークのモデルパスと一致させる必要があります。
-
`MODEL_DIR` には読み取りおよび書き込み権限が必要です。`MODEL_DIR` のディレクトリ構造は `OSS_PATH` に対応します。
-
モデル読み込み中、モデルファイルはメモリ内にプリフェッチおよびキャッシュされます。モデル読み込み完了後、一定の遅延後にキャッシュが解放されます。デフォルトの遅延時間は 120 秒です。これは構成ファイル内の `expireTimeSec` パラメーターで調整可能です。
-
ローカルモデルディレクトリは、コネクタによるモデル読み込み専用に使用してください。他の目的には使用しないでください。
-
ローカルモデルディレクトリを、ossfs などの別の OSS マウントターゲット上に作成しないでください。
LD_PRELOAD
プリロード対象の動的ライブラリのパスで、通常は
/usr/local/lib/libossc_preload.soです。一時的な環境変数として設定することを推奨します。例:LD_PRELOAD=/usr/local/lib/libossc_preload.so ENABLE_CONNECTOR=1 ./myappENABLE_CONNECTOR
OSS コネクタのプロセスロールを設定します。一時的な環境変数で有効化します。
-
`ENABLE_CONNECTOR=1`:プライマリコネクタロール
-
`ENABLE_CONNECTOR=2`:セカンダリコネクタロール
単一の実行中のインスタンスでは、プライマリコネクタプロセスは 1 つだけ許可されます。メインプロセス(例:エントリポイント)にプライマリロールを割り当てることを推奨します。コネクタを利用するその他のすべてのプロセスには、セカンダリコネクタロールを割り当てる必要があります。詳細については、「マルチノード起動における ray+vllm の例」をご参照ください。
-
モデルサービスの起動
シングルノード起動
vllm API サーバー
LD_PRELOAD=/usr/local/lib/libossc_preload.so \
ENABLE_CONNECTOR=1 OSS_ACCESS_KEY_ID=${OSS_ACCESS_KEY_ID} \
OSS_ACCESS_KEY_SECRET=${OSS_ACCESS_KEY_SECRET} \ OSS_ENDPOINT=${OSS_ENDPOINT} \
OSS_REGION=${OSS_REGION} \
OSS_PATH=${OSS_PATH} \
MODEL_DIR=/tmp/model \
python3 -m vllm.entrypoints.openai.api_server --model /tmp/model --trust-remote-code --tensor-parallel-size 1 --disable-custom-all-reduce
sglang API サーバー
LD_PRELOAD=/usr/local/lib/libossc_preload.so \
ENABLE_CONNECTOR=1 OSS_ACCESS_KEY_ID=${OSS_ACCESS_KEY_ID} \
OSS_ACCESS_KEY_SECRET=${OSS_ACCESS_KEY_SECRET} \ OSS_ENDPOINT=${OSS_ENDPOINT} \
OSS_REGION=${OSS_REGION} \
OSS_PATH=${OSS_PATH} \
MODEL_DIR=/tmp/model \
python3 -m sglang.launch_server --model-path /tmp/model --port 8000
マルチノード起動
ray+vllm
共通の環境変数:
export OSS_ACCESS_KEY_ID=${OSS_ACCESS_KEY_ID}
export OSS_ACCESS_KEY_SECRET=${OSS_ACCESS_KEY_SECRET}
export OSS_ENDPOINT=${OSS_ENDPOINT}
export OSS_REGION=${OSS_REGION}
export OSS_PATH=oss://examplebucket/
export MODEL_DIR=/tmp/models
`OSS_PATH` および `MODEL_DIR` 変数は対応関係にある必要があります。たとえば、OSS 上のモデルパスが `oss://examplebucket/qwen/Qwen2___5-72B/` の場合、ローカルモデルディレクトリは `/tmp/models/qwen/Qwen2___5-72B/` となります。
Pod A で ray head を起動します:
LD_PRELOAD=/usr/local/lib/libossc_preload.so ENABLE_CONNECTOR=1 ray start --head --dashboard-host 0.0.0.0 --block
Pod B で ray を起動し、クラスターに参加します:
LD_PRELOAD=/usr/local/lib/libossc_preload.so ENABLE_CONNECTOR=1 ray start --address='172.24.176.137:6379' --block // 172.24.176.137 は Pod の IP アドレスです。この値を head Pod の IP アドレスに置き換えてください。クラスターへの参加コマンドは、Pod A で `ray start` を実行した後の出力に表示されます。
vllm API サーバーを起動します:
LD_PRELOAD=/usr/local/lib/libossc_preload.so ENABLE_CONNECTOR=2 python3 -m vllm.entrypoints.openai.api_server --model ${MODEL_DIR}/qwen/Qwen2___5-72B/ --trust-remote-code --served-model-name ds --max-model-len 2048 --gpu-memory-utilization 0.98 --tensor-parallel-size 32
sglang
各ノード上の sglang プロセス用に環境変数を構成します。
プライマリノードの起動:
LD_PRELOAD=/usr/local/lib/libossc_preload.so \
ENABLE_CONNECTOR=1 OSS_ACCESS_KEY_ID=${OSS_ACCESS_KEY_ID} \
OSS_ACCESS_KEY_SECRET=${OSS_ACCESS_KEY_SECRET} \ OSS_ENDPOINT=${OSS_ENDPOINT} \
OSS_REGION=${OSS_REGION} \
OSS_PATH=${OSS_PATH} \
MODEL_DIR=/tmp/model \
python3 -m sglang.launch_server --model-path /tmp/model --port 8000 --dist-init-addr 192.168.1.1:20000 --nnodes 2 --node-rank 0
セカンダリノードの起動:
LD_PRELOAD=/usr/local/lib/libossc_preload.so \
ENABLE_CONNECTOR=1 OSS_ACCESS_KEY_ID=${OSS_ACCESS_KEY_ID} \
OSS_ACCESS_KEY_SECRET=${OSS_ACCESS_KEY_SECRET} \ OSS_ENDPOINT=${OSS_ENDPOINT} \
OSS_REGION=${OSS_REGION} \
OSS_PATH=${OSS_PATH} \
MODEL_DIR=/tmp/model \
python3 -m sglang.launch_server --model-path /tmp/model --port 8000 --dist-init-addr 192.168.1.1:20000 --nnodes 2 --node-rank 1
Kubernetes でのデプロイ
Kubernetes 環境で Pod をデプロイするには、まずコネクタをインストール済みのイメージをビルドし、リポジトリへプッシュします。以下の YAML ファイルは、Kubernetes Pod のデプロイメント例です:
apiVersion: v1
kind: ConfigMap
metadata:
name: connector-config
data:
config.json: |
{
"logLevel": 1,
"logPath": "/var/log/oss-connector/connector.log",
"auditPath": "/var/log/oss-connector/audit.log",
"expireTimeSec": 120,
"prefetch": {
"vcpus": 16,
"workers": 16
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: model-connector-deployment
spec:
selector:
matchLabels:
app: model-connector
template:
metadata:
labels:
app: model-connector
spec:
imagePullSecrets:
- name: acr-credential-beijing
hostNetwork: true
containers:
- name: container-name
image: {IMAGE_ADDRESS}
imagePullPolicy: Always
resources:
requests:
cpu: "24"
memory: "700Gi"
limits:
cpu: "128"
memory: "900Gi"
command:
- bash
- -c
- ENABLE_CONNECTOR=1 python3 -m vllm.entrypoints.openai.api_server --model /var/model --trust-remote-code --tensor-parallel-size 1 --disable-custom-all-reduce
env:
- name: LD_PRELOAD
value: "/usr/local/lib/libossc_preload.so"
- name: OSS_ENDPOINT
value: "oss-cn-beijing-internal.aliyuncs.com"
- name: OSS_REGION
value: "cn-beijing"
- name: OSS_PATH
value: "oss://examplebucket/qwen/Qwen1.5-7B-Chat/"
- name: MODEL_DIR
value: "/var/model/"
- name: OSS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: oss-access-key-connector
key: key
- name: OSS_ACCESS_KEY_SECRET
valueFrom:
secretKeyRef:
name: oss-access-key-connector
key: secret
volumeMounts:
- name: connector-config
mountPath: /etc/oss-connector/
terminationGracePeriodSeconds: 10
volumes:
- name: connector-config
configMap:
name: connector-config
パフォーマンステスト
シングルノードモデル読み込みテスト
テスト環境
|
メトリック |
説明 |
|
OSS |
中国 (北京)、内部ネットワークでのダウンロード帯域幅:250 Gbps |
|
テストノード |
ecs.g7nex.32xlarge、ネットワーク帯域幅:160 Gbps(80 Gbps × 2) |
統計メトリック
|
メトリック |
説明 |
|
モデルダウンロード |
コネクタを用いたモデルファイルのダウンロード開始から完了までの時間です。 |
|
エンドツーエンド |
vllm API サーバーの CPU 版が起動して準備完了状態になるまでの時間です。 |
テスト結果
|
モデル名 |
モデルサイズ(GB) |
モデルダウンロード時間(秒) |
エンドツーエンド時間(秒) |
|
Qwen2.5-14B |
27.522 |
1.7721 |
20.48 |
|
Qwen2.5-72B |
135.437 |
10.57 |
30.09 |
|
Qwen3-8B |
15.271 |
0.97 |
18.88 |
|
Qwen3-32B |
61.039 |
3.99 |
22.97 |