【参加レポ・前編】AMD OPEN ROBOTICS HACKATHON 2025
はじめに
こんにちは!
4月に松尾研究所に新卒入社いたしましたデータサイエンティストの髙田です.
今回は松尾研究所 Advent Calendar 2025の記事の執筆ということで,12/5-7で開催されたAMD OPEN ROBOTICS HACKATHON 2025に同じく新卒入社の中村くんと2人で参加して完走したので,現地の様子を報告します!
前後編に分かれておりますので,後日投稿予定の後編もよろしくお願いいたします~
概要
本ハッカソンは赤い半導体企業でおなじみAMD社が主催するハッカソンで,HuggingFace社も運営に関わっており,2日間+αでロボットアプリケーションを実装してデモを行うという方式です.
東京,パリ,サンノゼの3ヶ所で開催されており,今回は東京会場(秋葉原)に参加して来ました!
どの程度の規模なのかよくわからず参加したのですが,フタを開けてみると40チーム以上が賞金総額3万ドルをかけて競う大規模ハッカソンでした.今回はその模様をお届けしようと思います!
初日(準備)
会場着弾
金曜日なのでお仕事終わりの18:00に会場のベルサール秋葉原に集合.

会場に入ると夕飯のお弁当が配られており,各自いただいた後,19時頃から運営サイドの挨拶が始まりました.
運営から「みなさん,ここから2日間徹夜する準備はできてますか?」というデスマーチの狼煙を上げる挨拶があり,気づけば各種機材とともに宿泊用?のAMD印のブランケットが配布されていました.これはとんでもないところに来てしまいましたね.
AMD印のブランケット."together we advance_"
そしてスケジュールが投影されました.二度見して確認しましたが,Hackathonの白箱が途切れず日曜まで続いています.これはとんでもないところに来てしまいました!(歓喜)

Mission1 スタート
初日はMission1と題されたシンプルなPick&Placeタスクが提示されました.これは実質上のチュートリアルで,ロボット学習のOSSフレームワークであるLeRobotを用いたデータ収集からクラウド環境での学習,実機デプロイまでを一通り体験できる内容となっていました.
開始時間になると,WowRobo Robotics社から提供されているSO-101の組立済キットが配布されました.SO-101アームだけではなくUSBカメラやUSBハブ,アーム固定用のクランプが入っていました.これさえあればすぐにタスクに取り掛かれる充実のセット内容ですね!
こちらを用いて適当な対象でPick&Placeのテレオペ・学習・実機デプロイができればMission1はクリアです.

実機のセットアップと並行して学習環境の説明が行われていました.AMD Developer Cloudのアカウントが発行され,AMD MI300Xが1基のインスタンスを2つ使えるようです.MI300XはVRAMが192GBあるので,数B程度のVLAをLoRAで学習させるなどもできそうです.流石AMD,すごいGPUを貸してくださる.また,推論用にAMDのNPUを搭載したノートPCも貸与されました.
まずはMission1,私たちは適当にその辺にあったFeetechサーボの箱に,これまたその辺にあったペットボトルキャップを載せるというPick&Placeタスクをやることにしました.
サクサク進めれば今日は早く寝られそうだ.何なら家に帰れるんじゃないか,と安直に思ったのも束の間,配布された組立済SO-101のサーボにIDが付与されていない(SO-101の組み立てに際しては事前に各モータ単体で制御ボードに接続して識別IDを付与する必要があります).せっかく組立てられているのに分解してID付与からなのかとガチャガチャやっていたところ.他のテーブルの方は普通に動かし始めているので運営の方に確認.恐らく単純にチェック漏れだそうで,すぐに交換してもらえました.
学習・推論双方の環境構築と機体セッティングを済ませてテレオペの準備が完全に整ったところで時刻は23時半.閉店する前にお風呂に向かいます.

会場から徒歩10分程度のお風呂屋さんへ(立地が良すぎる).某競馬ソシャゲのコラボをやっていたようで至るところにグッズが置いてありました.さすが秋葉原(ニワカ).

戻ってきたら早速テレオペです.ひたすらペットボトルキャップをつまんでサーボの箱に載せます.
カメラは俯瞰とGripperの2視点で,30エピソード取得しました.
この時点ですでに午前3時が近く,この日は2泊目に備えて先述の2つのGPUインスタンスを使ってSmolVLAとACTでの学習をそれぞれ回して会場で就寝することにしました.
寝床を探していると,会場の隣の部屋に雑魚寝スペースがあり,Place to sleepの案内がありました.

今回は寝袋を持ち込んだので,ブランケットを被って暖かい環境が完成です!
おやすみなさい

2日目(Mission1達成・Mission2準備)
希望の朝
AM8:00,会場で素晴らしい朝を迎えます.
机があまりにも荒れていますが,神々しいまでの朝日によっていい感じの光景になっています.

昨晩回しておいたSmolVLAの学習も完了していました.
朝ごはんをいただきながら,恐る恐るデプロイしてみる.
...動いた!

朝日に晒されながら,また,WowRoboのシートの文字色と近い色のペットボトルキャップを選定してしまうという環境デバフ(自業自得)がありながらもやり遂げました.
とりあえずMission1はこれでクリアのようです.Huggingfaceに学習済モデルをアップロードし,コードを提出用のGitHubリポジトリに収納しました.
Mission2 スタート
さあ,ここからが本番,自由課題のMission 2です.
周りにはすでに取り掛かっているチームが多く(というか,すでにデプロイにまで入っているところも),手ぶらで来た私たちは少し焦りながら何をやろうか考えている状況でした.とりあえず座って考えていても思いつかないので,家電量販店などのおもちゃコーナーをぶらついて天啓を得たいと考え,秋葉原のヨドバシに向かいます.
ヨドバシのおもちゃコーナーにて,せっかくなのでVLAならではの画像・言語のモーダルを統合するタスクに挑戦したいというモチベーションで小一時間悩んだ結果,タスクが決まったので必要物品を購入して出てきました.

