`LeRobotDataset`- Mang các bộ dữ liệu quy mô lớn đến lerobot

  • 13 min read
`LeRobotDataset`- Mang các bộ dữ liệu quy mô lớn đến lerobot

LeRobotDataset:v3.0: Mang đến bộ dữ liệu quy mô lớn cho lerobot

TL;DR Hôm nay, chúng tôi phát hành LeRobotDataset:v3! Trong bản phát hành LeRobotDataset:v2 trước đây, chúng tôi lưu trữ một episode (tập) cho mỗi tệp, gặp phải các giới hạn của hệ thống tệp khi mở rộng bộ dữ liệu lên hàng triệu episode. LeRobotDataset:v3 đóng gói nhiều episode trong một tệp duy nhất, sử dụng siêu dữ liệu quan hệ để truy xuất thông tin ở cấp độ episode riêng lẻ từ các tệp đa episode. Định dạng mới cũng hỗ trợ truy cập bộ dữ liệu ở chế độ streaming, cho phép xử lý các bộ dữ liệu lớn một cách nhanh chóng. Chúng tôi cung cấp một tiện ích dòng lệnh để chuyển đổi tất cả các bộ dữ liệu ở định dạng LeRobotDataset sang định dạng mới và rất vui được chia sẻ cột mốc quan trọng này với cộng đồng trước bản phát hành ổn định tiếp theo của chúng tôi!

Mục lục

LeRobotDataset, v3.0

LeRobotDataset là một định dạng bộ dữ liệu tiêu chuẩn được thiết kế để giải quyết các nhu cầu cụ thể của học máy robot và nó cung cấp khả năng truy cập thống nhất và thuận tiện vào dữ liệu robot trên các phương thức, bao gồm các chỉ số cảm biến, nhiều nguồn cấp dữ liệu camera và trạng thái điều khiển từ xa. Định dạng bộ dữ liệu của chúng tôi cũng lưu trữ thông tin chung về cách dữ liệu được thu thập (siêu dữ liệu), bao gồm mô tả bằng văn bản về tác vụ đang được thực hiện, loại robot được sử dụng và chi tiết đo lường như số khung hình trên giây mà cả hình ảnh và các luồng trạng thái robot được lấy mẫu. Siêu dữ liệu rất hữu ích để lập chỉ mục và tìm kiếm trên các bộ dữ liệu robot trên Hugging Face Hub!

Trong lerobot, thư viện robot mà chúng tôi đang phát triển tại Hugging Face, LeRobotDataset cung cấp một giao diện thống nhất để làm việc với dữ liệu chuỗi thời gian đa phương thức và nó tích hợp liền mạch với cả hệ sinh thái Hugging Face và Pytorch. Định dạng bộ dữ liệu được thiết kế để dễ dàng mở rộng và tùy chỉnh và đã hỗ trợ các bộ dữ liệu có sẵn công khai từ một loạt các hiện thân—bao gồm các nền tảng điều khiển như cánh tay SO-100 và thiết lập ALOHA-2, dữ liệu hình người thực tế, bộ dữ liệu mô phỏng và thậm chí cả dữ liệu xe tự lái! Bạn có thể khám phá các bộ dữ liệu hiện tại do cộng đồng đóng góp bằng cách sử dụng công cụ trực quan hóa bộ dữ liệu! 🔗

Ngoài quy mô, bản phát hành mới này của LeRobotDataset cũng cho phép hỗ trợ chức năng streaming, cho phép xử lý các lô dữ liệu từ các bộ dữ liệu lớn một cách nhanh chóng, mà không cần phải tải xuống các bộ sưu tập dữ liệu lớn một cách cấm đoán vào đĩa. Bạn có thể truy cập và sử dụng bất kỳ bộ dữ liệu nào trong v3.0 ở chế độ streaming bằng cách sử dụng giao diện StreamingLeRobotDataset chuyên dụng! Bộ dữ liệu streaming là một cột mốc quan trọng hướng tới học máy robot dễ tiếp cận hơn và chúng tôi rất vui được chia sẻ nó với cộng đồng 🤗

Cài đặt lerobot và ghi lại một bộ dữ liệu

lerobot là thư viện robot end-to-end được phát triển tại Hugging Face, hỗ trợ robot thực tế cũng như các thuật toán học máy robot hiện đại. Thư viện cho phép ghi lại các bộ dữ liệu cục bộ trực tiếp trên các robot thực tế và lưu trữ các bộ dữ liệu trên Hugging Face Hub. Bạn có thể đọc thêm về các robot mà chúng tôi hiện đang hỗ trợ tại đây!

