LeRobot documentation

ストリーミング動画エンコーディングガイド

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

ストリーミング動画エンコーディングガイド

1. 概要

ストリーミング動画エンコーディングにより、動画データセットの録画時の従来のPNG往復が不要になります。従来の方法では:

  1. フレームをキャプチャ -> PNGをディスクに書き込み -> (エピソード終了時) PNGを読み込み -> MP4にエンコード -> PNGを削除

フレームはキャプチャ中にリアルタイムでエンコードできます:

  1. フレームのキャプチャ -> エンコーダースレッドへのキューイング -> MP4への直接エンコード

これにより、save_episode()はほぼ即時に実行されるようになります(エピソードが終了する時点で動画はすでにエンコード済みです)。また、以前はエピソード間で発生していたブロッキングの待機が解消され、特に長時間のエピソードで複数のカメラを使用する場合にその効果が顕著です。

2. パラメータの調整

パラメータCLIフラグ型デフォルト説明
streaming_encoding--dataset.streaming_encodingboolFalseキャプチャ中にリアルタイムエンコーディングを有効にする
vcodec--dataset.rgb_encoder.vcodecstr"libsvtav1"ビデオコーデック。"auto"は最適なHWエンコーダーを検出します
encoder_threads--dataset.encoder_threadsint \| NoneNone(自動)エンコーダーインスタンスあたりのスレッド数。Noneの場合、vcodedが決定します
encoder_queue_maxsize--dataset.encoder_queue_maxsizeint30カメラごとのバッファリングされる最大フレーム数(30fpsで約1秒分)。RAMを消費します

3. 性能に関する考慮事項

ストリーミングエンコーディングとは、キャプチャループの最中にCPUが動画をエンコードすることを意味します。これにより、次の間で共有されなければならないCPU予算が生まれます。

  • 制御ループ(カメラの読み取り、ロボットの制御、非動画データの書き込み)
  • エンコーダースレッド(カメラごとに1つのプール)
  • 可視化の再実行(有効な場合)
  • OSおよびその他のプロセス

解像度とカメラ台数の影響

セットアップスループット(px/sec)CPUエンコーディングの読み込み注記
2camsx 640x480x3 @30fps55M低ほとんどのシステムで動作します
2camsx 1280x720x3 @30fps165M中程度モダンなシステムで快適に動作
2camsx 1920x1080x3 @30fps373M高高性能なハイエンドCPUが必要です

encoder_threadsのチューニング

このパラメータは、各エンコーダーインスタンスが内部で使用するスレッド数を制御します:

  • 高い値(例:4〜5):エンコード速度が速くなりますが、カメラごとに多くのCPUコアを使用します。コア数が豊富なハイエンドシステムに適しています。
  • 低い値(例:1〜2):カメラごとのCPU使用量が少なくなり、キャプチャや可視化のコアを確保できます。低解像度の画像や高性能なCPUに適しています。
  • None (デフォルト): コーデックに決定を委ねます。利用可能な情報はコーデックのログにあります。

バックプレッシャーとフレームのドロップ

各カメラには有界キュー(encoder_queue_maxsize、デフォルトは30フレーム)があります。エンコーダーが処理に追いつかない場合:

  1. キューが埋まっていく(RAMを消費する)
  2. 新しいフレームは破棄されます(ブロックされません)— キャプチャループは中断されずに続行されます
  3. 警告が記録されます: "Encoder queue full for {camera}, dropped N frame(s)"
  4. エピソード終了時、カメラごとの合計ドロップフレーム数が報告されます

エンコーダーの遅延の兆候

  • システムがカクカクしてフリーズする: すべての CPU が 100% になっています
  • ログ内のドロップフレーム警告、または記録されたデータセットで期待値を下回るフレーム数/FPS
  • ロボットの動きがぎこちない: CPU が深刻に過負荷状態にある場合、キャプチャループにも影響が出る可能性があります
  • 蓄積された再実行ラグ: 可視化がリアルタイムに追いつかない

4. ハードウェアアクセラレーションによるエンコーディング

使用タイミング

次の場合は、HWエンコーディングを使用してください:

  • CPUがボトルネック(フレームドロップ、ロボットの動作がカクカクする、rerunの遅延)
  • 互換性のあるハードウェア(GPUまたは専用エンコーダー)をお持ちです
  • 高スループット(高解像度または多数のカメラ)で記録しています

コーデックの選択

コーデックCPU使用率ファイルサイズ品質注記
libsvtav1(デフォルト)高最小ベストデフォルト。最も高い圧縮率ですが、CPU負荷も最大です
h264中程度約30〜50%大きい良いソフトウェア H.264。CPU負荷の低減
HWエンコーダー非常に低い最大良い専用ハードウェアにオフロードします。CPUリソースが制約されているシステムに最適です

利用可能なHWエンコーダー

エンコーダープラットフォームハードウェアCLI 値
h264_videotoolboxmacOSApple Silicon / Intel--dataset.rgb_encoder.vcodec=h264_videotoolbox
hevc_videotoolboxmacOSApple Silicon / Intel--dataset.rgb_encoder.vcodec=hevc_videotoolbox
h264_nvencLinux/WindowsNVIDIA GPU--dataset.rgb_encoder.vcodec=h264_nvenc
hevc_nvencLinux/WindowsNVIDIA GPU--dataset.rgb_encoder.vcodec=hevc_nvenc
h264_vaapiLinuxIntel/AMD GPU--dataset.rgb_encoder.vcodec=h264_vaapi
h264_qsvLinux/WindowsIntel Quick Sync--dataset.rgb_encoder.vcodec=h264_qsv
autoすべて利用可能なHWエンコーダをシステムにクエリします。HWエンコーダが見つからない場合はlibsvtav1にフォールバックします--dataset.rgb_encoder.vcodec=auto

