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

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

CUDA12を使ってみた

AmazonブラックフライデーセールでSSDを買いました。初めてのM.2です。

ポイントアップキャンペーンに乗じて新しいスマホを買ったばかりなので本当に金欠…


SSDの使い道は、Ubuntu20に使おうと思います。今使っているUbuntu20用のSSDが250GBですでに5年以上使用しているのでちょうど良いタイミングでした。

環境構築していたところ、新しいCUDAバージョン"CUDA 12.0"が提示されていたようなのでいつもはCUDA11を入れる代わりにCUDA12を入れることにしました。


CUDA12とは

CUDAはNVIDIAが提供しているGPGPUGPUを用いた並列コンピューティング)ライブラリ郡です。

GPGPUは主に配列の計算を得意としており、画像処理や点群処理などのニューラルネットワークなどの並列性の高いアプリケーションに対してCPUよりも高速に処理可能です。

CUDAはC/C++言語でライブラリを使用することができ、そのコンパイル・実行には対応するNVIDIAドライバが必要です。


CUDA12ではNVIDIAが開発・提供する新しいアーキテクチャ "Hopper" に対応し、他にもC++20対応やデフォルトの言語が C++17 に対応したりとバージョンに追いつくためのアップデートが盛り込まれています。

一方で、CentOSやKeplerサポートが終了したり、前世代の非推奨APIが削除されていたりします。

また、32bitサポートを行わなくなりました。(Hopper以外は以前のバージョンでサポートされます。)


ここでは、CUDA12のインストールと動作確認を行います。

使用するパッケージは、darknet_ros_fp16にしました。

darknetはCUDAとOpenCVさえ入っていればなんとなかなる(CUDAすらいらない)ので、非常に環境構築がしやすいです。


インストール

NVIDIA Driverのインストール

NVIDIAドライバは、以下のページからダウンロードしてください。

2022/12/09時点の最新バージョンは525.60.11でした。

www.nvidia.com

まず、nouveauの無効化をする必要があるので /etc/modprobe.d/blacklist.confを開いて以下を追記します。

blacklist nouveau
options nouveau modeset=0

適用のために sudo update-initramfs -u を実行して再起動します。

再起動後にNVIDIAドライバの実行用ファイルに管理者権限をつけて実行します。CLI画面推奨。

ここでは、NVIDIA-Linux-x86_64-525.60.11.run をインストールします。

sudo apt update
sudo apt install g++ cmake # minimal installation でインストールした場合
cd ~/Downloads
chmod -x ./NVIDIA-Linux-x86_64-525.60.11.run
sudo ./NVIDIA-Linux-x86_64-525.60.11.run
sudo reboot

nouveauについてはNVIDIAのページを見てください。

download.nvidia.com


CUDAのインストール

※最新のインストール方法については以下のURLを参考にしてください。

CUDA Toolkit 12.0 Downloads | NVIDIA Developer

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.0.0/local_installers/cuda-repo-ubuntu2004-12-0-local_12.0.0-525.60.13-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-12-0-local_12.0.0-525.60.13-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2004-12-0-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

鍵関連でいつの間にかエラーになるの、なんとかならないですかね…(私だけ?)


シンボリックリンクの貼り直し

darknet_ros_fp16のインストール実行時に libcuda.so が見つからないというエラーが出たので、リンクを貼り直しました。

過去の記事を参考になりました。過去の自分ナイス。

ar-ray.hatenablog.com

sudo ln -s /usr/lib/x86_64-linux-gnu/libcuda.so.525.60.13 /usr/lib/x86_64-linux-gnu/libcuda/libcuda.so


ROS2のインストール

ここでは、ROS-Galacticを使用しました。

darknet_ros_fp16では、Humbleも使用可能です。

以下のURLからROSの環境構築の手順を実行してください。

docs.ros.org

追加で python3-colcon-common-extensionsもインストールしてください。

sudo apt install python3-colcon-common-extensions


ビルド

Humbleの場合はGalacticをHumbleにしてください。

sudo apt install ros-galactic-desktop ros-galactic-v4l2-camera
source /opt/ros/galactic/setup.bash
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
git clone --recursive https://github.com/Ar-Ray-code/darknet_ros_yolov4.git
darknet_ros_yolov4/darknet_ros/rm_darknet_CMakeLists.sh
cd ~/ros2_ws
colcon build --symlink-install

実行

Webカメラをコンピュータに接続します。

source ~/ros2_ws/install/setup.bash
ros2 launch darknet_ros demo-v4-tiny.launch.py