そう,皆さんご存じの地球儀です.
ロボットアーム,VLA,地球儀......
勘のいい読者の方はお気づきかもしれません.我々は......
「言語で地域を入力すると,SO-101が地球儀を回して止め,もう一つのSO-101がその地域を指す」というタスクを考案(?)・挑戦することにしました.
タスク名は「Revolution」と名付けました(確信犯).Space pirate is all you needなのです.
他にも指示棒の候補や固定用のテープなども購入し,セットアップにとりかかります.

しかし,会場で地球儀を開封するといきなり問題が発生しました.
ご覧の通りかなり光を反射するタイプの表面で,会場の天井照明が強めなのも相まって画像入力に影響が出そうです.
どうするか考えつつも,手元ではセットアップを進めていきます.カメラは2本のSO-101のGripperにそれぞれ搭載し,さらに上部に俯瞰カメラを設置しました.この3つのカメラの画像と言語指示を入力としてタスクを実行します.

カメラの方はOpenCVで露光調整を行い,(この時点では)事なきを得ました
無事テレオペデータの収集に入ります.
地球儀を回して......

目的地(今回はUSA)にタッチ!

さらにここで運営の方から会場にミスタードーナツの差し入れが!
感謝の気持ちとともにいただきます.疲れた脳に糖分が染み渡ります.

ここまでは遅れながらもテキパキと作業が進んでいましたが,日が暮れた頃に問題が発生します.
貸与PCの調子が悪くなり,テレオペなどの作業中にカクつくように......
取得したデータセットも学習に回すと動画フレーム読み出しのエラーが多発し,実際にffmpegでエラーを確認すると,
ffmpeg -v error -i ./Downloads/file-001.mp4 -f null -
[vist#0:0/av1 @ 0xbc2c4c300] [dec:libdav1d @ 0xbc301c280] Error submitting packet to decoder: Invalid data found when processing input Last message repeated 8 times
しっかりデコードエラーを吐いており,急遽手持ちのMacbookに環境を移行してデータの取り直しが始まりました.
裏番組
ここまで,推論側の実機作業は主に中村くんが担当してくれていたので,髙田の方はベーシックな学習環境を構築した後,裏番組的に最近注目しているNVIDIA ResearchのVLA-0(詳しくは後ほど記事投稿予定)の準備をしていました.平たく言うと,VLAの出力(Action)のベクトルをVLMにそのままテキストで出力させることで,言語モーダルで学習されたベースのVLMの性能をFineTuning時に損ねないようにすると実際に高精度が出たという手法です.
今回のタスクの特性上,言語での地域名と地球上の地理的位置などが事前知識として結びつくと強いと考え,そのような知識を有していそうな数BのVLMをベースにして,かつその知識を損なわずに動作に結びつけたいというモチベーションで作業を進めていました.
まずは公式実装をlerobotのコードに移植してlerobot-trainの--policy.type=vla0で使えるようにしてGPUインスタンスで試していました.
しかし,VLA-0はqwen2.5-VLで最小の3B(実際はほぼ3.5B)のモデルがベースになっていますが,試しにノートPCで推論させてみると完全にフリーズ.流石に重すぎたかと反省し,qwen3-vlの2Bモデルが使えるようにVLA-0のコードを変更して,動くには動きそうな状態になりました.しかし少量のテレオペデータで学習を回すと1k stepsに2時間かかってしまうことが判明......
タスク依存ですが学習には少なくとも数万steps必要なので,コンペ終了の明日16:00までに間に合いません.
結局,今回はMission1と同様にsmolVLA(0.4B)で学習させることに決定.Done is better than perfectです.
(ここで,OpenGVLabのInternVLなら1Bあるじゃん,と思ったそこのあなた!私も後からそう思いました.かなしい)
深夜のトラブルシューティング
私が七転八倒している内に優秀な相方がテレオペデータでの収集を進めていますが,明らかに2人でアーム1つずつ担当した方が速そうなので2人がかりでのテレオペが始まります.
しかし,取得したデータを確認していると画像になぜか会場の照明で白飛びが発生しています.OpenCVでカメラの露光調整をして対策したはずでは,と思いつつ,デバッグコードを実装して確認してみます.すると...カメラの露光パラメータを書き込んだ直後に画像取得しても露光がオートになったまま白飛びしていることが判明.つまりOpenCVからのパラメータ書き込みをカメラが無視しているような状況です.昼過ぎには問題なく出来ていたのに...
さらに,テレオペで取得したデータが学習時にまたもやフレーム読み出し失敗で読み出せないトラブルも発生.しかも今回はffmpegでチェックしてもフレーム落ちが無く,原因不明です.
すでに朝日が昇りつつあり,トラブル続出で徹夜の2人は深夜テンションMAXです!!
お願い,死なないで,テレオペデータ!
あんたが今ここで倒れたら、ここからの学習➡実機デプロイはどうなっちゃうの?
ライフはまだ残ってる.ここを耐えれば,コンペに勝てるんだから!
次回「テレオペデータ死す」デュエルスタンバイ!
後編へ続く......
Discussion