LeRobotDataset:v3 sẽ là một phần của thư viện lerobot bắt đầu từ lerobot-v0.4.0 và chúng tôi rất vui được chia sẻ nó sớm với cộng đồng. Bạn có thể cài đặt lerobot-v0.3.x mới nhất hỗ trợ định dạng bộ dữ liệu mới này trực tiếp từ PyPI bằng cách sử dụng:

bash pip install “https://github.com/huggingface/lerobot/archive/33cad37054c2b594ceba57463e8f11ee374fa93c.zip" # this will affect your local lerobot installation!

Theo dõi tiến trình của cộng đồng hướng tới bản phát hành ổn định của thư viện tại đây 🤗

Sau khi bạn đã cài đặt một phiên bản lerobot hỗ trợ định dạng bộ dữ liệu mới, bạn có thể ghi lại một bộ dữ liệu bằng cánh tay robot đặc trưng của chúng tôi, SO-101, bằng cách sử dụng điều khiển từ xa cùng với các hướng dẫn sau:

bash lerobot-record
–robot.type=so101_follower
–robot.port=/dev/tty.usbmodem585A0076841
–robot.id=my_awesome_follower_arm
–robot.cameras=”{ front: {type: opencv, index_or_path: 0, width: 1920, height: 1080, fps: 30}}"
–teleop.type=so101_leader
–teleop.port=/dev/tty.usbmodem58760431551
–teleop.id=my_awesome_leader_arm
–display_data=true
–dataset.repo_id=${HF_USER}/record-test
–dataset.num_episodes=5
–dataset.single_task=“Grab the black cube”

Truy cập tài liệu chính thức để xem cách ghi lại một bộ dữ liệu cho trường hợp sử dụng của bạn.

Thiết kế định dạng (mới)

Một lựa chọn thiết kế cốt lõi đằng sau LeRobotDataset là tách biệt bộ nhớ dữ liệu cơ bản khỏi API hướng đến người dùng. Điều này cho phép tuần tự hóa và lưu trữ hiệu quả trong khi trình bày dữ liệu ở định dạng trực quan, sẵn sàng sử dụng. Các bộ dữ liệu được tổ chức thành ba thành phần chính:

  1. Dữ liệu dạng bảng: Dữ liệu tần số cao, chiều thấp như trạng thái khớp và hành động được lưu trữ trong các tệp Apache Parquet hiệu quả và thường được chuyển sang thư viện datasets trưởng thành hơn, cung cấp quyền truy cập nhanh, được ánh xạ bộ nhớ hoặc truy cập dựa trên streaming.
  2. Dữ liệu trực quan: Để xử lý khối lượng lớn dữ liệu camera, các khung hình được nối và mã hóa thành các tệp MP4. Các khung hình từ cùng một episode luôn được nhóm lại với nhau trong cùng một video và nhiều video được nhóm lại với nhau theo camera. Để giảm áp lực lên hệ thống tệp, các nhóm video cho cùng một chế độ xem camera cũng được chia thành nhiều thư mục con.
  3. Siêu dữ liệu: Một tập hợp các tệp JSON mô tả cấu trúc của bộ dữ liệu về siêu dữ liệu của nó, đóng vai trò là đối tác quan hệ với cả chiều dữ liệu dạng bảng và trực quan. Siêu dữ liệu bao gồm các lược đồ tính năng khác nhau, tốc độ khung hình, số liệu thống kê chuẩn hóa và ranh giới episode.

Để hỗ trợ các bộ dữ liệu có khả năng hàng triệu episode (dẫn đến hàng trăm triệu/tỷ khung hình riêng lẻ), chúng tôi hợp nhất dữ liệu từ các episode khác nhau vào cùng một cấu trúc cấp cao. Cụ thể, điều này có nghĩa là bất kỳ tập hợp dạng bảng và video đã cho nào sẽ không chỉ chứa thông tin về một episode, mà là sự nối kết của thông tin có sẵn trong nhiều episode. Điều này giúp áp lực lên hệ thống tệp có thể quản lý được, cả cục bộ và trên các nhà cung cấp bộ nhớ từ xa như Hugging Face. Sau đó, chúng tôi có thể tận dụng siêu dữ liệu để thu thập thông tin cụ thể về episode, ví dụ: dấu thời gian mà một episode nhất định bắt đầu hoặc kết thúc trong một video nhất định.