darknetはいつの環境でも変わらず動くのですごい!(感心)

ChatGPTを使ってブログを書く:タイトル「ChatGPTについて」

※この引用ブロックに囲まれている文字列はChatGPTに問いかけた文章です。出力された文章を整形 (改行) などを行っています。


ChatGPTの概要

ChatGPTは、自然言語処理タスク用に訓練された大規模な言語モデルです。

つまり、自然言語を理解し、適切な応答を生成することができるようになっています。

ChatGPTは、大量のテキストデータを元に訓練され、人間のように自然な会話を行うことができるようになっています。

また、自然言語の文章を読み取り、その文章からの情報を抽出することもできます。

ChatGPTは、人工知能技術を使用しているため、文章の生成や情報の抽出は、自然な言葉で行われます。つまり、人間が書いたような文章を生成することができます。

ChatGPTは、現在、多くの用途で使用されており、自然言語処理タスクで有用な情報を抽出するための技術として広く活用されています。また、人工知能を使用した会話システムやチャットボットなどの様々なアプリケーションでも採用されています。


ChatGPTのメリット

ChatGPTのメリット3つ

  1. 大規模な訓練データを元に訓練されており、人間のような自然な会話を行うことができるため、ユーザーとの会話がより自然で迅速に行えるというメリットがあります。

  2. 自然言語の文章を読み取り、その文章からの情報を抽出することができるため、自然言語処理タスクで有用な情報を抽出することが可能です。

  3. ChatGPTは人工知能技術を使用しているため、文章の生成や情報の抽出は、自然な言葉で行われます。つまり、人間が書いたような文章を生成することができます。これにより、会話システムやチャットボットなどのアプリケーションでの使用がよりスムーズで容易になります。


ChatGPTのデメリット

ChatGPTのデメリット3つ

  1. ChatGPTは、自然言語処理タスク用に訓練された大規模な言語モデルですが、訓練済みのモデルを使用するため、特定のタスクや用途に限定される可能性があります。つまり、特定の分野や用途に特化したモデルを必要とする場合、ChatGPTを使用することが難しいというデメリットがあります。

  2. ChatGPTは、人工知能技術を使用しているため、生成される文章や抽出される情報は、原文に忠実であるとは限りません。また、人工知能には偏りがあるため、不適切な応答や情報が生成されることがあるというデメリットがあります。

  3. ChatGPTは、大量のデータを元に訓練されているため、訓練済みモデルはデータセットに依存します。つまり、訓練済みモデルを使用する場合、入力されるデータがデータセットと同じものである必要があり、異なるデータセットを使用する場合は、モデルを再訓練する必要があるというデメリットがあります。


使用例

ChatGPTの使用例

ChatGPTは、自然言語処理タスクで有用な情報を抽出するための技術として広く活用されています。

例えば、文章中から特定の単語やフレーズを抽出し、その情報を用いて検索システムやサマリー生成システムなどを構築することができます。

また、人工知能を使用した会話システムやチャットボットなどのアプリケーションでも採用されています。

また、医療分野や法律分野などで、文章から有用な情報を抽出する必要がある場合にも、ChatGPTが有効な技術として採用されることがあります。


ChatGPTの文をブログに載せてもいい?

ChatGPTの文をブログに載せてもいい?

個人的に著作権保有していると思われる文章を、他人のブログやウェブサイトに載せる場合は、著作権を侵害する行為になる可能性があります。

そのため、ChatGPTで生成された文章を自分のブログやウェブサイトに載せる前に、ChatGPTの使用規約や著作権に関するポリシーを確認することをおすすめします。

また、ChatGPTで生成された文章を自分のブログやウェブサイトに載せる場合は、必ず出典を明記するよう心がけましょう。


確認しました

Terms of Use3. Content よりAs between the parties and to the extent permitted by applicable law, you own all Input, and subject to your compliance with these Terms, OpenAI hereby assigns to you all its right, title and interest in and to Output. (入力が所有者のもので本規約を遵守する場合、出力結果の権利・利益は全て譲渡される)

ChatGPTが起こす変革は?

ChatGPTが起こす変革は?

ChatGPTは、自然言語処理タスク用に訓練された大規模な言語モデルです。

つまり、人間が行っている自然言語処理タスクを代替することができる技術です。

そのため、ChatGPTを採用することにより、人間が行っていたタスクを代替することができます。

そのため、ChatGPTの採用により、自然言語処理タスクを行う人間の労働力が減少する可能性があります。

