えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

NVIDIA Cosmosのビデオ生成をVRAM24GBで頑張ってみる

毎年ラスベガスで開催される世界最新鋭の技術が集結するイベントCES。

特に根強いトレンドとなっているAIをリードしている緑の半導体企業「NVIDIA」からは多くの注目の発表がありました。

全てを見たわけではないですが、個人的に注目しているのは

の3つです。昨年Appleで散財しまくっている身としては今年はなんとしても節約志向で行く予定なのですが、早速それが脅かされています🤤

今回は、今なお熱いAIブームをさらに後押しするであろう基盤モデル「NVIDIA Cosmos」のビデオ生成を試してみました。

NVIDIA Cosmosとは

NVIDIA Cosmosとは、NVIDIAが発表した基盤モデルの名称です。

物理特性を理解させるためのデータ収集・調整を行っているようで、NVIDIAはこのモデルを「Physical AI」と呼んでいます。

これが扱いやすいライセンスでの提供で、さらに不適切な出力をガードするシステムも付属しているとのことで、商用利用が可能な魅力的なAIモデルと言えます。

これを無料で提供してもGPUが売れるので問題ない状態なのがすごいですね。

www.nvidia.com

Cosmosの機能を体験できるビデオ生成では、テキストや写真を使用して将来のビデオを生成することができます。

物理的に破綻しにくいビデオはデータ作成にも使えそうで期待できますね。


辛いところ:RTX5090の購入を避けられない

Cosmosの導入はとても簡単で、UbuntuNVIDIAドライバとDockerがあればすぐできます。

github.com

しかし、問題点が。

ビデオ生成にはとても多くのVRAMを消費し、どんなにオプションを追加しても24GBを超えます。

GPU1枚で対応できるのはA6000/A6000adaやこれから発売される5090くらいなのでかなりしんどい。

2枚使いでも32GBは実現しますが、帯域がボトルネックに‥

ARMでも問題なければGB10やAGX Orin (64GB) が選択肢に挙がるかもしれません。


これまでのNVIDIA GPU向けAIモデルは24GB VRAM向けに調整されることもありましたが、32GB VRAMタイプが出たことでこれからは32GB向けに調整されることでしょう。

仮にそうだとしたら5090を持たざるものはAI推論で驚くことができなくなってしまう‥😇

GPUサーバーレンタルの選択肢も増えているようなので無理に購入する必要はなさそうですが、24GBでは闘えない時代になりつつあります。


24GBって贅沢仕様だった気がするんですがねぇ‥


24GB VRAMで生成するオプション

ただ、CosmosのREADMEを読んでいると次のように書かれています。

For GPUs with limited memory (e.g., RTX 3090/4090 with 24 GB memory), we recommend fully offloading all models. For higher-end GPUs, users can select the most suitable offloading strategy considering the numbers provided below.

先ほどの表ではいずれも24GB超えているのになぜだ‥?

そこで、いろいろとオプションを付けたり消したりして格闘することに。この文を付けたくらいですから、動かないはずがありません。

格闘の末、オプションをちょっと調整するだけでなんとかなることが分かりました。

環境

RTX3090 (24GB VRAM) を使用しています。デスクトップが動いており、常に500MBくらい確保されています。

オプションと結果(Text2World 7B)

PROMPT="A sleek, humanoid robot stands in a vast warehouse filled with neatly stacked cardboard boxes on industrial shelves. \
> The robot's metallic body gleams under the bright, even lighting, highlighting its futuristic design and intricate joints. \
> A glowing blue light emanates from its chest, adding a touch of advanced technology. The background is dominated by rows of boxes, \
> suggesting a highly organized storage system. The floor is lined with wooden pallets, enhancing the industrial setting. \
> The camera remains static, capturing the robot's poised stance amidst the orderly environment, with a shallow depth of \
> field that keeps the focus on the robot while subtly blurring the background for a cinematic effect."
PYTHONPATH=$(pwd) python cosmos1/models/diffusion/inference/text2world.py \
    --checkpoint_dir checkpoints \
    --diffusion_transformer_dir Cosmos-1.0-Diffusion-7B-Text2World \
    --prompt "$PROMPT" \
    --video_save_name Cosmos-1.0-Diffusion-7B-Text2World_memory_efficient \
    --offload_tokenizer \
    --offload_diffusion_transformer \
    --offload_text_encoder_model \
    --offload_prompt_upsampler \
    --offload_guardrail_models \
    --disable_prompt_upsampler

このオプションで追加されたのは、 --disable_prompt_upsampler です。プロンプト生成を無効化してくれます。