HWアクセラレーション対応エンコーダーを使用するには、GPUドライバーのアップグレードが必要な場合があります。

libsvtav1がデフォルトであるのは、最も優れた学習パフォーマンスを提供するためです。他のvcodecsはCPU使用量を削減し、より高速になる場合がありますが、通常はファイルサイズが大きくなり、学習時間に影響を与える可能性があります。

5. トラブルシューティング

症状考えられる原因修正
システムがフリーズする、ロボットの動作がぎこちなくなる、またはRerunのビジュアライゼーションが遅延するCPUが逼迫(負荷使用率100%)他のアプリを閉じ、エンコードのスループットを下げ、encoder_threadsを減らし、h264を使用し、display_data=Falseを使用してください。CPUが引き続き100%のままの場合、お使いの環境では性能が不足している可能性があります。--dataset.streaming_encoding=falseまたはHWエンコード(--dataset.rgb_encoder.vcodec=auto)を検討してください。
データセットにおける「Encoder queue full」の警告やフレームのドロップエンコーダーが追いついていない(キューのオーバーフロー)CPUが100%に達していない場合: encoder_threadsを増やす、encoder_queue_maxsizeを増やす、またはHWエンコーディングを使用する(--dataset.rgb_encoder.vcodec=auto)。
RAM使用量が高いエンコードよりキューの充填が速いencoder_threads が低すぎるか、CPU が不足しています。encoder_queue_maxsize を減らすか、HW エンコーディングを使用してください。
大規模な動画ファイルHWエンコーダーまたはH.264の使用想定されるトレードオフ。CPUが許可している場合はlibsvtav1に切り替えてください
save_episode() がまだ遅いstreaming_encoding は False です--dataset.streaming_encoding=true を設定します
エンコーダースレッドのクラッシュコーデックが利用できないか、設定が無効ですvcodecがインストールされていることを確認し、--dataset.rgb_encoder.vcodec=autoを試してください。
記録されたデータセットにフレームが欠落していますCPU/GPUの逼迫または一時的な負荷の急増フレームの約5%が欠落している場合、システムが過負荷状態である可能性が高いです。上記の推奨事項に従ってください。欠落しているフレームが少ない場合(約2%)、それは一時的な負荷の急増(起動時によく見られます)によるものと考えられ、想定内の範囲とみなすことができます。

6. 推奨設定

これらの推定値は保守的なものです。ご自身の環境でテストすることをお勧めします。低い負荷から開始し、徐々に負荷を上げていきましょう。

ハイエンドシステム: 最新の12コア以上(24スレッド以上)

CPUでのスループットは、約250〜500M px/sec程度であれば快適に動作するはずです。さらに良い結果を得たい場合は、利用可能な場合はHWエンコーディングを試してください。

# 3camsx 1280x720x3 @30fps: Defaults work well. Optionally increase encoder parallelism.
# 2camsx 1920x1080x3 @30fps: Defaults work well. Optionally increase encoder parallelism.
lerobot-record --dataset.encoder_threads=5 ...

# 3camsx 1920x1080x3 @30fps: Might require some tuning.

ミッドレンジシステム: 最新の8コア以上(16スレッド以上)またはApple Silicon

CPUでは、約80〜300M px/secのスループットが実現可能であるはずです。

# 3camsx 640x480x3 @30fps: Defaults work well. Optionally decrease encoder parallelism.
# 2camsx 1280x720x3 @30fps: Defaults work well. Optionally decrease encoder parallelism.
lerobot-record --dataset.encoder_threads=2 ...

# 2camsx 1920x1080x3 @30fps: Might require some tuning.

リソースが限られたシステム: 最新の4コア以上(8スレッド以上)またはRaspberry Pi 5

制約の厳しいシステムでは、ストリーミングエンコードがキャプチャループと過度に競合する可能性があります。これを無効化すると、エピソード間でエンコードが行われるPNGベースのアプローチにフォールバックします(ブロッキングは発生しますが、キャプチャには干渉しません)。また、キャプチャとエンコードの負荷を軽減するために、スループットを低くして記録することも検討してください。さらに、コーデックをh264に変更し、バッチエンコードを使用することも検討してください。

# 2camsx 640x480x3 @30fps: Requires some tuning.

# Use H.264, disable streaming, consider batching encoding
lerobot-record --dataset.rgb_encoder.vcodec=h264 --dataset.streaming_encoding=false ...

7. 結びの言葉

パフォーマンスは最終的に、正確なセットアップ — フレームレート、解像度、CPU コア数と負荷、利用可能なメモリ、エピソードの長さ、選択したエンコーダー — に依存します。必ずターゲットのワークロードでテストし、CPU とシステム的能力に注意を払い、encoder_threads、encoder_queue_maxsize、vcodec を適切に調整してください。とはいえ、一般的な実用的な設定(多くのアプリケーションにおいて)は、640×480x3 @30fps の 3 台のカメラです。これは、モダンなシステムではデフォルトのストリーミング動画エンコード設定で通常問題なく動作します。記録されたデータセットが健全であることを確認するために、必ず動画の再生時間を CLI のエピソード時間と比較し、行数が FPS × CLI 時間と等しいことを確認してください。

Update on GitHub