また、ChatGPTは、人工知能技術を使用しているため、文章の生成や情報の抽出は、自然な言葉で行われます。

このため、ChatGPTの採用により、文章の生成や情報の抽出において人間が行っていた作業が変革される可能性があります。


ChatGPTで奪われる仕事は?

ChatGPTで奪われる仕事は?

ChatGPTは、自然言語処理タスク用に訓練された大規模な言語モデルです。

つまり、文章からの情報を抽出したり、人工知能を使用した会話システムやチャットボットなどのアプリケーションを構築することができます。

そのため、ChatGPTを採用することにより、人間が行っていたこれらのタスクを代替することができます。

したがって、ChatGPTの採用に伴い、それらのタスクを行っていた人間が失う仕事がある可能性があります。


ChatGPTにどう向き合うべきか

人間はChatGPTにどう向き合うべきか

ChatGPTは、自然言語処理タスク用に訓練された大規模な言語モデルです。

つまり、人間が行っている自然言語処理タスクを代替することができる技術です。

そのため、ChatGPTを採用することにより、人間が行っていたタスクを代替することができます。

そのため、人間がChatGPTと向き合うべきかについては、そのタスクが自然言語処理タスクであり、ChatGPTを採用することが有益であるかどうかを検討する必要があります。

また、ChatGPTが生成する文章や抽出する情報が正確であるかどうかも確認する必要があります。


ChatGPTのまとめ

ChatGPTのまとめ

ChatGPTは、自然言語処理タスク用に訓練された大規模な言語モデルです。

ChatGPTは、大量のテキストデータを元に訓練され、人間のように自然な会話を行うことができるようになっています。

また、自然言語の文章を読み取り、その文章からの情報を抽出することもできます。

ChatGPTは、人工知能技術を使用しているため、文章の生成や情報の抽出は、自然な言葉で行われます。

ChatGPTは、現在、多くの用途で活用されており、自然言語処理タスクで有用な情報を抽出するための技術として広く利用されています。

また、人工知能を使用した会話システムやチャットボットなどの様々なアプリケーションでも採用されています。


NG例

ChatGPTに対するネットの反応

申し訳ありませんが、私はインターネットの情報を参照することができません。ChatGPTに対するネット上の評価や反応などについては、お答えすることができません。私は大規模な言語モデルであるChatGPTの概要や特徴、メリット、デメリット、使用例などについて回答することができます。ご質問の内容が変わりましたら、お気軽にお問い合わせください。

ChatGPTへのURL

申し訳ありませんが、私はChatGPTの公式サイトのURLを知りません。 (以下ChatGPTの説明)

ChatGPTを使用してみた感想

私は、ChatGPTを実際に使用した経験はありません。 (以下ChatGPTの説明)

Raspbian + ROS2向けクロスコンパイル環境が完成したので公開します。

私は、Raspberry Pi OS (Raspbian) + ROS2の環境構築には結構時間をかけて取り組んでいます。

過去記事:ROS2-HumbleのRaspbian-Bullseye (32bit/64bit)向けビルドを公開しました。

最近ではRaspbian上でRviz2を動かせるようになり、ほとんどの依存関係は解消できるようになりました。


Raspbianにこだわっている理由としては、UbuntuがRaspberryPiには結構重く、他の人がRaspberryPi+Ubuntuで開発をしているものを見る感じでも使いづらいだろうなーと感じたからです。RaspbianだとVSCodeも使いやすいです。


最近は、私が公開しているRaspbian向けのROSインストーラである「rpi-bullseye-ros2」の使用報告もあり、GitHub Sponsor経由での支援も頂いています。

まだまだ途上ではありますが、必要とされていることを実感でき嬉しい限りです。

github.com

このパッケージは私も毎週のように使用しており定期的に改善を行っているので、改善提案などあればissueやpull requestを送っていただけるとありがたいです。


コンパイルが…遅い

ところで、皆さんはRaspberryPi向けにクロスコンパイルを行っていますか?

私は、半年前まではデスクトップPCでプログラムを作成して、完成したらランタイムのRaspberryPiでコンパイルをしていました。(その当時は、ROSもRaspberryPiでコンパイルしていました…)

RaspberryPiでコンパイルはやはり遅いのと、パッケージが大きすぎた場合にRAMによってはフリーズしてしまいます。

できれば高性能なコンピュータであらかじめコンパイルできると、大きなプロジェクトでも手軽にコンパイルできるのになーと思いクロスコンパイルツールの模索をしていました。

