LeRobot documentation

Các cột ngôn ngữ và công thức

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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:

  1. 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-*.parquet dưới dạng hai cột tùy chọn (language_persistent và 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ó.
  2. 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.
  3. Đị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 ra messages theo 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:

  1. lerobot.datasets.language định nghĩa schema, registry phong cách và column_for_style.
  2. lerobot.datasets.language_render phân giải các dòng và hiển thị các thông điệp.
  3. RenderTrainingMessagesStep chuyển các mẫu trong tập dữ liệu thành messages, message_streams và 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.

Update on GitHub