LeRobot documentation
Các cột ngôn ngữ và công thức
Các cột ngôn ngữ và công thức
Hầu hết các bộ dữ liệu LeRobot được cung cấp kèm một chuỗi task duy nhất cho mỗi episode — phù hợp cho các kỹ năng ngắn, chỉ có một hướng dẫn, nhưng chưa đủ cho các chính sách robot có tầm nhìn dài hơn và đa phương thức mà lĩnh vực này đang hướng tới (lập kế hoạch cấp cao, bộ nhớ, ngắt lời, VQA, sử dụng công cụ). Để hỗ trợ các chính sách đó mà không cần tách nhánh định dạng bộ dữ liệu, LeRobot mở rộng LeRobotDataset bằng hai cột ngôn ngữ tùy chọn và một lớp công thức nhỏ, biến các dòng đó thành các mẫu huấn luyện dạng chat ngay lập tức.
Thiết kế được chia rõ ràng thành ba lớp:
- Dữ liệu trong bộ dữ liệu — chú thích ngôn ngữ được lưu trữ cạnh các khung hình trong
data/chunk-*/file-*.parquetdưới dạng hai cột tùy chọn (language_persistentvàlanguage_events). Các bộ dữ liệu không có những cột này sẽ giữ nguyên hành vi hiện có. - Công thức — một tệp YAML khai báo các hàng chú thích cần liên kết và cách bố trí chúng thành các lượt chat (
role,content, hình ảnh tùy chọn, các cuộc gọi công cụ tùy chọn). Công thức là cấu hình thuần túy; không cần Python để thêm một công thức mới. - Định dạng huấn luyện — tại thời điểm lấy mẫu,
RenderTrainingMessagesStepđối chiếu công thức với chú thích của từng khung hình và xuất ramessagestheo phong cách HF cùng các tệp phụ trợ riêng của LeRobot (message_streams,target_message_indices) để các bộ xử lý chính sách sử dụng.
Trang này mô tả lần lượt từng lớp.
Tầng 1 — các cột ngôn ngữ trong bộ dữ liệu
Hai cột tùy chọn nằm cạnh dữ liệu khung trong data/chunk-*/file-*.parquet:
language_persistent: một danh sách các hàng được phát sóng (broadcast) trên mọi khung hình trong một tập (episode) cho trạng thái vẫn còn hoạt động, chẳng hạn nhưsubtask,plan, vàmemory.language_events: một danh sách các dòng chỉ xuất hiện trên đúng khung hình mà một sự kiện được phát ra, chẳng hạn nhưinterjection,vqa, và các lời gọi công cụ giọng nói.
Cả hai cột đều có cùng hình dạng hàng (các hàng sự kiện bỏ qua timestamp vì khung mà hàng đó nằm trên đã cung cấp thông tin này):
role: string content: string | null style: string | null timestamp: float32 # persistent rows only camera: string | null # observation.images.* feature key, view-dependent rows only tool_calls: list[Json] | null
Trường camera dùng để đánh dấu các dòng mà content của chúng được dựa trên một góc nhìn camera cụ thể. Các dòng thuộc phong cách phụ thuộc góc nhìn (vqa và trace) BẮT BUỘC phải đặt camera thành khóa đặc trưng observation.images.* tương ứng. Các dòng thuộc mọi phong cách khác — bao gồm cả motion, vốn mô tả các nguyên thủy trong hệ tọa độ robot theo các thuật ngữ khớp / Descartes — BẮT BUỘC phải giữ camera ở giá trị null. Các trình ghi pipeline và trình xác thực thực thi điều này thông qua validate_camera_field(style, camera).
meta/tasks.parquet vẫn là nguồn chính thức cho task. Binding của recipe đặc biệt ${task} luôn đọc chuỗi task đó và không phụ thuộc vào chú thích ngôn ngữ.
Kiến trúc
Bản thân stack ngôn ngữ có ba module nội bộ hỗ trợ lớp 1:
lerobot.datasets.languageđịnh nghĩa schema, registry phong cách vàcolumn_for_style.lerobot.datasets.language_renderphân giải các dòng và hiển thị các thông điệp.RenderTrainingMessagesStepchuyển các mẫu trong tập dữ liệu thànhmessages,message_streamsvàtarget_message_indices.
LeRobotDataset không phụ thuộc vào công thức. Nó truyền tiếp language_persistent và language_events khi có mặt, và các bộ dữ liệu không chú thích giữ nguyên hành vi hiện tại.
Layer 2 — recipe anatomy
Recipes là các tệp YAML được hỗ trợ bởi TrainingRecipe và MessageTurn từ lerobot.datasets.recipe. Chúng
khai báo các hàng chú thích cần lấy (thông qua bindings) và cách kết hợp chúng
thành các lượt chat (messages).
messages:
- { role: user, content: "${task}", stream: high_level }
- { role: assistant, content: "${subtask}", stream: low_level, target: true }Một công thức cũng có thể phân nhánh thành một blend có trọng số của các công thức con. Tại thời điểm lấy mẫu, đúng một nhánh được chọn một cách tất định từ chỉ số mẫu, do đó các khung hình khác nhau sẽ huấn luyện các mục tiêu khác nhau (ví dụ: cập nhật bộ nhớ so với thực thi cấp thấp so với VQA) mà không cần bất kỳ kết nối Python nào.
Ngữ nghĩa thời gian
Các kiểu bền vững có hiệu lực sau khi được phát hành cho đến khi bị thay thế:
active_at(t, style=subtask)nth_prev(style=memory, offset=1)nth_next(style=subtask, offset=1)
Các kiểu sự kiện chỉ tồn tại tại mốc thời gian chính xác của chúng:
emitted_at(t, style=interjection)emitted_at(t, style=vqa, role=user, camera=observation.images.top)emitted_at(t, role=assistant, tool_name=say)
Việc khớp sự kiện chính xác không có cửa sổ dung sai, do đó các tác giả ghi phải đóng dấu các dòng sự kiện bằng dấu thời gian khung hình từ dữ liệu parquet.
Độ phân giải phụ thuộc vào góc nhìn
Đối với các kiểu phụ thuộc góc nhìn (vqa và trace), bộ phân giải có thêm bộ lọc camera= song song với role= và tool_name=. Các bộ dữ liệu có nhiều camera thường phát ra một cặp (vqa, user) + (vqa, assistant) cho mỗi camera tại cùng một mốc thời gian; nếu không có camera=, các bộ phân giải đó sẽ thấy hai kết quả khớp và gây ra lỗi mơ hồ. Các công thức sử dụng mỗi camera thông qua liên kết riêng của nó cùng với một khối hình ảnh tương ứng, ví dụ
ask_vqa_top:
route: vqa
bindings:
vqa_query: "emitted_at(t, style=vqa, role=user, camera=observation.images.top)"
vqa: "emitted_at(t, style=vqa, role=assistant, camera=observation.images.top)"
messages:
- role: user
stream: high_level
if_present: vqa_query
content:
- { type: image, feature: observation.images.top }
- { type: text, text: "${vqa_query}" }
- {
role: assistant,
content: "${vqa}",
stream: high_level,
target: true,
if_present: vqa,
}Thêm một sub-recipe như vậy cho mỗi camera mà dataset ghi lại. Marker route: vqa tường minh khiến một chú thích VQA thưa khớp được ưu tiên hơn so với việc chọn blend có trọng số thông thường; tên các thành phần chỉ mang tính mô tả.
Tầng 3 — định dạng huấn luyện
Các mẫu được hiển thị sử dụng tin nhắn chat theo phong cách HF cùng với các tệp phụ trợ của LeRobot:
sample["messages"]
sample["message_streams"]
sample["target_message_indices"]Renderer không áp dụng chat template của tokenizer. Các bộ xử lý chính sách quyết định cách chuỗi hóa các tin nhắn cho backbone của chúng, giúp giữ nguyên bộ dữ liệu có thể sử dụng xuyên suốt SmolVLA, Pi0.5 và bất kỳ VLM nào trong tương lai kỳ vọng các tin nhắn chat theo phong cách OpenAI.
Hỗn hợp
Blend recipes chọn một sub-recipe có trọng số một cách tất định từ chỉ số mẫu. recipes/subtask_mem.yaml huấn luyện blend lõi compact — dự đoán subtask cấp cao, thực thi cấp thấp và bộ nhớ. recipes/subtask_mem_vqa_speech.yaml là biến thể đầy đủ hơn, đồng thời bổ sung phản hồi VQA và ngắt lời bằng giọng nói.
recipes/subtask_joint.yaml minh họa cho việc huấn luyện chuỗi kết hợp thay vì pha trộn có trọng số. Với cùng một mẫu, subtask của assistant được giám sát bằng text cross-entropy trên luồng low_level trong khi dự đoán hành động vẫn được kích hoạt, phù hợp với cấu hình kết hợp từ bài báo π0.5. Hiện tại, nó chỉ dùng cho huấn luyện: runtime chưa tái tạo prefix kết hợp này khi suy luận.
Sự vắng mặt lịch sự
Nếu cả hai cột ngôn ngữ đều bị thiếu, là None, hoặc rỗng, RenderTrainingMessagesStep sẽ sử dụng chuỗi tác vụ như giám sát cấp thấp khi có sẵn, nếu không thì giữ nguyên mẫu. Đối với một mẫu đã được chú thích, nếu không có nhánh công thức nào áp dụng và không có phương án dự phòng cho tác vụ, quá trình render sẽ trả về None, cho phép trình tải thử lại một mẫu khác.