Cosmosの生成ステップの前にプロンプトを自動で拡張してくれるそうなのですが、これがボトルネックになっていたそうです。


なお生成プロセスでは常に17.5GB使い続けていました。そのため、16GB VRAMではギリギリ生成できないかもです。

5秒の動画を生成するために必要な生成時間はRTX3090で30分程度です。解像度を落とすことで生成時間を短縮可能です。(720x480だと10分)

オプションと結果(Video2World 7B)

PROMPT="A sleek, humanoid robot stands in a vast warehouse filled with neatly stacked cardboard boxes on industrial shelves. \
> The robot's metallic body gleams under the bright, even lighting, highlighting its futuristic design and intricate joints. \
> A glowing blue light emanates from its chest, adding a touch of advanced technology. The background is dominated by rows of boxes, \
> suggesting a highly organized storage system. The floor is lined with wooden pallets, enhancing the industrial setting. \
> The camera remains static, capturing the robot's poised stance amidst the orderly environment, with a shallow depth of \
> field that keeps the focus on the robot while subtly blurring the background for a cinematic effect."
 PYTHONPATH=$(pwd) python cosmos1/models/diffusion/inference/video2world.py \
    --checkpoint_dir checkpoints \
    --diffusion_transformer_dir Cosmos-1.0-Diffusion-7B-Video2World \
    --input_image_or_video_path cosmos1/models/diffusion/assets/v1p0/video2world_input0.jpg \
    --num_input_frames 1 \
    --video_save_name Cosmos-1.0-Diffusion-7B-Video2World_memory_efficient \
    --offload_tokenizer \
    --offload_diffusion_transformer \
    --offload_text_encoder_model \
    --offload_prompt_upsampler \
    --offload_guardrail_models \
    --disable_prompt_upsampler \
    --prompt "${PROMPT}"

Video2Worldの24GB VRAM対応では、プロンプト生成を無効化するためにプロンプトの追加が必須となります。

この場合は、前回のプロンプトをそのまま流用したので、唐突にロボットが登場するというわけわからない展開になっていますが、それでも途中からは破綻なく動画生成されていることを確認しました。

5秒の動画を生成するために必要な生成時間はText2Worldと同様、RTX3090で30分程度です。


まとめ

以外にも24GB VRAMで生成できました。動画生成AIの取っ掛かりとしては良さそうです。

とはいえ1時間で10秒くらいしか生成できないうえに高品質とはいえない状態なので、これから動画生成AIを活用して何かを作りたい人は動画生成サービスを使うか、RTX5090やGB10などのVRAM投資を加速させる必要がありそうです。


まだまだモデルの大規模化・軽量化ともにAIの進化は止まらなさそうなので定期的にウォッチしていきたいですね。


ROS 2 布教デバイスの作成(LiveUSB)

この記事は「ROS Japan UG #57 ROS納めLT大会」の発表内容についてちょっと詳しく書いたものです。

既に投稿済みの記事をそのまま使って発表するという画期的(!?)な発想の発表スタイルに感動し、それなら資料投稿を記事にしてもOKだろう‥ということで🙃

rosjp.connpass.com


PCにUbuntu等のOSをインストールする際にほぼ間違いなくお世話になるデバイスといえばLiveUSBです。

みなさんはLiveUSBを持っていますか?もちろん1本は(布教のために)ポケットに忍ばせていますよね(?)


しかし、自分で何かしらのカスタムをしてLiveUSBを作るということした経験のある人は多くはないと思います。

「LiveUSB」で検索をかけると、作成方法(imgをダウンロードしてUSBに焼く)はたくさん出てきますが、自分好みにカスタムする方法はなかなか引っかかりません‥(引っかかっても10年前のものだったりします)

つまり、「ROS 2 特化のLiveUSB作成」というのは一周回って新鮮なのでは!?と考え、いろいろ調べてきました。


この資料の対象者は「ROS 2 を布教したい人(あわよくば他人のWindowsを吹っ飛ばしたい人)」向けとなっております。


LiveUSBを作る背景

私は、学生の頃にROSを使用した講習会を何度か開いたことがあり、その経験をもとにして講習資料をオープンにするなどの活動を行ってきました。

活動当初から「ROSはそのうち高校生レベルから扱われるだろう」と考えていましたが、既にその流れは来ており、高専低学年の学生がROSを挟んで制御する事例が今年出てきたようです。


そんなROSですが、初学者に教えるとなると結構大変です。

1. そもそもUbuntu PCを持っていない

