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

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

WSLgでdarknetを動かす

 Windows Insider Previewを試してみた。WSLgがやばい - えいあーるれいの技術日記の続きです。

 WSLgを使えたはいいけど、実際にはどのくらい使えるのかという疑問があったので、CUDAや表示テストも兼ねてdarknetを動かしてみました。

 環境は前回と同様です。NVIDIA 470.14を使用しています。

 WSL用NVIDIAドライバは以下から↓

GPU in Windows Subsystem for Linux (WSL) | NVIDIA Developer

CUDAのインストール

 WSL-Ubuntu用のCUDAが専用で用意されています。以下のリンクにアクセスして「Linuxx86_64→WSL-Ubuntu→2.0→適当なインストール方法」の順に選択してインストールを行います。今回は11.3を使用します。

f:id:Ray_ar:20210522100634p:plain

CUDA Toolkit 11.3 Update 1 Downloads | NVIDIA Developer

 ただし、ダウンロードしたファイルはUbuntu上に移動してから実行するようにしてください。

 インストールプロセスがすべて終わったあとはwsl --shutdownなどでWSL2を再起動してください。また、GUI表示がバグった場合もWSL2の再起動してみてください。

実行

 darknetの実行についてはhttps://github.com/AlexeyAB/darknetを参考にしてください。

 Makefileの書き換えについては、必ず適切なGPUアーキテクチャを指定してください。直Ubuntuでは何もいじらずとも実行はできましたが、WSL2だとコンパイルはできても動かないので注意してください。

 例えば RTX 2080 Ti (TU102)ならGPU=1,OpenCV=1にして次の行をコメントアウトします。

# GeForce RTX 2080 Ti, RTX 2080, RTX 2070, Quadro RTX 8000, Quadro RTX 6000, Quadro RTX 5000, Tesla T4, XNOR Tensor Cores
ARCH= -gencode arch=compute_75,code=[sm_75,compute_75]

 コンパイルします。

$ cd darknet/
$ make

 実行します。

$ wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.weights
$ ./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights ./data/dog.jpg

f:id:Ray_ar:20210522100433j:plain

darknet_rosについて

 darknet_rosも動きました。環境構築は下記のリンクを参考にしてください。CMakeLists.txtのARCHは先ほどと同じように適切なものを選択してください。

qiita.com

Darknet学習・実行にオススメのGPU

 Darknetの学習・実行には非常に多くのGPUリソースが必要です。特にYOLO v4以降のモデルは実行だけでもVRAM 6GB以上必要になるので注意しましょう。VRAMが足りればゲーミングノートでも可です。

RTX 3060:ディープラーニングビギナーにオススメの1台。ディープラーニングはVRAM(GPUのメモリ)が最も重要なので12GBもあるRTX 3060は多少高騰気味の現市場でもオススメです。

Jetson (Xavier):組み込み用途としてはJetsonが有力です。一応RTXが搭載されたNUCやノートPCと比較して検討してみたほうが良さそうです。YOLO v4-tinyくらいなら30fps超えが可能です。

ROS2 Galacticのインストール。変更点を確認

 ROS Galacticのリリースが2021年5月23日にありました。Ubuntu20.04 LTSで動作する新しいROSですが、どのような機能が追加されているのかを勉強がてらRollingディストリビューションを使って試してみました。

 かなり多くの機能が追加されているようで少し使いやすそうです。

 このブログでは次の環境を使用しています。

  • Ubuntu 20.04 LTS on WSL2(Windows 10)
  • ROS Rolling(新機能)・ROS Galactic(インストール)

 一応実際に実行したものを記述していますが、まだまだ勉強中なので、適宜修正予定です。

インストール

$ sudo apt update && sudo apt install curl gnupg lsb-release
$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key  -o /usr/share/keyrings/ros-archive-keyring.gpg

