LeRobot documentation
Hướng dẫn mã hóa video trực tiếp
Hướng dẫn mã hóa video trực tiếp
1. Tổng quan
Việc mã hóa video dạng streaming loại bỏ vòng lặp PNG truyền thống trong quá trình ghi bộ dữ liệu video. Thay vì:
- Chụp khung hình -> ghi PNG ra đĩa -> (khi kết thúc tập) đọc các tệp PNG -> mã hóa thành MP4 -> xóa các tệp PNG
Các khung hình có thể được mã hóa theo thời gian thực trong quá trình thu thập:
- Chụp khung hình -> đưa vào hàng đợi cho luồng mã hóa -> mã hóa trực tiếp thành MP4
Điều này giúp save_episode() gần như tức thì (video đã được mã hóa xong trước khi episode kết thúc) và loại bỏ thời gian chờ chặn trước đó xảy ra giữa các episode, đặc biệt là khi có nhiều camera trong các episode dài.
2. Điều chỉnh tham số
| Tham số | Cờ CLI | Loại | Mặc định | Mô tả |
|---|---|---|---|---|
streaming_encoding | --dataset.streaming_encoding | bool | False | Bật mã hóa thời gian thực trong quá trình thu |
vcodec | --dataset.rgb_encoder.vcodec | str | "libsvtav1" | Bộ mã hóa video. "auto" tự động phát hiện trình mã hóa phần cứng tốt nhất |
encoder_threads | --dataset.encoder_threads | int \| None | None (tự động) | Số luồng cho mỗi instance encoder. None sẽ để vcoded tự quyết định |
encoder_queue_maxsize | --dataset.encoder_queue_maxsize | int | 30 | Số khung hình đệm tối đa cho mỗi camera (~1 giây ở 30fps). Tiêu tốn RAM |
3. Cân nhắc về hiệu năng
Streaming encoding có nghĩa là CPU mã hóa video trong khi vòng lặp ghi hình đang chạy, chứ không phải sau đó. Điều này tạo ra một ngân sách CPU phải được chia sẻ giữa:
- Vòng lặp điều khiển (đọc camera, điều khiển robot, ghi dữ liệu không phải video)
- Threads mã hóa (một pool cho mỗi camera)
- Chạy lại trực quan hóa (nếu được bật)
- Hệ điều hành và các tiến trình khác
Tác động của Độ phân giải & Số lượng Camera
| Cài đặt | Thông lượng (px/giây) | Tải mã hóa CPU | Ghi chú |
|---|---|---|---|
| 2camsx 640x480x3 @30fps | 55M | Thấp | Hoạt động trên hầu hết các hệ thống |
| 2camsx 1280x720x3 @30fps | 165M | Trung bình | Thoải mái trên các hệ thống hiện đại |
| 2camsx 1920x1080x3 @30fps | 373M | Cao | Yêu cầu CPU cao cấp mạnh mẽ |
encoder_threads Điều chỉnh
Tham số này kiểm soát số lượng luồng mà mỗi phiên bản encoder sử dụng bên trong:
- Giá trị cao hơn (ví dụ: 4-5): Mã hóa nhanh hơn, nhưng sử dụng nhiều lõi CPU hơn cho mỗi camera. Phù hợp với các hệ thống cao cấp có nhiều lõi.
- Giá trị thấp hơn (ví dụ: 1-2): Ít CPU hơn cho mỗi camera, giải phóng nhân cho việc thu thập và trực quan hóa. Phù hợp với ảnh độ phân giải thấp và CPU mạnh.
None(mặc định): Để codec tự quyết định. Thông tin có sẵn trong nhật ký của codec.
Backpressure và Bỏ Khung
Mỗi camera có một hàng đợi có giới hạn (encoder_queue_maxsize, mặc định là 30 khung hình). Khi bộ mã hóa không theo kịp:
- Hàng đợi bị đầy (tiêu tốn RAM)
- Các khung mới sẽ bị bỏ qua (không bị chặn) — vòng lặp ghi hình tiếp tục không bị gián đoạn
- Một cảnh báo được ghi lại:
"Encoder queue full for {camera}, dropped N frame(s)" - Vào cuối mỗi tập, tổng số khung hình bị bỏ qua cho mỗi camera sẽ được báo cáo
Các triệu chứng của việc Encoder bị tụt lại
- Hệ thống bị giật và đơ: tất cả CPU đều ở mức 100%
- Cảnh báo khung bị bỏ trong nhật ký hoặc số khung/FPS thấp hơn dự kiến trong bộ dữ liệu được ghi
- Chuyển động robot giật cục: Nếu CPU quá tải nghiêm trọng, ngay cả vòng lặp ghi hình cũng có thể bị ảnh hưởng
- Độ trễ chạy lại tích lũy: Trực quan hóa bị tụt lại so với thời gian thực
4. Mã hóa tăng tốc bằng phần cứng
Khi nào nên sử dụng
Sử dụng mã hóa phần cứng khi:
- CPU là nút thắt cổ chai (bị rơi khung hình, robot giật, độ trễ rerun)
- Bạn có phần cứng tương thích (GPU hoặc bộ mã hóa chuyên dụng)
- Bạn đang ghi hình với thông lượng cao (độ phân giải cao hoặc với nhiều camera)
Chọn Codec
| Codec | Sử dụng CPU | Kích thước tệp | Chất lượng | Ghi chú |
|---|---|---|---|---|
libsvtav1 (mặc định) | Cao | Nhỏ nhất | Tốt nhất | Mặc định. Nén tốt nhất nhưng tốn CPU nhất |
h264 | Trung bình | lớn hơn ~30-50% | Tốt | Phần mềm H.264. CPU thấp hơn |
| Bộ mã hóa phần cứng | Rất Thấp | Lớn nhất | Tốt | Chuyển tải sang phần cứng chuyên dụng. Tốt nhất cho các hệ thống bị giới hạn CPU |
Bộ mã hóa phần cứng khả dụng
| Bộ mã hóa | Nền tảng | Phần cứng | Giá trị 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 | GPU NVIDIA | --dataset.rgb_encoder.vcodec=h264_nvenc |
hevc_nvenc | Linux/Windows | GPU NVIDIA | --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 | Bất kỳ | Kiểm tra hệ thống để tìm các trình mã hóa phần cứng khả dụng. Nếu không tìm thấy trình mã hóa phần cứng, sẽ chuyển sang libsvtav1 | --dataset.rgb_encoder.vcodec=auto |
Để sử dụng các bộ mã hóa được tăng tốc bằng phần cứng, bạn có thể cần nâng cấp trình điều khiển GPU của mình.
libsvtav1là mặc định vì nó cung cấp hiệu suất huấn luyện tốt nhất; các vcodecs khác có thể giảm mức sử dụng CPU và nhanh hơn, nhưng chúng thường tạo ra các tệp lớn hơn và có thể ảnh hưởng đến thời gian huấn luyện.
5. Khắc phục sự cố
| Triệu chứng | Nguyên nhân có thể | Sửa |
|---|---|---|
| Hệ thống bị đơ hoặc chuyển động của robot bị giật hoặc hình ảnh trực quan hóa Rerun bị trễ | CPU thiếu hụt (tải sử dụng 100%) | Đóng các ứng dụng khác, giảm thông lượng mã hóa, giảm encoder_threads, sử dụng h264, sử dụng display_data=False. Nếu CPU vẫn ở mức 100% thì có thể phần cứng không đủ cho cấu hình của bạn, hãy cân nhắc --dataset.streaming_encoding=false hoặc mã hóa phần cứng (--dataset.rgb_encoder.vcodec=auto) |
| Cảnh báo “Encoder queue full” hoặc các khung hình bị bỏ trong bộ dữ liệu | Encoder không theo kịp (Tràn hàng đợi) | Nếu CPU không đạt 100%: tăng encoder_threads, tăng encoder_queue_maxsize hoặc sử dụng mã hóa phần cứng (--dataset.rgb_encoder.vcodec=auto). |
| Sử dụng RAM cao | Hàng đợi đầy nhanh hơn mã hóa | encoder_threads quá thấp hoặc CPU không đủ. Giảm encoder_queue_maxsize hoặc sử dụng mã hóa phần cứng |
| Các tệp video lớn | Sử dụng bộ mã hóa phần cứng hoặc H.264 | Đánh đổi kỳ vọng. Chuyển sang libsvtav1 nếu CPU cho phép |
save_episode() vẫn còn chậm | streaming_encoding là False | Đặt --dataset.streaming_encoding=true |
| Lỗi crash luồng Encoder | Codec không khả dụng hoặc cài đặt không hợp lệ | Kiểm tra xem vcodec đã được cài đặt chưa, hãy thử --dataset.rgb_encoder.vcodec=auto |
| Bộ dữ liệu được ghi thiếu các khung hình | Sự thiếu hụt CPU/GPU hoặc các đợt tăng tải đột ngột | Nếu ~5% các khung hình bị thiếu, hệ thống của bạn có khả năng đang quá tải — hãy làm theo các khuyến nghị ở trên. Nếu ít khung hình bị thiếu hơn (~2%), chúng có thể do các đợt tăng tải tạm thời thỉnh thoảng xảy ra (thường là khi khởi động) và có thể được coi là bình thường. |
6. Cấu hình được khuyến nghị
Các ước tính này mang tính thận trọng; chúng tôi khuyến nghị bạn kiểm tra chúng trên hệ thống của mình—bắt đầu với tải thấp và tăng dần.
Hệ thống cao cấp: 12+ lõi hiện đại (24+ luồng)
Thông lượng khoảng ~250-500M px/sec nên là mức thoải mái trên CPU. Để có kết quả tốt hơn, hãy thử mã hóa phần cứng nếu có sẵn.
# 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.Hệ thống tầm trung: 8+ lõi hiện đại (16+ luồng) hoặc Apple Silicon
Thông lượng khoảng ~80-300M px/giây nên có thể đạt được trên 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.Hệ thống tài nguyên thấp: 4+ lõi hiện đại (8+ luồng) hoặc Raspberry Pi 5
Trên các hệ thống có tài nguyên rất hạn chế, việc mã hóa theo dạng streaming có thể cạnh tranh quá mạnh với vòng lặp ghi hình. Việc tắt tính năng này sẽ quay lại phương pháp dựa trên PNG, trong đó quá trình mã hóa diễn ra giữa các episode (có tính chặn, nhưng không gây nhiễu cho quá trình ghi hình). Ngoài ra, hãy cân nhắc ghi hình với thông lượng thấp hơn để giảm tải cho cả quá trình ghi hình lẫn mã hóa. Bạn cũng nên xem xét đổi codec sang h264 và sử dụng mã hóa theo lô.
# 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. Ghi chú kết
Hiệu năng cuối cùng phụ thuộc vào cấu hình cụ thể của bạn — số khung hình mỗi giây, độ phân giải, số lõi CPU và tải, bộ nhớ khả dụng, độ dài episode, và trình mã hóa bạn chọn. Luôn kiểm thử với khối lượng công việc mục tiêu, lưu ý đến khả năng của CPU & hệ thống và điều chỉnh encoder_threads, encoder_queue_maxsize, và vcodec một cách hợp lý. Mặc dù vậy, một cấu hình thực tế phổ biến (cho nhiều ứng dụng) là ba camera ở 640×480x3 @30fps; cấu hình này thường chạy ổn với các cài đặt mã hóa video streaming mặc định trên các hệ thống hiện đại. Luôn xác minh bộ dữ liệu đã ghi của bạn có hoạt động bình thường không bằng cách so sánh thời lượng video với thời lượng episode từ CLI và xác nhận số dòng bằng FPS × thời lượng CLI.