Các bộ dữ liệu được tổ chức dưới dạng kho lưu trữ chứa:

  • meta/info.json: Đây là tệp siêu dữ liệu trung tâm. Nó chứa lược đồ bộ dữ liệu hoàn chỉnh, xác định tất cả các tính năng (ví dụ: observation.state, action), hình dạng và kiểu dữ liệu của chúng. Nó cũng lưu trữ thông tin quan trọng như số khung hình trên giây của bộ dữ liệu (fps), phiên bản codebase và các mẫu đường dẫn được sử dụng để xác định vị trí dữ liệu và tệp video.
  • meta/stats.json: Tệp này lưu trữ các số liệu thống kê tổng hợp (mean, std, min, max) cho từng tính năng trên toàn bộ bộ dữ liệu. Chúng được sử dụng để chuẩn hóa dữ liệu và có thể truy cập thông qua dataset.meta.stats.
  • meta/tasks.jsonl: Chứa ánh xạ từ các mô tả tác vụ bằng ngôn ngữ tự nhiên sang các chỉ số tác vụ số nguyên, được sử dụng để đào tạo chính sách có điều kiện tác vụ.
  • meta/episodes/: Thư mục này chứa siêu dữ liệu về từng episode riêng lẻ, chẳng hạn như độ dài, tác vụ tương ứng và các con trỏ đến nơi dữ liệu của nó được lưu trữ. Để có khả năng mở rộng, thông tin này được lưu trữ trong các tệp Parquet được phân đoạn thay vì một tệp JSON lớn duy nhất.
  • data/: Chứa dữ liệu dạng bảng từng khung hình cốt lõi trong các tệp Parquet. Để cải thiện hiệu suất và xử lý các bộ dữ liệu lớn, dữ liệu từ nhiều episode được nối vào các tệp lớn hơn. Các tệp này được tổ chức thành các thư mục con được phân đoạn để giữ cho kích thước tệp có thể quản lý được. Do đó, một tệp duy nhất thường chứa dữ liệu cho nhiều episode.
  • videos/: Chứa các tệp video MP4 cho tất cả các luồng quan sát trực quan. Tương tự như thư mục data/, cảnh quay video từ nhiều episode được nối vào các tệp MP4 duy nhất. Chiến lược này làm giảm đáng kể số lượng tệp trong bộ dữ liệu, hiệu quả hơn cho các hệ thống tệp hiện đại. Cấu trúc đường dẫn (/videos/<camera_key>/<chunk>/file_...mp4) cho phép trình tải dữ liệu xác định vị trí tệp video chính xác và sau đó tìm kiếm dấu thời gian chính xác cho một khung hình nhất định.

Chuyển đổi bộ dữ liệu v2.1 của bạn sang v3.0

LeRobotDataset:v3.0 sẽ được phát hành cùng với lerobot-v0.4.0, cùng với khả năng dễ dàng chuyển đổi bất kỳ bộ dữ liệu nào hiện đang được lưu trữ trên Hugging Face Hub sang v3.0 mới bằng cách sử dụng:

bash python -m lerobot.datasets.v30.convert_dataset_v21_to_v30–repo-id=<HFUSER/DATASET_ID>

Chúng tôi rất vui được chia sẻ định dạng mới này sớm với cộng đồng! Trong khi chúng tôi phát triển lerobot-v0.4.0, bạn vẫn có thể chuyển đổi bộ dữ liệu của mình sang phiên bản mới được cập nhật bằng cách sử dụng lerobot-v0.3.x mới nhất hỗ trợ định dạng bộ dữ liệu mới này trực tiếp từ PyPI bằng cách sử dụng:

bash pip install “https://github.com/huggingface/lerobot/archive/33cad37054c2b594ceba57463e8f11ee374fa93c.zip" # this will affect your lerobot installation! python -m lerobot.datasets.v30.convert_dataset_v21_to_v30 –repo-id=<HFUSER/DATASET_ID>

Lưu ý rằng đây là một phiên bản tiền phát hành và thường không ổn định. Bạn có thể theo dõi trạng thái phát triển của bản phát hành ổn định tiếp theo của chúng tôi tại đây!

Tập lệnh chuyển đổi convert_dataset_v21_to_v30.py tổng hợp nhiều episode episode-0000.mp4, episode-0001.mp4, episode-0002.mp4, .../episode-0000.parquet, episode-0001.parquet, episode-0002.parquet, episode-0003.parquet, ... vào các tệp đơn file-0000.mp4/file-0000.parquet và cập nhật siêu dữ liệu tương ứng, để có thể truy xuất thông tin cụ thể về episode từ các tệp cấp cao hơn.

Ví dụ mã: Sử dụng LeRobotDataset với torch.utils.data.DataLoader

Mọi bộ dữ liệu trên Hugging Face Hub chứa ba trụ cột chính được trình bày ở trên (Dữ liệu dạng bảng và trực quan, cũng như Siêu dữ liệu quan hệ) và có thể được truy cập bằng một dòng duy nhất.