目がターミナルの黒画面になれてしまった皆さんには想像つかないことだとは思いますが、大抵の初学者の方々はそもそもLinux専用機を持っていません。だいたいWindowsです。

なんなら最近はMacBookのケースもあります。最悪ですね。


2. 選択肢が多く、いずれも誰かのニーズを満たさない

そんなノートPCにROS(Ubuntu)をインストールしようとなるのですが、ここでも課題が。インストールアプローチが多い上にそれぞれメリットデメリットあり、多人数になるほど安定した講習が困難になるということです。

今回はWindowsに限定しますが、Windowsノートの場合にROSをインストールしようと思ったら意外とアプローチ方法は多く次の方法があります。

基本的にクリーンインストール以外はハードウェア的に何かしらのトレードオフがあり、制限やニーズに合わせて作るべきですが、その前提環境が「使用者のWindowsに依存する」というなかなか苦しい制約があります。つまり、インストールされているアプリケーションによってはうまくインストールできないということです。(例:ディスク容量


クリーンインストールに近い状態で環境を再現できるデュアルブートがありますが、Windows updateやOSの入れ直しで操作を誤ればどちらか(あるいはいずれも)のOSを吹っ飛ばす恐れがあり、特に重要なデータや複数アカウントログインがされているであろうWindowsでそれをするのはリスクでしかありません。


そのため、インストールが比較的簡単&戻しやすいLiveUSBを使用することが合理的だと考え、これを採用しました。


LiveUSBとは

説明不要な気がしますが、LiveUSBはUSBメモリ上にオペレーティングシステム(OS)をインストールして、PCやラップトップでそのOSを起動・動作させるためのものです。

手軽に作成でき、BIOSが生きていればブート可能なので、CPU・マザーボードの動作確認にも使えます。

OSのインストールでの使用がメインですが、 インストールせずともお試しができます。


LiveUSBはBIOS切り替えでOSの起動を行うため、起動した瞬間から権限がUSB側のOSに渡ります。そのため、そのOS自体がウィルスだった場合の挙動を防ぐことがほぼ不可能となっています。

そのため、動作を信頼できないイメージや他人のUSBを使ってブートしたりすることはしないでください。

もしも動作に不安がある場合は、署名がされているイメージを使ったり、VM(バーチャルマシン)環境でテストするなど、事前にそれが信頼できるものなのかの動作確認をおすすめします。


ISOファイルとは

さて、これからUSBに書き込むイメージを作成して焼きたいところですが、そもそもOSイメージの中身をご存知でしょうか?

UbuntuなどのOSイメージはだいたいISO9660(RAW CD Image)というCDファイルシステムのフォーマットに収められており、CD-ROMとしてマウントすることができます。

これをダブルクリックすると、GUIDパーティションテーブルがどこかのloopデバイスに展開されます。

GUIDパーティションテーブルは、Intel/AMDチップセットのOS起動に必須です。

マウントしたディスク内の casper というファイル内にOSの実体が入っています。

さらに掘り下げると、***.squashfsというファイルが見つかります。これを展開することでインストールされるであろうOSの中身を見ることができます。

LiveUSBのカスタムはsquashfsというファイルを展開して弄ってもう一度圧縮することで完成します。

squashfsの展開後にchroot(ルートディレクトリを強制的に移動させるコマンド)経由でいつもどおりのインストールコマンドを叩いてaptやsystemdの設定を行います。


(ちょっと脱線)壁紙の設定方法

壁紙の設定などの簡単な変更であれば、chrootを使用せずとも変更可能です。例えば次のような壁紙を設定してみましょう。

ペンギンさんと亀さんが仲良くPCを触っているイラストです

次のコマンドで設定できます。(パスは適宜変更してください)

cp ./penguin_turtle.jpg <path to target>/usr/share/backgrounds/
sed -i 's/warty-final-ubuntu.png/penguin_turtle.jpg/g' <path to target>/usr/share/glib-2.0/ schemas/10_ubuntu-settings.gschema.override


ISOファイルの生成に成功したら、RufusなどのOS書き込みアプリでUSBに書き込んでください。

Ubuntuであれば、Disksアプリケーションの「Restore Disk Image」で簡単に焼けます。

Disksの画面(選択中のディスクはSSDなので注意!

焼いたら完成です!楽しいROS 2 布教ライフを送ってください🐢🐧🤗


インストールされるアプリケーション

リポジトリ内の作成手順では、次のアプリケーションが入っています。

  • ROS 2 Humble (Desktop-full)
  • librealsense
  • OpenVINO

シミュレーションもUSB3.2経由でのRealSense起動いずれもできました。

あなたが布教したいROS 2環境は何ですか?ぜひ作成してその情熱をぶつけちゃいましょう!

リポジトリ

github.com

参考資料

help.ubuntu.com

RVizで𝕏する(Rviz2・WebEngineWidgets)

みなさんは、毎日ロボットのデバッグにRvizを使っていると思います。

しかし、(おそらく)ツイ廃のあなたはデバッグ中もインターネットがこわれていないか気になって仕方ないですよね?

そこで、今回はブラウザをRvizに組込みたいと思います!🙃


動作環境

  • Ubuntu 22.04
  • ROS Humble (Qt5.15)
  • qtwebengine5-dev (apt intallで取得)

今回も例のごとく説明は省きまくっているので、Rviz用のQtプラグインの作成方法やDesignerの使いかたは公式サイトやサンプルプログラムなどを参考にしてください。

↓一応、私もチュートリアルを作っています。

github.com


UI

Qt Designerで適当に WebEngineWidgets を貼り付けます。

URLは https://x.com/ にします。

正しく設定できれば、プレビュー画面が見えます。

コード

UIからロードするだけなので非常にシンプル!

Rviz特有の設定はほぼありません。

// ======= x_com.cpp =======
// 作成した.uiファイル名によって変わる
// xxx.ui -> ui_xxx.h
#include "ui_x_com.h"

#ifndef Q_MOC_RUN
#include <rviz_common/panel.hpp>

#include <rviz_common/config.hpp>
#include <rviz_common/display_context.hpp>
#endif

namespace x_com
{
class XWidget : public rviz_common::Panel
{
public:
  explicit XWidget(QWidget * parent = nullptr)
  : rviz_common::Panel(parent)
  {
    ui.setupUi(this);
  }

private:
  Ui::XWidget ui; // UIファイルの設定に依るので注意
};

} // namespace x_com

#include <pluginlib/class_list_macros.hpp>
PLUGINLIB_EXPORT_CLASS(x_com::XWidget, rviz_common::Panel)

ビルド設定

plugins_description.xml

<library path="x_com">
  <class name="x_com/X.com" type="x_com::XWidget" base_class_type="rviz_common::Panel">
    <description>button panel</description>
  </class>
</library>
# ======= CMakeLists.txt =======
cmake_minimum_required(VERSION 3.25)
project(x_com)

set(CMAKE_AUTOUIC ON)

find_package(ament_cmake_auto REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets WebEngineWidgets)

ament_auto_find_build_dependencies()

set(QT5_LIBS Qt5::Core Qt5::Gui Qt5::Widgets Qt5::WebEngineWidgets)

ament_auto_add_library(x_com SHARED
    src/x_com.ui 
    src/x_com.cpp)
target_link_libraries(x_com ${QT5_LIBS})

pluginlib_export_plugin_description_file(rviz_common plugins_description.xml)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  set(ament_cmake_copyright_FOUND TRUE)
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_auto_package()

Rvizしながらツイッタ-!

ちゃんと動きます。

ただ、Rviz自体のリソースと競合するので、めっちゃ重い。

場合によってはフリーズしてしまいます🥲


みなさんもタイムラインのデバッグ、しちゃいましょう😉


Mac発表の噂らしいので、最小(?)Macタブレットでもどうぞ🍏

放置ネタを慌てて出したので、全体的にやる気がないのはご了承ください🙇

噂によると、どうやらAppleの新商品の発表日が近いらしい。

ascii.jp

iPad miniは2週間くらい前に突然発表されたらしく記事のMacシリーズももしかしたらいきなり登場するのかもしれない。噂によると今日とか書いてあります。

もちろんお目当てはMac miniですね。

私はこれまでデスクトップPCを組んで遊んでいましたが、正直もう飽きた省電力性や使いやすさの点から、M4になったら上位モデルを買いたいと思っています。

先週Intel CPUの新作が出ましたが、(Ryzenも含めて)ちょっともういいかなという感じ。

↓デスクトップCPUで遊んでた日々(もう3年前)

ar-ray.hatenablog.com

ar-ray.hatenablog.com

どうやらもっと小さくなるらしいので、期待するしかないですね。ところでどうやって予算を捻出しましょう…😇


小さい…といえば!

先ほど、Mac miniがもっと小さくなると言いましたが、そういえば私はMac miniしばきの達人ですから、Mac miniをSBC(シングルボードコンピュータ)として使っています。

M1チップになってラズパイ並の省電力とノートPCに負けない高効率な処理はCPUからユーザの直感に応えられるアプリケーションまで作り込める企業だからこそできる技でしょう。

↓ M1 Mac miniをしばいたのはいい思い出です。ついでにアイポン15Proを買ったのも🙃

ar-ray.hatenablog.com


あのiPadを目指して…

この時期は、5mmのiPadProで話題になっていた頃でした。Mac miniもこのビッグウェーブに乗れるのでは!?と思いちょっと改造していました。


分解しながら気づいたのですが、Macはハードウェア含めて技適が通っているので、バラして使えません。

完全に電波が飛ばないように工夫すると良いでしょう。(使用を諦めた理由①)


ディスプレイは7インチIPSタッチディスプレイを使用しました。

サイズ感は全く問題なく、スマホのような画面で映せるのはよいですね。

ラズパイで動かした様子

千石でたくさんコネクタを買ってきていろいろ繋げたりしてました。小さいのを選んできても結局ケーブルの取り回しで大変なことになってしまい、ケーブルだけでディスプレイが立ってしまう羽目に…

そして、サイズOK!と思ってMac miniと組み合わせたところ…

厚さ4cm!

分厚いMacPadだ…

目標の8倍オーバーの厚さです。しかもケーブル分でまだまだ厚さが増します。

もうこれはMacの内弁当…🍱😇🍱(諦めた理由②)

ジョブズ様による天罰が降る前に分解しました。


そして、最後は、Mac自身がタッチ操作にデフォルトで対応していないことです。(諦めた理由③)

商用アプリであれば使える?らしいですが、試用版すらライセンスが通らなさそうな雰囲気だったので、諦めました…🥲

いつかはタッチできるようになってほしい…!


終わりに

Macは本当に楽しみですが、昔のようなCPU速度に対する魅力は感じなくなってしまいました。

でもよく考えてみたら、10年前・20年前のPCもサクサク動くものはサクサク動いていたわけで単に歳を取っただけなのかもしれませんね…🥲

それにしても今開発に使えるPCを求めたら、Windowsノートですら20万に乗りそうになるの辛いですね。円安〜😇

ROSCon JP 2024に参加しました。

久しぶりの投稿です。

昨年に続き、今年もスポンサー枠でROSCon JPに参加していました。

(プロ意識が欠けまくっており、写真の撮影を怠っておりますが)その様子を紹介します。

rosconjp会場

早朝からロボットを運搬して会場でセッティングしてました。

昨年から2段増えて3段のロボットを展示しました。 展示スペースが小さく見えますね🙃

展示用のロールアップバナーは新しく作成したようで、ROSCon JPで初お披露目です✨


ロボットの展示

昨年よりもロボットの展示が増えていた気がします🤖

どれも興味深かったです。


ロボットの開発用機サンプルのほか、警備ロボット、ヒューマノイドもいました。

ロボットたくさん

AIと組み合わせた展示も興味深かったです。

高速な推論と高度な対話能力を兼ね備えたAIを活用したロボットのデモでは、カチャカの展示じゃないのにカチャカがいました👀

「他のロボットと組み合わせて動かせる」のはロボットのパーツ拡張の可能性を感じさせる面白い試みだなと感じました。

音声入力・解析・物体検出における高速化がこの応答性を実現しているらしいです。

…と思ってディスプレイを見たらXで見たことのあるデモが!


センサの展示

他の展示も興味深かったです。

こちらはLiDARのデモ。高密度なデプスマップを出力できるそうす。

リアルタイム性を考慮した開発基盤の説明(micro-ROS)も面白かったです。開発のハードルが高そうですが、組み合わせて使ってみたとか面白そう。


その他

空いた時間で発表を聞いたり、𝕏でいつもお世話になってますの人たちと雑談していました(仕事を放棄したわけじゃないですよ🙃)

最近の学生のROS事情などを聞いていましたが、高校生・高専生低学年もROS導入してロボットを動かしているようで、最近の学生コワイをもう早速実感しています。

私がROSに入門してしばらくした頃、「将来的には高校生もROS入門をするだろう」と考えて高専生向けROS講座を開いていた頃がありましたが、思ったよりずっと早くこの時期が来てしまったようです。

いい傾向だと思います(我田引水ムーブ)

ちなみに、基本的に質問の場がメインになっていますが、Discordサーバも継続中です。↓

ar-ray.hatenablog.com

レセプションのイチゴ。大好評でした🍓

はじめてROSJPのLTを聴講してから早4年、これからもROS関連のイベントに積極的に参加し、貢献できるように頑張ります🐢💪


撤収後は、浅草のおみくじでベイズ推定をしていました。

ちなみに、8人がそれぞれ1回ずつ引いて、大吉0、凶3でした😇