当初は同じARM64のJetson AGXでクロスコンパイル環境を作成しており、debian/bullseye環境のDockerコンテナを作成してワークスペースをマウント→コンパイルしていました。

bullseye環境上でコンパイルしたパッケージは、そのままUbuntu環境のJetsonでも動作します。

そのうち、Twitterで教えてもらったqemu-user-staticを使用してx86-64コンパイルするようになりました。

qemu-user-staticは、そのコンテナを実行した後のターミナル使用するDockerの環境がARMなどの別アーキテクチャになる魔法のようなコンテナです。

github.com

qemuと同様に命令変換コストがかかりますが、高性能なデスクトップコンピュータ(i9-12900KF)であればRaspberryPiの4.6倍の速度でコンパイルすることができます。

コンパイル速度比較

ちなみに、qemuありとなしではなしの方がありに比べて4倍の速度がありました。命令の変換コスト、高いですね…


ロスコンパイルツールの使用方法

これまでの知見をもとに、Dockerfileと実行スクリプトGitHubリポジトリを作成しました。

github.com

使用する際はFork推奨です。


rpi-bullseye-ros2-xcompileのインストール

現時点では、Dockerfileなどを書き換えやすいようにショートカットのみを作成しています。

git clone https://github.com/Ar-Ray-code/rpi-bullseye-ros2-xcompile
cd rpi-bullseye-ros2-xcompile
bash create_alias.bash
source ~/.bashrc

サンプルプロジェクトのダウンロード

サンプルプロジェクトをダウンロードします。

ROSで画像処理を行う際に必要な依存パッケージであるimage_commonを使用します。

mkdir -p ~/ros2_ws/src/
cd ~/ros2_ws/src
git clone https://github.com/ros-perception/image_common -b ros2

github.com

コンパイル

xcompile_rpi_ros2 [ros2用のワークスペース] [Docker内で実行するシェルスクリプト(オプション)]コンパイルできます。

aptで追加パッケージをインストールしないといけない場合やコンパイルオプションを変更したい場合は、以下のファイルを編集してください。

xcompile_rpi_ros2 ~/ros2_ws

コンパイルが正常に終わると、対象ワークスペース(ここでは ~/ros2_ws)に built_pkg_rpi_<unixtime>.zip が作成されています。コンパイル時のタイムスタンプが付いているので、上書きされません。

RaspberryPi上で使用したい場合はunzipして、展開後のsetup.bashを実行してパスを通すだけで使用できます。


Zenn Booksでのドキュメント化📕

現在、チュートリアル資料やクロスコンパイルのノウハウなどを含めたドキュメントをZenn Booksで作成中です。

タイトルは「RaspberryPi OSで始めるROS2」で、ほとんどの項目を無料公開にする予定です。


他の有料記事に負けない分量とクオリティを目指す予定なので、今しばらくお待ちください。

ティア某カメラを使ってみる&ROS2での使用

ティア某カメラ(Automotive Grade HDR Camera C1)の使用感想まとめ + ROS2での使用です。


このカメラはレベル3/4の自動運転向けに開発されており、カメラ内部でHDR処理を行うことができます。

防水防塵であるため、ロボティクス界隈のコワイ人たちによって水に沈められていたりします…


主なスペック(C1)

sensor.tier4.jp

  • 2.5MP高解像
  • 120dB HDR
  • LEDフリッカ低減
  • HW/SWシャッタートリガ(同期)
  • IP69K 防水防塵
  • 動作温度 -40 to 85°C

コネクタはGMSL2となっており、専用変換基板が必要です。

現時点では Jetson AGX developer Kit が必要です。


レビュー

とりあえずトンネルを擬似的に作成し、LEDライトを逆光に見立てて検証。

人間でもトンネルから出る際は、目が慣れるには時間がかかりますよね。

左側がティア某カメラ、右側がスマートフォンで焦点を異なる位置に合わせて撮影した画像です(HDRなし)。

しっかりと逆光対策できており、LEDの形まで見えてしまうほどの性能でした。

元ツイート

このカメラのすごいところは、HDR調整済みの画像がほぼ遅延なしに出力されることです。

逆光や反射に悩まされることが少なくなるという点で、開発者にやさしいカメラと言えるでしょう。


もっと過激に!?

この検証で満足していたところ、開発者様より「もっと過酷な環境でやって」とのお達しが来たので、夕日を撮影してみました。

ついでに周りにあったカメラも合わせて撮影してみました。カメラ側でリアルタイムHDRが可能なカメラの選択肢がほとんどないため、もはや出来レースですが…