Hầu hết các thuật toán học robot, dựa trên học tăng cường (RL) hoặc nhân bản hành vi (BC), có xu hướng hoạt động trên một ngăn xếp các quan sát và hành động. Ví dụ, các thuật toán RL thường sử dụng lịch sử các quan sát trước đó o_{t-H_o:t} và các thuật toán BC thay vào đó thường được đào tạo để hồi quy các đoạn hành động. Để đáp ứng các đặc thù của đào tạo học robot, LeRobotDataset cung cấp một hoạt động tạo cửa sổ gốc, theo đó chúng ta có thể sử dụng giây trước và sau bất kỳ quan sát nhất định nào bằng cách sử dụng đối số delta_timestamps.

Một cách thuận tiện, bằng cách sử dụng LeRobotDataset với PyTorch DataLoader, người ta có thể tự động đối chiếu các từ điển mẫu riêng lẻ từ bộ dữ liệu thành một từ điển duy nhất gồm các tensor theo lô.

python from lerobot.datasets.lerobot_dataset import LeRobotDataset

repo_id = “yaak-ai/L2D-v3”

Load from the Hugging Face Hub (will be cached locally)

dataset = LeRobotDataset(repo_id)

Get the 100th frame in the dataset by index

sample = dataset[100] print(sample)

The sample is a dictionary of tensors

{

‘observation.state’: tensor([…]),

‘action’: tensor([…]),

‘observation.images. front_left’: tensor([C, H, W]),

’timestamp’: tensor(1.234),

}

delta_timestamps = { “observation.images.front_left”: [-0.2, -0.1, 0.0] # 0.2 and 0.1 seconds before any observation } dataset = LeRobotDataset( repo_id delta_timestamps=delta_timestamps )

Accessing an index now returns a stack of frames for the specified key

sample = dataset[100]

The image tensor will now have a time dimension

‘observation.images.wrist_camera’ has shape [T, C, H, W], where T=3

print(sample[‘observation.images.front_left’].shape)

batch_size=16

Wrap the dataset in a DataLoader to process it in batches for training purposes

data_loader = torch.utils.data.DataLoader( dataset, batch_size=batch_size )

3. Iterate over the DataLoader in a training loop

num_epochs = 1 device = “cuda” if torch.cuda.is_available() else “cpu”

for epoch in range(num_epochs): for batch in data_loader: # ‘batch’ is a dictionary where each value is a batch of tensors. # For example, batch[‘action’] will have a shape of [32, action_dim].

    # If using delta_timestamps, a batched image tensor might have a
    # shape of [32, T, C, H, W].

    # Move data to the appropriate device (e.g., GPU)
    observations = batch['observation.state.vehicle'].to(device)
    actions = batch['action.continuous'].to(device)
    images = batch['observation.images.front_left'].to(device)

    # Next do amazing_model.forward(batch)
    ...

Streaming

Bạn cũng có thể sử dụng bất kỳ bộ dữ liệu nào ở định dạng v3.0 ở chế độ streaming, mà không cần tải xuống cục bộ, bằng cách sử dụng lớp StreamingLeRobotDataset.

python from lerobot.datasets.streaming_dataset import StreamingLeRobotDataset

Streams directly from the Hugging Face Hub, without downloading the dataset into disk or loading into memory

repo_id = “yaak-ai/L2D-v3” dataset = StreamingLeRobotDataset(repo_id)

Kết luận

LeRobotDataset v3.0 là một bước tiến hướng tới việc mở rộng quy mô các bộ dữ liệu robot được hỗ trợ trong LeRobot. Bằng cách cung cấp một định dạng để lưu trữ và truy cập các bộ sưu tập dữ liệu robot lớn, chúng tôi đang tiến bộ hướng tới việc dân chủ hóa robot, cho phép cộng đồng đào tạo có thể hàng triệu episode mà thậm chí không cần tải xuống chính dữ liệu!

Bạn có thể thử định dạng bộ dữ liệu mới bằng cách cài đặt lerobot-v0.3.x mới nhất và chia sẻ bất kỳ phản hồi nào trên GitHub hoặc trên máy chủ Discord của chúng tôi! 🤗

Lời cảm ơn

Chúng tôi cảm ơn đội ngũ yaak.ai tuyệt vời vì sự hỗ trợ và phản hồi quý giá của họ trong khi phát triển LeRobotDataset:v3. Hãy theo dõi tổ chức của họ trên Hugging Face Hub! Chúng tôi luôn tìm kiếm cơ hội hợp tác với cộng đồng và chia sẻ các tính năng sớm. Hãy liên hệ nếu bạn muốn hợp tác 😊

Recommended for You

Chào mừng EmbeddingGemma, mô hình nhúng hiệu quả mới của Google

Chào mừng EmbeddingGemma, mô hình nhúng hiệu quả mới của Google

Các thủ thuật từ OpenAI gpt-oss mà BẠN 🫵 có thể sử dụng với transformers

Các thủ thuật từ OpenAI gpt-oss mà BẠN 🫵 có thể sử dụng với transformers