$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu (lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

$ sudo apt update
$ sudo apt install ros-galactic-desktop

Galacticに移行すべき??Galacticの新機能まとめ

 以下、下記リンクの日本語訳です。Galacticで実装されているものはRollingでも同様に実装されているため、この記事ではRollingで説明しています。

docs.ros.org

rosrunのログレベル指定

 実行ごとにロガーレベルを任意の個数指定できるようになりました。例えば、下記のコマンドならWARNレベルとDEBUGレベルを変更できます。これによって、余計なログを消したり、ログを追加できたりします。  

$ ros2 run demo_nodes_cpp talker --ros-args --log-level WARN --log-level talker:=DEBUG

 上記のオプションを付けた場合とつけていない場合で比較してみました。「WARN」レベルを指定することでWARNに満たないレベルの出力をフィルタします。(Ctrl+Cの出力がフィルタされています)

f:id:Ray_ar:20210522121234p:plain

 例えば、すべてのレベルを「DEBUG」に設定した場合は次のようになります。

f:id:Ray_ar:20210522122022p:plain

 逆に、すべてのレベルを「ERROR」に設定した場合は何も出力されません。

rosidl

 CMakeを使用せずに、メッセージファイルからメッセージ用のファイル群(.hや.hppなど)を生成できるようになりました。どのような使い道があるのでしょうか…?プラグイン作成が楽になる(?)などのメリットがあるらしいですが…

 勉強がまだまだ足りないみたいです。

f:id:Ray_ar:20210522131731p:plain

QoSのオーバーライド

 Galactic以降はQoSをオーバーライドできるようになりました。以下のリンクをみる限りだと、Foxy以前で動いていたプログラムの実行時にQoSの上書きを行うyamlを当てることでQoSを行うみたいですね。QoS設定を外部から上書きできるのは便利ですね。

demos/quality_of_service_demo at a66f0e894841a5d751bce6ded4983acb780448cf · ros2/demos · GitHub

External configurability of QoS policies.

Python で point_cloud2 が使用可能

 point_cloud2がPythonで使えるようになったそうです。

Port of point_cloud2.py from ROS1 to ROS2. by SebastianGrans · Pull Request #128 · ros2/common_interfaces · GitHub

Rviz2タイムパネル

 ROS1のRvizの時間表示機能が移植されました。

f:id:Ray_ar:20210522122629p:plain
左がFoxy以前のRviz2、右がGalactic以降のRviz2

ros2 topic echo のオプションに "-raw" の追加

 デバッグ用らしいです。

[ros2topic] Add option to echo serialized messages by jacobperron · Pull Request #470 · ros2/ros2cli · GitHub

 f:id:Ray_ar:20210522152405p:plain

to_yaml関数(rclcpp)

 to_yamlで出力形式を変更できます。

 スクリーンショットでは、Twistをto_yamlで出力しています。分かりやすい。

#include <cstdio>

#include <std_msgs/msg/string.hpp>
#include <std_msgs/msg/int32.hpp>
#include <geometry_msgs/msg/twist.hpp>

#include <iostream>

int main()
{
  std_msgs::msg::String msg_string;
  std_msgs::msg::Int32 msg_int32;
  geometry_msgs::msg::Twist twist_data;

  msg_string.data = "hello world";
  msg_int32.data = 10;

  std::cout << rosidl_generator_traits::to_yaml(twist_data) << std::endl;

  printf("%s", rosidl_generator_traits::to_yaml(msg_string).c_str());
  printf("%s", rosidl_generator_traits::to_yaml(msg_int32).c_str());
  return 0;
}

f:id:Ray_ar:20210522163722p:plain

ros2コマンドを使用して実行時にパラメータファイルをロードする機能

Add rosparam verb load by v-lopez · Pull Request #590 · ros2/ros2cli · GitHub

 yamlファイルから実行時にパラメータをロードする機能が追加されているようです。(現在のFoxyでもできないことはないと思うのですが…?よくわかっていません。)

Terminal 1

$ ros2 run demo_nodes_cpp parameter_blackboard

Terminal 2

$ ros2 param set /parameter_blackboard foo bar
$ ros2 param dump /parameter_blackboard 
$ ros2 param set /parameter_blackboard foo different
$ ros2 param load /parameter_blackboard ./parameter_blackboard.yaml

QoS非互換性チェック機能

※ rollingでは確認できませんでした

 ros2doctorにQoS互換性をチェックするツールが追加されたそうです。

個人的な総評

 Galacticは主にログレベル系統のアップデートが充実しています。そのため、2022年以降(2024年メイン)のシステムも見据えている場合や単純に個人で開発している人には使いやすいのかなと感じました。

 ただし、ROS2 Foxyユーザが昨年から今年の3月にかけてROS2史のなかでもこれまでにないレベルで増えていることを考えると、パッケージはFoxyが主流になるのかなーと思います。

 しばらくはFoxyの開発が中心になるのかなーと思います。

 なにかGalacticの長所を生かした実装ができればまた投稿したいと思います。

Windows Insider Previewを試してみた。「WSLg」がやばい

 帰省した関係で、久しぶりにWindows10を触る機会がありました。Windowsは2か月くらい前に消してしまってからその間触っていないため、結構新鮮だったりします。

 そういえば、2か月前にWSLgの開発の発表があったなーと思い、一度はあきらめたWSLgに再チャレンジしてみました。WSLgのインストール手順を示します。

 なお、現時点ではDocker DesktopのWSLgの動作が確認できていません。ROS2をWindowsとかでも開発したいと思っているので、ここではROS-Foxyの開発環境の整備までを行います。

環境

  • Windows 10 Home

  • 十分なメモリとCPUスペック(私は16GB RAMですが、足りません)

  • あきらめない心

Windows Insider Programへの登録

 WSLgのサポートは安定版リリースには含まれていないため、Windows Insider Programへの参加が必要です。

Windows10で、設定→更新とセキュリティ→Windows Insider Programに進んで、「devチャネル」で登録します。登録が完了したら、次のようなUIになるでしょう。

f:id:Ray_ar:20210517225932p:plain
Insider Program

 その後、何度か再起動を繰り返してシステムをアップデートします。

 アップデート後のバージョン情報は以下の通りです。

エディション   Windows 10 Home
バージョン Dev
インストール日   2021/05/17
OS ビルド    21382.1
エクスペリエンス    Windows 10 Feature Experience Pack 321.12100.0.3

WSL2のインストール

 WSL2のインストールを行います。基本的にはMicrosoft Docsに従えば問題ないでしょう。私は以前にWSL2を導入しているので、後述するwsl --updateだけでセットアップが終わりました。

 Microsoft StoreではUbuntu20.04LTSを選択しましょう。WSLのセットアップは以下のリンクから確認してみてください。

docs.microsoft.com

NVIDIA Driverのアップデート

 Intel内蔵グラフィックスを使用するか、AMD GPUを使用するか、NVIDIA GPUを使用するかで必要なコマンドが変わります。私はNVIDIA GPUを使用しているので、その前提で説明します。

 WSLgにはどうやらNVIDIA Driver 470が必要みたいなので、GPU in Windows Subsystem for Linux (WSL) | NVIDIA Developerにアクセスして必要なドライバを落としてきます。ここで私は、470.14_gameready_win10-dch_64bit_international.exeを入手しました。

 直接クリックしてインストールを開始します。一度インストールに失敗しましたが、もう一度同じことをしたらなぜかうまくいったので、二度、三度挑戦してみましょう。

 NVIDIA Driverインストール後は再起動します。

WSLgの有効化

 まさかのこれだけ。

wsl --update
wsl --shutdown

Ubuntu 20.04の起動

 Ubuntuを起動します。最初にユーザネームとパスワードを決定します。Ubuntu Serverみたいですね。

f:id:Ray_ar:20210517231919p:plain

ROS Foxyのインストール

 Debianパッケージでいつも通りのインストールを行います。

docs.ros.org

Rviz2(GUIアプリ)の起動

$ source /opt/ros/foxy/setup.bash
$ rviz2

 終了するときは、Ctrl+cではなく、×ボタンを押します。

f:id:Ray_ar:20210517232347j:plain

その他 Windows Insider Preview (21382.1000)でのGUIの変更点(?)

 Windowsをあまり使っていなかったので、昔から実装されていたのに気づいていなかったところもあるかもしれません。

アイコンがちょっと変わってる

 結構WindowsGUI・システムが変更されています。あれ、これWindowsだっけ?というレベルの変更もされているようです。アイコンがなんかLinuxっぽいような…?

f:id:Ray_ar:20210517234107p:plain

Linuxのファイルに直接アクセス可

 まさかのデフォルトでUbuntuにアクセス可能でした。これはうれしい。ネットワークサーバのようなアイコンですね。 ドラッグアンドドロップを最初からできるのは素晴らしいです。ちなみに、WindowsのローカルディレクトリからUbuntuディレクトリにドラッグアンドドロップしたら、別のストレージのような挙動をします。(移動もとのファイルが消えることはありません)

f:id:Ray_ar:20210517235032p:plain

f:id:Ray_ar:20210517235008p:plain

 環境構築の再現をしたくないので、ぜひ、この記事で動かない!ということがあれば、ぜひ詰まったところを教えていただけると幸いです。

 次回はdarknet + Windows WSLgについて解説します。近日中にQiitaにも投稿したい。

WSLg使用上でのおすすめGPU

 WSLgにはある程度性能のよいGPUが必要です。用途に応じて購入を検討してみると良いでしょう。ココ最近はグラボが高騰気味ですが、いいタイミングを狙って賢く購入しましょう。

 私はRTX3080発表直後に中古のRTX 2080 Tiを9万円で購入しました。いいお買い物だったと今でも思います✨

GTX 1650:2080 Tiを購入するまではコレを使っていました。ゲームには厳しいと思いますが、CADやシミュレーションは快適になります。2.5万円を超えるとコスパが悪くなるのでゲーミングノートの方を検討するのもアリでしょう。

RTX 3060:ディープラーニングビギナーにオススメの1台。ディープラーニングはVRAM(GPUのメモリ)が最も重要なので12GBもあるRTX 3060は多少高騰気味の現市場でもオススメです。

参考になった資料

 インストール手順について参考になったリンク先を示します。

The Initial Preview of GUI app support is now available for the Windows Subsystem for Linux | Windows Command Line

WSLでGUIを使う(WSLg)

GitHub - microsoft/wslg: Enabling the Windows Subsystem for Linux to include support for Wayland and X server related scenarios

実質RTX 3090専用の激重ビー玉転がしゲームをやってみた(Marbles RTX x RTX 2080 Ti)

 やべーツイートが飛んできました。

 これはNVIDIAが自身の技術を結集して作ったデモ用のゲームで、パフォーマンステストなどにもよく使われる「NVIDIA Omniverse Launcher」に含まれます。

 このゲームの目的は「ビー玉を転がしてゴールまで動かす」というシンプルなもので、操作は「AWSDJ」の5キーのみです。

 しかし、このゲームが凶悪なのは、その必要スペック。

 なんと、11GB VRAMのRTX GPUが最小要件らしいです。

 すなわち、RTX 2080 Ti、RTX 3090、TITAN RTX、Quadro RTX 5000のようなウルトラハイエンドなGPU以外のGPUはお断わりということらしいです…

 RTX 3060でも動作可能だと思いますが、おそらく厳しいでしょう。(このレビューを見たらわかるでしょう。)

 最低限要求されるスペックを満たすRTX 2080 Tiを偶然持っていたので、プレイしてみました。

動作環境

 おそらく、私のPCが動くギリギリのスペックだと思います。

項目 スペック
GPU NVIDIA GeForce RTX 2080 Ti (VRAM:11GB)
CPU Ryzen 7 2700x (@3.7GHz x 16)
RAM 16GB DDR4

インストール

 このサイトからOmniverseをダウンロードします。

www.nvidia.com

 ダウンロード・起動したら、Marbeles RTX を選択してインストール行います。

f:id:Ray_ar:20210518134244p:plain

f:id:Ray_ar:20210518134318p:plain

 INSTALLアイコンがLaunchアイコンに変化するので、Launchアイコンを押します。

起動…

 2~3分間ほとんどフリーズすれすれのメモリ使用量でした。普段ゲームじゃなくてディープラーニングばかり動かしていたので、ここまで重いのか~と思いました。

f:id:Ray_ar:20210518140337p:plain

 ロードが終われば、メモリ使用量が落ち着き、まともに動くようになりました。しかし、スタート画面の時点ですでに47fps(1080p)…

 ポーズ画面でもレイトレが効いているということなのか。驚き。

f:id:Ray_ar:20210518140706p:plain

 プレイ中。CPUがネックになっているような挙動は見られなかったものの、描画が多い場所は7fpsまで落ちるところがありました。

 また、GPUの使用率VRAM使用率ともにほぼ100%を張り付き、爆熱になりました。

 1度もビー玉を落下させずにゴールできました。RTX 3090 + 十分なスペックのCPUとメモリがないとただのイライラゲームになります。

 プレイ中は集中していてグラフィックにあまり見ていませんでしたが、録画したプレイ動画を見ると、これがCG??と思ってしまうレベルできれいですねー-。

 あと数年したら、ビー玉の影もリアルになるのだろうか…?

 レイトレーシング技術に触れる機会はあまりないですが、技術の進歩を体験できるいい機会でした。

f:id:Ray_ar:20210518143231g:plain

RTX 3090 とは?

 NVIDIAが開発したGPU (Graphics Processing Unit) の型番の1つで、Ampareアーキテクチャのコンシューマ向けGPUとしては最高峰のモデルです。

 前作の最上位のRTX 2080 Tiと比較して1.7〜2.0倍の性能を持ち、4Kレイ・トレーシングや8Kゲーミングも想定されている新世代のGPUとして注目を集めました。

 ゲーミング、機械学習、マイニングなどのどの分野においても最高クラスのパフォーマンスを発揮します。

(以下の画像をクリックすると詳細ページに飛びます)

 この記事は、1日前倒しで投稿しています。次回の投稿日は、5月21日の予定です。

setup_ros_envの解説

 ROSの環境をpyenvのような表示で区別する - えいあーるれいの技術日記の続きです。

 GitHubにプッシュしたものはいいものの、全然使い方を解説していなかったので簡単に解説します。とても使いやすくて便利なので、私はROSのセットアップ後に必ず入れています。ぜひ使ってみてください。

 以下のリンクがリポジトリです。

github.com

セットアップ方法

 Ubuntu20.04(Foxy)とUbuntu18.04(Dashing)とUbuntu16.04(Bouncy)に対応しています。eloquentユーザはそのままのros2_init.bashでは環境がロードされないので、注意してください。

$ cd ~
$ git clone https://github.com/Ar-Ray-code/setup_ros_env.git
$ cd setup_ros_env
$ bash setup.bash
>> Enter ros1_workspace(abs path) : ~/ros1_ws
>> ~/ros1_ws
>> Enter ros2_workspace(abs path) : ~/ros2_ws
>> ~/ros2_ws

使用法

 使いたいバージョンを選択すればいいです。

ROS1の場合

example@example:~$ ros1_init
(noetic):~$

ROS2の場合

example@example:~$ ros2_init
(foxy):~$

ROS1(ROS2)を使う予定がない場合

 Enter ros1_workspace(abs path) で入力するときに何も入力せずにEnterを押せばスキップされます。ROS2の場合はEnter ros2_workspace(abs path)の時点でEnterを押してスキップしてください。

~/.bashrcの時点で環境をロードする場合

 バージョンの切り替えをせずに~/.bashrcの時点でfoxyをロードするけど、(foxy)を使いたい場合は、インストールは行わずに.bashrcに次のように記述します。

source /opt/ros/foxy/setup.bash
if ! test -z "$ROS_DISTRO"; then
export PS1="($ROS_DISTRO):\[\033[01;34m\]\w\[\033[00m\]$ "
fi

f:id:Ray_ar:20210517141154p:plain