LeRobot documentation
Panduan Pengkodean Video Streaming
Panduan Pengkodean Video Streaming
1. Gambaran umum
Encoding video streaming menghilangkan round-trip PNG tradisional selama perekaman dataset video. Sebagai gantinya:
- Ambil frame -> tulis PNG ke disk -> (di akhir episode) baca PNG -> encode ke MP4 -> hapus PNG
Frame dapat dikodekan secara real-time selama proses pengambilan:
- Ambil frame -> antre ke thread encoder -> encode langsung ke MP4
Hal ini membuat save_episode() hampir instan (video sudah terenkod saat episode berakhir) dan menghilangkan penantian pemblokiran yang sebelumnya terjadi antar episode, terutama dengan beberapa kamera dalam episode panjang.
2. Menyetel Parameter
| Parameter | Flag CLI | Tipe | Default | Deskripsi |
|---|---|---|---|---|
streaming_encoding | --dataset.streaming_encoding | bool | False | Aktifkan pengkodean waktu nyata selama pengambilan |
vcodec | --dataset.rgb_encoder.vcodec | str | "libsvtav1" | Codec video. "auto" mendeteksi encoder HW terbaik |
encoder_threads | --dataset.encoder_threads | int \| None | None (otomatis) | Jumlah thread per instance encoder. None akan membiarkan vcoded memutuskan |
encoder_queue_maxsize | --dataset.encoder_queue_maxsize | int | 30 | Frame buffer maksimum per kamera (~1 detik pada 30fps). Mengonsumsi RAM |
3. Pertimbangan Performa
Streaming encoding berarti CPU meng-encode video selama loop pengambilan, bukan setelahnya. Hal ini menciptakan anggaran CPU yang harus dibagi antara:
- Loop kontrol (membaca kamera, mengontrol robot, menulis data non-video)
- Thread encoder (satu pool per kamera)
- Jalankan ulang visualisasi (jika diaktifkan)
- Sistem operasi dan proses lain
Dampak Resolusi & Jumlah Kamera
| Setup | Throughput (px/detik) | Beban Encoding CPU | Catatan |
|---|---|---|---|
| 2camsx 640x480x3 @30fps | 55M | Rendah | Berfungsi di sebagian besar sistem |
| 2camsx 1280x720x3 @30fps | 165M | Sedang | Nyaman di sistem modern |
| 2camsx 1920x1080x3 @30fps | 373M | Tinggi | Memerlukan CPU kelas atas yang bertenaga |
encoder_threads Penyetelan
Parameter ini mengontrol berapa banyak thread yang digunakan secara internal oleh setiap instance encoder:
- Nilai yang lebih tinggi (misalnya, 4-5): Enkoding lebih cepat, tetapi menggunakan lebih banyak inti CPU per kamera. Cocok untuk sistem kelas atas dengan banyak inti.
- Nilai yang lebih rendah (misalnya, 1-2): Penggunaan CPU per kamera lebih sedikit, sehingga inti CPU tersedia untuk pengambilan gambar dan visualisasi. Cocok untuk gambar beresolusi rendah dan CPU yang mumpuni.
None(default): Membiarkan codec yang memutuskan. Informasi tersedia di log codec.
Backpressure dan Penghapusan Frame
Setiap kamera memiliki antrean terbatas (encoder_queue_maxsize, default 30 frame). Ketika encoder tidak mampu mengimbangi:
- Antrean terisi penuh (mengonsumsi RAM)
- Frame baru dibuang (tidak diblokir) — loop penangkapan terus berjalan tanpa terputus
- Peringatan dicatat:
"Encoder queue full for {camera}, dropped N frame(s)" - Di akhir episode, total frame yang hilang per kamera dilaporkan
Gejala Encoder yang Tertinggal
- Sistem terasa lambat dan membeku: semua CPU berada di 100%
- Peringatan frame yang hilang di log atau frame/FPS yang lebih rendah dari yang diharapkan dalam dataset yang direkam
- Pergerakan robot yang tersendat: Jika CPU sangat terbebani, bahkan loop penangkapan pun dapat terpengaruh
- Penundaan rerun yang terakumulasi: Visualisasi tertinggal dari waktu nyata
4. Enkoding yang Dipercepat Perangkat Keras
Kapan Digunakan
Gunakan encoding HW saat:
- CPU adalah titik kemacetan (frame terlewat, gerakan robot tersendat, lag rerun)
- Anda memiliki perangkat keras yang kompatibel (GPU atau encoder khusus)
- Anda merekam dengan throughput tinggi (resolusi tinggi atau dengan banyak kamera)
Memilih Codec
| Codec | Penggunaan CPU | Ukuran File | Kualitas | Catatan |
|---|---|---|---|---|
libsvtav1 (default) | Tinggi | Terkecil | Terbaik | Default. Kompresi terbaik tetapi paling intensif CPU |
h264 | Sedang | ~30-50% lebih besar | Bagus | Perangkat lunak H.264. CPU lebih rendah |
| Encoder HW | Sangat Rendah | Terbesar | Bagus | Membongkar ke perangkat keras khusus. Paling cocok untuk sistem yang terbatas CPU |
Encoder HW yang Tersedia
| Encoder | Platform | Perangkat Keras | Nilai CLI |
|---|---|---|---|
h264_videotoolbox | macOS | Apple Silicon / Intel | --dataset.rgb_encoder.vcodec=h264_videotoolbox |
hevc_videotoolbox | macOS | Apple Silicon / Intel | --dataset.rgb_encoder.vcodec=hevc_videotoolbox |
h264_nvenc | Linux/Windows | NVIDIA GPU | --dataset.rgb_encoder.vcodec=h264_nvenc |
hevc_nvenc | Linux/Windows | NVIDIA GPU | --dataset.rgb_encoder.vcodec=hevc_nvenc |
h264_vaapi | Linux | GPU Intel/AMD | --dataset.rgb_encoder.vcodec=h264_vaapi |
h264_qsv | Linux/Windows | Intel Quick Sync | --dataset.rgb_encoder.vcodec=h264_qsv |
auto | Semua | Mendeteksi sistem untuk encoder HW yang tersedia. Kembali ke libsvtav1 jika tidak ada encoder HW yang ditemukan | --dataset.rgb_encoder.vcodec=auto |
Untuk menggunakan encoder yang dipercepat oleh HW, Anda mungkin perlu memperbarui driver GPU Anda.
libsvtav1adalah default karena memberikan kinerja pelatihan terbaik; vcodec lain dapat mengurangi penggunaan CPU dan lebih cepat, tetapi biasanya menghasilkan file yang lebih besar dan dapat memengaruhi waktu pelatihan.
5. Pemecahan masalah
| Gejala | Kemungkinan Penyebab | Perbaiki |
|---|---|---|
| Sistem membeku atau gerakan robot tersendat atau visualisasi Rerun lambat | CPU kekurangan (penggunaan beban 100%) | Tutup aplikasi lain, kurangi throughput encoding, turunkan encoder_threads, gunakan h264, gunakan display_data=False. Jika CPU tetap berada di 100%, kemungkinan CPU tidak memadai untuk setup Anda, pertimbangkan --dataset.streaming_encoding=false atau encoding HW (--dataset.rgb_encoder.vcodec=auto) |
| Peringatan “Encoder queue full” atau frame yang hilang dalam dataset | Encoder tidak mampu mengimbangi (Queue overflow) | Jika CPU tidak berada di 100%: tingkatkan encoder_threads, tingkatkan encoder_queue_maxsize atau gunakan encoding HW (--dataset.rgb_encoder.vcodec=auto). |
| Penggunaan RAM tinggi | Antrean terisi lebih cepat daripada encoding | encoder_threads terlalu rendah atau CPU tidak memadai. Kurangi encoder_queue_maxsize atau gunakan encoding HW |
| File video berukuran besar | Menggunakan encoder HW atau H.264 | Kompromi yang diharapkan. Beralih ke libsvtav1 jika CPU mengizinkan |
save_episode() masih lambat | streaming_encoding adalah False | Setel --dataset.streaming_encoding=true |
| Crash thread encoder | Codec tidak tersedia atau pengaturan tidak valid | Periksa apakah vcodec terinstal, coba --dataset.rgb_encoder.vcodec=auto |
| Dataset yang direkam tidak memiliki frame | Kelaparan CPU/GPU atau lonjakan beban sesekali | Jika ~5% frame hilang, sistem Anda kemungkinan mengalami beban berlebih — ikuti rekomendasi di atas. Jika lebih sedikit frame yang hilang (~2%), hal itu kemungkinan disebabkan oleh lonjakan beban transien sesekali (sering terjadi saat startup) dan dapat dianggap sebagai hal yang wajar. |
6. Konfigurasi yang Direkomendasikan
Estimasi ini bersifat konservatif; kami merekomendasikan untuk mengujinya pada konfigurasi Anda—mulai dengan beban rendah dan tingkatkan secara bertahap.
Sistem Kelas Atas: 12+ inti modern (24+ thread)
Throughput antara ~250-500M px/sec seharusnya nyaman di CPU. Untuk hasil yang lebih baik, coba HW encoding jika tersedia.
# 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.Sistem Menengah: 8+ inti modern (16+ thread) atau Apple Silicon
Throughput antara ~80-300M px/sec seharusnya mungkin dicapai di CPU.
# 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.Sistem Berbasis Sumber Daya Rendah: 4+ inti modern (8+ thread) atau Raspberry Pi 5
Pada sistem yang sangat terbatas, streaming encoding mungkin terlalu banyak bersaing dengan loop capture. Menonaktifkannya akan kembali ke pendekatan berbasis PNG di mana encoding terjadi di antara episode (blocking, tetapi tidak mengganggu capture). Sebagai alternatif, rekam pada throughput yang lebih rendah untuk mengurangi beban capture dan encoding. Pertimbangkan juga untuk mengubah codec menjadi h264 dan menggunakan batch encoding.
# 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. Catatan penutup
Performa pada akhirnya bergantung pada konfigurasi spesifik Anda — frame-per-detik, resolusi, jumlah dan beban core CPU, memori yang tersedia, panjang episode, dan encoder yang Anda pilih. Selalu uji dengan beban kerja target Anda, perhatikan kemampuan CPU & sistem Anda, dan atur encoder_threads, encoder_queue_maxsize, serta vcodec secara wajar. Meskipun demikian, konfigurasi praktis yang umum (untuk banyak aplikasi) adalah tiga kamera pada 640×480x3 @30fps; ini biasanya berjalan baik dengan pengaturan encoding video streaming bawaan di sistem modern. Selalu verifikasi bahwa dataset yang Anda rekam sehat dengan membandingkan durasi video terhadap durasi episode CLI dan memastikan jumlah baris sama dengan FPS × durasi CLI.