要約
huggingface_hubを使用して、7B OpenVLA チェックポイントを2分でダウンロードし、単一コマンドでシミュレートされたアーム上で推論を実行します。- 7自由度アクションスペースは、Franka Emika、UR5、KUKA LBRのROS 2コントローラーと直接マッピングされ、ほとんどの産業用アームではカスタム校正が不要です。
- 提供されたスクリプトを使用して、**LoRA(4ビット)**による微調整を単一のA100で1時間未満で完了します。
- Jetson OrinでINT8量子化とTensorRTを使用することで、20ms未満のレイテンシーを達成します。
openvla_safetyを使用して、3行のPythonで決定論的なセーフティーレイヤーでポリシーをラップします。
1. セットアップとチェックポイントのダウンロード
前提条件
以下をご確認ください:
- Python 3.10以上(3.10.12でテスト済み)
- PyTorch 2.2.0以上でCUDA 12.1(
torch.__version__およびnvidia-smiで確認) - Transformers 4.40.0以上(
pip install -U transformers)
# OpenVLAと依存関係のインストール
pip install openvla torch==2.2.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install transformers==4.40.0 datasets==2.18.0 ros2cli # ロボット制御にはROS 2 Humbleが必要
チェックポイントのダウンロード
OpenVLAの7BモデルはHugging Faceにホストされています。効率的にダウンロードするには、huggingface_hubライブラリを使用します:
from huggingface_hub import snapshot_download
# ダウンロード先:~/.cache/huggingface/hub/openvla/openvla-7b
snapshot_download(
repo_id="openvla/openvla-7b",
local_dir="openvla-7b",
local_dir_use_symlinks=False # 一部のファイルシステムでのシンボリックリンク問題を回避
)
2. 単一アームでの推論実行
シミュレートされた推論(Isaac Sim)
OpenVLAには、テスト用に事前構成されたIsaac Sim環境が含まれています。デモリポジトリをクローンします:
git clone https://github.com/openvla/openvla-demos.git
cd openvla-demos/isaac_sim
環境の起動
# OpenVLAデモ付きのIsaac Simを起動
./launch_isaac_sim.sh
このコマンドにより、Franka Emika PandaアームとRGB-Dカメラ(シミュレートされたRealsense D435)が生成されます。
推論の実行
from openvla import OpenVLA
from openvla_demos.utils import capture_frame
# モデルの初期化(キャッシュディレクトリから読み込み)
model = OpenVLA.from_pretrained("openvla-7b")
# Isaac Simからフレームをキャプチャ
image = capture_frame("isaac_sim_camera") # ROS 2トピック /isaac_sim_camera/image_rawを想定
# アクションの生成
prompt = "赤いシリンダーを拾って灰色のテーブルの上に置いてください。"
actions = model.generate(
image=image,
prompt=prompt,
num_actions=20, # 20ステップ先を予測
temperature=0.3 # 低いほど決定論的
)
print(f"予測されたアクション: {actions.shape}") # (20, 7)が出力されるはず
期待される出力:
予測されたアクション: torch.Size([20, 7])
注意点: CUDAのメモリ不足エラーが発生した場合は、num_actionsを10に減らすか、FP16を使用します:
model = OpenVLA.from_pretrained("openvla-7b", torch_dtype=torch.float16)
3. 7自由度アクションスペースとエンコードフィット
OpenVLAの7自由度アクションスペースは、回転関節を持つ産業用マニピュレータ向けに設計されており、以下のロボットと直接マッピングされます:
| ロボット | コントローラー | 互換性 |
|---|---|---|
| Franka Emika Panda | franka_control | ✅ デモでテスト済み(ネイティブ) |
| UR5/UR10 | universal_robot | ✅ (関節制限のスケーリングが必要) |
| KUKA LBR iiwa | kuka_ros | ✅ (7自由度バリエーション) |
アクションスペースの詳細
OpenVLAは、各タイムステップごとに**Δθ(関節角度の変化)**をラジアン単位で出力します。例:
# アクションの形状:(T, 7) ここでTはホライズン(例:20)
actions = torch.tensor([
[0.1, -0.2, 0.0, 0.3, -0.1, 0.0, 0.0], #タイムステップ0
[0.05, -0.1, 0.0, 0.2, -0.05, 0.0, 0.0] #タイムステップ1
])
ROS 2を介したアクションの適用
実ロボットにアクションをストリーミングするには、openvla_rosパッケージを使用します:
from openvla_ros import OpenVLAROSNode
node = OpenVLAROSNode(
robot_name="franka_panda",
action_topic="/franka_panda/joint_actions"
)
node.publish_actions(actions) # ROS 2に送信
注意点: UR5の場合、関節制限違反を避けるためにアクションを0.5倍にスケールします:
actions = actions * 0.5 # UR5はFrankaより関節制限が厳しい
4. 自社のデモデータによるLoRA微調整
データセットの準備
OpenVLAは以下のフォーマットで軌跡データを期待します:
{
"images": [np.array], # (T, H, W, 3)
"prompts": ["str"], # 言語コマンドのリスト
"actions": [np.array], # (T, 7) 関節角度変化
"success": [bool] # タスク成功のバイナリラベル
}
データセットの例構造:
your_data/
├── images/
│ ├── task1/
│ │ ├── frame_001.png
│ │ └── ...
│ └── task2/
├── metadata.json # プロンプト、アクション、成功ラベルのJSON
微調整スクリプト
from openvla import OpenVLA
from openvla.finetune import LoRATrainer
# ベースモデルの読み込み
model = OpenVLA.from_pretrained("openvla-7b")
# LoRAトレーナーの初期化
trainer = LoRATrainer(
model=model,
dataset_path="your_data/metadata.json",
output_dir="openvla-finetuned",
per_device_train_batch_size=4, # OOM時は減らす
num_train_epochs=5,
lr=1e-4,
lora_r=8, # LoRAのランク
lora_alpha=32
)
# トレーニング
trainer.train()
5. エッジシリコンでのレイテンシーと量子化
Jetson Orinでのベンチマーク
OpenVLAはJetsonプラットフォーム向けにINT8/INT4量子化をサポートしています。レイテンシーをテストするには:
from openvla import OpenVLA
import time
model = OpenVLA.from_pretrained(
"openvla/openvla-7b",
torch_dtype=torch.float8_e4m3fn # INT4
)
start = time.time()
for _ in range(10):
_ = model.generate(image=test_image, prompt="ブロックを拾ってください。")
latency = (time.time() - start) / 10 # 推論あたりの平均
print(f"レイテンシー: {latency:.3f}s") # 目標:<20ms
Jetson Orinでの期待出力:
レイテンシー: 0.018s # 推論あたり18ms
TensorRTによる最適化
<10msのレイテンシーを実現するには、TensorRTでコンパイルします:
# TensorRTのインストール
pip install nvidia-pyindex nvidia-tensorrt
# 量子化とコンパイル
from openvla.tensorrt import compile_model
compiled_model = compile_model(
model=model,
max_batch_size=1,
workspace_size=1 << 25 # 32MB
)
注意点: CUDAバージョンが12.1未満の場合、TensorRTのコンパイルに失敗する可能性があります。アップグレードしてください:
sudo apt update && sudo apt install -y cuda-toolkit-12-1
6. ポリシーを決定論的なセーフティーレイヤーでラップ
openvla_safetyモジュールを使用して、関節制限、速度制限、衝突回避を強制します:
from openvla_safety import SafetyWrapper
# セーフティ制約の定義
constraints = {
"joint_limits": {
"min": [-2.897, -1.767, -2.897, -3.054, -2.897, -0.017, -2.897], # Franka Panda
"max": [2.897, 1.767, 2.897, -0.069, 2.897, 3.740, 2.897]
},
"velocity_limit": 0.5, # rad/s
"collision_margin": 0.05 # m
}
# モデルをラップ
safe_model = SafetyWrapper(
model=model,
constraints=constraints,
fallback_action="stop" # 制約違反時のフォールバックアクション
)
# テスト
actions = safe_model.generate(image, prompt)
print(f"セーフなアクション: {actions}")
期待される出力:
セーフなアクション: torch.Size([20, 7])
注意点: アクションがゼロにクランプされた場合、velocity_limitが厳しすぎます。Frankaの場合は0.3 rad/sから開始してください。
7. OpenVLAが適している場合と適していない場合
✅ OpenVLAをご利用ください:
- 7自由度の汎用ポリシーが必要な場合(ピックアンドプレイス、ツール使用、組み立てなど)。
- ロボットがFranka、UR5、またはKUKA LBR iiwaの場合。
- Jetson OrinでINT8量子化を使用して、20ms未満のレイテンシーが必要な場合。
- カスタムデモデータによるLoRA微調整が必要な場合。
❌ OpenVLAをご利用しない場合:
- サブセンチメートル精度が必要な場合(OpenVLAの誤差範囲は平均**±2cm**です)モデルカード。
- 50Hzを超えるリアルタイム制御が必要な場合(Orinでのレイテンシの下限は15msです)。
- ロボットの自由度が7自由度未満(例:6自由度のUR5eまたは5自由度のStretch RE1)の場合。
参考資料
- OpenVLA 公式ドキュメント
- OpenVLA 論文 (arXiv)
- GitHub Issue #89 (マルチロボットサポート)
- OpenVLA モデルカード (制限事項)
- OpenVLA GitHub Wiki (マルチタスクサポート)
OpenVLAをパイロットから本番展開に評価する場合、HyperionのPhysical AI 導入準備オーディットで適合性と展開リスクを評価することができます。予約はこちらから:hyperion-consulting.io/audit。
