🔖

Group5: 成果報告

に公開

はじめに

本記事では、AIRoA コンペティションにおける Group 5の取り組みと成果について報告します。
記事の作成にあたり、Group 5と運営の皆さまのご協力に深く感謝いたします。

※ロボット基盤コンペティションの詳細についてはこちら(https://zenn.dev/airoa/articles/99184bcc68eadc#ロボット基盤モデル開発の取り組み---ロボット基盤コンペティション)
をご覧ください。コンペティションでは、参画企業・研究機関をはじめとする有志メンバーを募り6つのテーマごとに研究グループで、それぞれが異なるアプローチで汎用的なロボット基盤モデルの開発に挑戦しています。

AIRoA Group 5は国立情報学研究所 大規模言語モデルセンター(LLMC)および日本語大規模言語モデル開発コミュニティLLM-jpを中心としたグループです。LLM-jpでは #実環境インタラクション WGとして参加しております。早稲田大学尾形哲也主幹の下、グループリーダにはNII栗田修平、早稲田大学鈴木彼方、NII LLMC Chaoran Liu、名古屋工業大学高木優が共同であたりました。

この記事を執筆している栗田自身は、視覚言語モデルの開発や実環境のおける言語理解などの研究を中心に進めてきました。この分野では、これまで写真や動画像、3Dモデルのような実世界の表現方法を、シンボリックな表現である言語と対応付けるグラウンディング研究に重点が置かれていました。このコンペをきっかけに、実世界と主体的にインタラクションする言語理解モデルを目指していけたら、と密かに考えています。

方針

AIRoA Group 5では pytorchによるロボット基盤モデルレポジトリ lerobotをベースに開発を行いました。もう一つの実装候補としてJAXベースのopenpiもありますが、コンペの前半では使用しないことにしました。

スケジュール:

  • 5月:チーム編成
  • 6月: \pi_0 のシミュレータベースの開発チュートリアルの作成・ロボット基盤モデルの比較
  • 7月: \pi_0 の性質の調査
  • 8月:HSR実機実験を本格的に開始。HSRグリッパー調整

\pi_0 のシミュレータベースの開発チュートリアル

京都大学大学院情報学研究科の吉田智哉くんを中心に、lerobotが公開している \pi_0 のかなり詳細なチュートリアルを作成しました。
本チュートリアルはGMOクラウドサービス上で実行することを想定して作成しましたが、環境さえ作成できればどこでも実行できるものと思います。

1. Minicondaのインストール

  • miniconda環境をインストールします:

    mkdir -p ~/miniconda3
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
    bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
    rm ~/miniconda3/miniconda.sh
    ~/miniconda3/bin/conda init bash
    source ~/.bashrc
    

2. Lerobotのインストール

  • https://github.com/airoa-org/geniac25_team5_codebase

  • 外部パッケージの取得します:

    git submodule update --init --recursive
    
  • conda 環境を構築します:

    conda create -y -n lerobot python=3.10 && conda activate lerobot
    
  • lerobotをインストールします:

    pip install -e .
    
    • disk quota exceededエラーが出る場合

      TMPDIR=/home/group_25b505/group_5/<your name>/tmp pip install -e .
      
  • Lerobotの依存パッケージのインストールします:

    conda install ffmpeg -c conda-forge
    conda install -c conda-forge vulkan-tools vulkan-headers
    pip install numpy==1.24.4
    
    • rerun-sdkの依存関係エラーが出る場合

      pip install rerun-sdk==0.23.1 numpy==1.24.4
      

3. SimplerEnvのインストール

  • ManiSkill2_real2simをインストールします:

    cd third_party/SimplerEnv
    cd ManiSkill2_real2sim
    pip install -e .
    
  • SimplerEnvをインストールします:

    cd ..
    pip install -e .
    
  • MS2_REAL2SIM_ASSET_DIR環境変数を設定します:

    export MS2_REAL2SIM_ASSET_DIR=/home/group_25b505/group_5/yoshida/simpler_data
    
  • example.pyを実行して、SimplerEnvが正しくインストールされたか確認します:

    python example.py
    

4. Hugging Face の トークン設定 & wandb の アカウント設定

詳しくは省略しますが

huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
wandb login

などを用いて設定ください。

5. パッケージ依存関係・ディスク管理

  • Pi0の必要な依存パッケージをインストールします:
pip install bitsandbytes transformers==4.48.1 pytest
pip uninstall draccus
pip install draccus==0.10.0
  • HF_HOMEを共有ディレクトリに設定し、ディスク使用量を最適化します:
export LEROBOT_HOME=/home/group_25b505/group_5/.cache/huggingface/lerobot
export HF_HOME=/home/group_25b505/group_5/.cache/huggingface

6. PaliGemmaの利用許可

  • ここにアクセスし、PaliGemmaの利用許可申請を行ってください:

7. Pi0の学習

  • 以下のコマンドを実行して、Pi0の学習を開始します:
    • --offline.stepsで学習の総ステップ数を設定
    • --save_freqで学習パラメータの保存間隔を設定
    • --wandb.enableでwandbによるモニタリングの有効/無効を切り替え
    • --output_dirで学習パラメータの保存先ディレクトリを指定
    • --optimizer.typeで最適化アルゴリズムを選択(sgdadamadamw
    • --optimizer.lrで学習率を設定
    • --optimizer.weight_decayで重み減衰率を設定
torchrun --nproc_per_node=8 lerobot/scripts/ddp_train.py \
		--num_workers=32 --save_freq=10000 --offline.steps=40000 \
		--batch_size=8 --accumulation_steps=4 \
		--dataset.repo_id=lerobot/oxe_bridge \
		--dataset.local_files_only=true \
		--policy.path=lerobot/pi0 \
		--output_dir=outputs/train/pi0-tutorial \
		--job_name=pi0-tutorial \
		--wandb.enable=true \
		--use_amp=true \
		--policy.use_bfloat16=true \
		--optimizer.type=sgd \
		--optimizer.lr=2.5e-05 \
		--optimizer.weight_decay=1e-10
  • FileExistsErrorが発生した場合、torchrun...コマンドを実行する前に以下のコマンドを実行してください:
rm -rf outputs/train/pi0-tutorial

8. Pi0の評価

  • MS2_REAL2SIM_ASSET_DIR環境変数を設定します:
export MS2_REAL2SIM_ASSET_DIR=/home/group_25b505/group_5/yoshida/simpler_data
  • 以下のコードをsimpler_bridge.shに追加してください:
#!/bin/bash

# 評価するタスクのリスト
tasks=(
  "widowx_spoon_on_towel"
  "widowx_carrot_on_plate"
  "widowx_stack_cube"
  "widowx_put_eggplant_in_basket"
)

GPU=0

# policy.path:評価したいモデルの checkpoint パス
# ckpt: checkpoint の iteration番号
# seed: 今回は性能を比較するために全員が同じシード値を使用します,値は 1000 とします.

ckpt=010000

for task in "${tasks[@]}"; do
  CUDA_VISIBLE_DEVICES=${GPU} python lerobot/scripts/eval_simpler.py \
    --policy.path=./outputs/train/pi0-tutorial/checkpoints/${ckpt}/pretrained_model \
    --env.type=widowx \
    --eval.batch_size=10 \
    --eval.n_episodes=100 \
    --device=cuda \
    --output_dir=./outputs/eval/pi0-tutorial-${task} \
    --env.task "${task}" \
    --seed=1000
done
  • bashコマンドでsimpler_bridge.shを実行し、Pi0を評価します:
bash scripts/eval/simpler_bridge.sh

~40%程度の成功率になれば成功です!

Action Chunking の変化による性能変化

\pi_0 では、Action Chunking と呼ばれる複数ステップ先の動作を予測し、その加重平均を計算することで、Compounding Error を緩和することが可能です。さらに、推論時間の短縮から実世界での環境変化に強くなる効果があります。

この Action Chunking では、Chunk size と呼ばれる何ステップ先の動作を予測するのかを調整するパラメータが存在します。そこで Group5 では、 WidowX(SimplerEnv) を用いた評価環境を使用し、Chunk size を変化させた場合の \pi_0 の性能変化を検証しました。


Chunk size Spoon on towel Carrot on plate Stack cube Put eggplant in basket
1 32.0 26.0 11.0 76.0
5 37.0 33.0 20.0 46.0
10 12.0 20.0 8.0 17.0
50 <span style="color:red">7.0</span> <span style="color:red">2.0</span> <span style="color:red">2.0</span> <span style="color:red">4.0</span>

結果としては、 Chunk Size = 5 のとき、 \pi_0 の性能が最も良い結果となりました。また Chunk Size を増加させると、\pi_0 の性能が悪影響を及ぼすことがわかりました。

しかし、本検証で扱った評価タスクは、比較的に短いタスクで構成されており、長いタスクでの検証は、今後の課題です。

\pi_0ファインチューニングにおける動作正規化による性能変化

\pi_0 では、動作データにおける正規化手法がいくつか提案されています。

正規化手法

  1. mean-std: 各 action の次元における分布の平均・分散を利用.
  2. min-max: 各 action の次元における分布の最大・最小値を利用.外れ値に弱い.
  3. quantile min-max: 分位数を考慮した min-max.外れ値を除去するため min-max よりロバスト. \pi_0-Fast 、 \pi_{0.5} における事前学習時に採用.

これらの正規化手法によるファインチューニングが、 \pi_0 にどのように悪影響を及ぼすかを検証しました。また評価環境は、Action Chunking の変化による性能変化 同様に、WidowX(SimplerEnv)を用いた検証を実施しました。

Spoon on towel Carrot on plate Stack cube Put eggplant in basket
mean_std 36.0 23.0 24.0 44.0
min_max 24.0 20.0 16.0 17.0
quantile-min_max 25.0 19.0 14.0 27.0

結果としては、 mean-std による正規化手法が最も性能が良い結果となりました。

なお、Group5では、後述のグリッパーを除いて、アーム・台車を区別せずに、動作は初期値からの差分(relative)にて予測するものとして学習させています。

HSRのグリッパー可動域の正規化

HSRのグリッパーの可動域の正規化には、最後の瞬間まで正解がわからず悩まされました。
これは提供されたデータの性質もあるのかもしれません。
ただ、今回のタスクに関しては、あまり中間の開閉状態でグリッパーを動作させる必要もなかったために、実際の値をベースにheuristicな正規化をしています。

コンペ結果と検証できなかった今後の課題について

このように、Group 5では基礎的な部分を重視して開発を行いました。HSR実機を使った実験が事実上8月以降に限られ、なかなか実機での評価に使える時間が限られた側面もありましたが、結果は6チーム中2位という結果になり、まだまだロボットを本格的に扱った経験が少ないチームとしては、まずまずの結果になったと考えています。

コンペの後にも、まだ検証できていない課題が多く残されました。その1つが、lerobotの実装と、openpiの実装の差異の検証です。今回のコンペではlerobotを利用し、6チーム中2位という結果になり、結果だけを見ると大きな差はなかったという結論になるかもしれません。しかし、内部的には、PytorchとJaxという違いを超えて、様々な違いがあることがわかっています。

今回の開発ではRAの大きな働きに助けられました。特に、\pi_0まわりの実装・実験を進めてくれた京都大学大学院情報学研究科の吉田智哉くん、ロボットの実機実験周りを進めてくれた総合研究大学院大学の三好遼くんには感謝が絶えません。

Discussion