ティア某カメラの他にZED2 Stereo camera、SANWA製4K解像度Webカメラ、RealSense D435iを使用しています。

元ツイート

予想通りではあるけれどもかなり綺麗に映っています。太陽の影響を受けにくく眩みにくい!

他のデバイスの追随を許さない圧倒的性能です。


フリッカー抑制

このカメラにはフリッカー抑制性能がついています。

信号機・電子標識は元の交流を全波整流で100Hz/120HzのPWM風の点滅(フリッカー)にします。

人の眼では分からないほど早いものですが、HDRカメラでは素子の短時間露光を行う必要があり、この点滅がたまたまカメラのシャッタータイミングに合致してしまった時に信号機が無灯火状態になります。

これでは信号や標識の検出には全く使えないので、フリッカー抑制機能がついている素子を利用する必要があるそうです。


フリッカー抑制機能付きの素子では、素子の特性を活かして露光時間を比較的長くすることができるため、点滅時の影響を低減することができます。

このサイトの解説がわかりやすかったです。(C2カメラの素子についての解説です)

thinklucid.com


左端から40Hz/50Hz/60HzのPWM電圧をLEDに印加して検証しました。50Hz付近で平滑化されていることが分かったのですが、少々暗くなっているようにも見えました。

元ツイート


ただ、実際の信号機は全波整流によって直流化されており、100Hz/120Hzで点灯しています。そのため、この検証は少し厳しすぎる環境だったみたいです。

100/120Hzの点滅では、暗くなっているようには見えなかったので、問題ないと感じました。

全く暗くなる気配を感じなかったので、載せません


ROS2での使用

ティア某カメラは、特製のLinuxカーネルを当てることでv4l2カメラとして認識させることができます。

そのため、カメラの設定を変更するだけでこれまでと同じプログラムでカメラを使用することができます。


imageトピックの送信にはgscam-nodeを使用します。

github.com

ROS-eloquent環境で動かしたのでビルドが必要でした。


ここでは、darknet-rosを使用して画像検出デモを行いました。

darknetは依存関係が複雑でないので環境構築が楽でいいです。

github.com

以下にLaunchファイルを示します。1台接続の場合の書き方になります。

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():

  gscam = Node(
        package="gscam", executable="gscam_node", # ROS-foxy
        # package="gscam", node_executable="gscam_node", # ROS-eloquent
        parameters=[
            {"gscam_config": "v4l2src device=/dev/video0 ! video/x-raw ! videoconvert"},
            {"sync_sink": False},
        ],
        remappings=[
            ("camera/image_raw","image_raw")
        ]
    )

  return LaunchDescription([
    gscam,
  ])

元ツイート


ちなみに、1台だけ接続されている場合のみOpenCVのVideoCaptureで(0)を指定するだけでも認識できます。(デフォルトで設定されているオプションに依存)


おわりに

他社の追随を許さない高性能な自動運転カメラを試してみました。

個人的には、ZED2 Stereo cameraのようなキャリブレーション済みのステレオカメラモジュールもあると嬉しいので密かに期待しています。


RealSenseを接続しているのにpipelineをオープンできないトラブル(librealsense・RaspberryPi)

librealsenseのビルドオプションについて注意すべきところがあったのでメモ


RealSenseをサポート外のOSで使用する場合は自分でビルドする必要があります。

私はRaspberryPi OS BullseyeとUbuntu22向けにビルドしています。


以前ビルドしていたRaspi向けのlibrealsenseではpyrealsense2が含まれていなかったので再度ビルドしてインストールを行なったところ、USBにRealSenseを接続しているのにも関わらず RuntimeError: No device connected となり、デバイスを開くことができません。

RealSenseが壊れているわけではなく(Ubuntu20で動いた)バスパワーが足りていないと思ってリピータブルケーブルを繋いでも接続が開始されず…(しかし、lsusbでは見える)


解決策

-D FORCE_LIBUVC=ONを追加してlibrealsenseをコンパイルします。(デフォルトではOFF)


以上を踏まえてビルドコマンドをこのようにします。

  • example系はビルド無し
  • pyrealsense2のビルド
cmake -DBUILD_EXAMPLES=false \
    -DUILD_GRAPHICAL_EXAMPLES=false \
    -DBUILD_WITH_OPENMP=true \
    -DBUILD_PYTHON_BINDINGS=true \
    -DFORCE_LIBUVC=true \
    -DCMAKE_BUILD_TYPE=Release ..

make -j4

4GB RAMであればSWAP拡張せずともビルドが通りました。


参考

dev.intelrealsense.com

github.com