2022年7月15日金曜日

ros2のpendulum_demoを実行してみた話

ros2のpendulum_demo[https://github.com/ros2/demos/tree/master/pendulum_control]を実行してみたときのメモ。

環境

ホスト環境

OS:PROXMOX VE 7.2
CPU:intel core i7 -11800H
Mem:16GB

ゲスト環境

OS:Ubuntu 22.04
CPU:8vCPU
Mem:12GB
非リアルタイムカーネル使用

pendulum_demoの実行

まずはそのまま実行してみる。

anishiyama@ubuntu-ros2:~/ros2/humble$ source ./install/setup.sh 
anishiyama@ubuntu-ros2:~/ros2/humble$ pendulum_demo 
Couldn't set scheduling priority and policy: Operation not permitted
Caught exception: std::bad_alloc
Unlocking memory and continuing.
Couldn't lock all cached virtual memory.
Pagefaults from reading pages not yet mapped into RAM will be recorded.
Initial major pagefaults: 0
Initial minor pagefaults: 315622
No results filename given, not writing results
rttest statistics:
  - Minor pagefaults: 0
  - Major pagefaults: 0
  Latency (time after deadline was missed):
    - Min: 57384 ns
    - Max: 210201 ns
    - Mean: 90464.533000 ns
    - Standard deviation: 25207.301195
PendulumMotor received 496 messages
PendulumController received 495 messages

いくつかメッセージが確認できるので、 readmeに従い/etc/security/limits.confを編集する。 同時にpriorityも98まで設定できるようにする。 実行ユーザがanisiyamaなので、次の記述を追加した。

anishiyama      -       memlock         10000000
anishiyama      -       rtprio          98

ログインし直して再実行。 メッセージはいくつか消えた。 仮想環境なためか、実行レイテンシは大きめ。

anishiyama@ubuntu-ros2:~/ros2/humble$ pendulum_demo 
Initial major pagefaults: 0
Initial minor pagefaults: 2124626
No results filename given, not writing results
rttest statistics:
  - Minor pagefaults: 0
  - Major pagefaults: 0
  Latency (time after deadline was missed):
    - Min: 8947 ns
    - Max: 224184 ns
    - Mean: 51156.345000 ns
    - Standard deviation: 29789.714229


PendulumMotor received 498 messages
PendulumController received 493 messages

2022年7月3日日曜日

ros2でカスタムパッケージをros2 coreコンテナで動作させてみた話

ros2 nodeのdockerコンテナ運用について考えてみる。
docker環境で動作させる記事は公式のチュートリアルに 紹介されているが、ビルド環境も一緒に動かしているので、 ros2のcore部分だけで動作させる方法を確認した。

実行方法

dockerインストール後に次の通り実行すれば良い。

$ git clone https://github.com/akira-nishiyama/build_ros2_exec_container_example.git
$ cd build_ros2_exec_container_example
$ docker-compose build
$ docker-compose up

実行結果

Starting env_listener_1 ... done
Starting env_talker_1   ... done
Attaching to env_talker_1, env_listener_1
talker_1    | [INFO] [1656748948.461309414] [minimal_publisher]: Publishing: "Hello World: 0"
talker_1    | [INFO] [1656748948.947667336] [minimal_publisher]: Publishing: "Hello World: 1"
talker_1    | [INFO] [1656748949.447749747] [minimal_publisher]: Publishing: "Hello World: 2"
talker_1    | [INFO] [1656748949.947751669] [minimal_publisher]: Publishing: "Hello World: 3"
talker_1    | [INFO] [1656748950.447781256] [minimal_publisher]: Publishing: "Hello World: 4"
talker_1    | [INFO] [1656748950.947751269] [minimal_publisher]: Publishing: "Hello World: 5"
talker_1    | [INFO] [1656748951.447926078] [minimal_publisher]: Publishing: "Hello World: 6"
listener_1  | [INFO] [1656748951.586250380] [minimal_subscriber]: I heard: "Hello World: 6
talker_1    | [INFO] [1656748951.947916486] [minimal_publisher]: Publishing: "Hello World: 7"
listener_1  | [INFO] [1656748951.948192281] [minimal_subscriber]: I heard: "Hello World: 7
talker_1    | [INFO] [1656748952.447858693] [minimal_publisher]: Publishing: "Hello World: 8"
listener_1  | [INFO] [1656748952.448205040] [minimal_subscriber]: I heard: "Hello World: 8
talker_1    | [INFO] [1656748952.947910963] [minimal_publisher]: Publishing: "Hello World: 9"
listener_1  | [INFO] [1656748952.948246575] [minimal_subscriber]: I heard: "Hello World: 9

環境

ホスト環境

OS:PROXMOX VE 7.2
CPU:intel core i7 -11800H
Mem:16GB

ゲスト環境

OS:Ubuntu 22.04
CPU:8vCPU
Mem:12GB

docker環境

base:Ubuntu 22.04
ros2:humble

内容

Dockerfile

まず最初にbuild対象パッケージをros2 build環境(docker)に取り込む。
対象パッケージの動作確認は予め済ませておくこと。
方法は
1.ホスト環境のパッケージを直接取り込む
2.vcstoolを使ってgitリポジトリから収集する
が良さそうかな。
バージョン管理考えるとgitリポジトリ使う方が良さそうだけど、 外部リポジトリ参照したり、パッケージとして使ってもらわない場合は今回のリポジトリのようにDockerfile等と合わせての管理も簡単そう。
該当箇所は次の通り。

################################
# multi-stage for build
################################
FROM ros:humble-ros-base-jammy as build
#project workspace
ARG PRJ_WS=/workspace/install
ARG TMP_WS=/tmp
WORKDIR $TMP_WS

# import project
# copy from host directory.
COPY ./project/src $TMP_WS/src
## clone using vcstool is also ok.
##(see https://github.com/dirk-thomas/vcstool for detail)
#RUN echo "\
#repositories: \n\
#  ros2/demos: \n\
#    type: git \n\
#    url: https://github.com/ros2/demos.git \n\
#    version: ${ROS_DISTRO} \n\
#" > ./project.repos
#RUN vcs import ./src < ./project.repos

PRJ_WSがros2実行環境の配置場所で、TMP_WSがbuild時の作業スペースとなっている。 ソースの収集が終わったあとは依存性の解決を行う。きちんとパッケージ収集すれば不要なのと、root権限で実行しているのでwarningが非常に気になってしまうから、無くても良い気はしている。必要なもの分かっていればaptで指定して揃える方が良さそう。

# install rosdep
RUN apt-get update && apt-get install -y --no-install-recommends python3-rosdep

# resolve dependency
RUN rosdep update && rosdep install -y --from-paths $TMP_WS/src

依存性を解決し終えたらbuildを行う。 installフォルダだけをros2実行環境に引き継ぐために–install-baseオプションを使用する。

# build
RUN colcon build --install-base $PRJ_WS

build完了したので、次はros2実行環境のセットアップを行う。
ros2 build環境からinstallデータだけを引き継ぐ。

################################
# multi-stage for exec
################################
FROM ros:humble-ros-core-jammy as exec
#project workspace
ARG PRJ_WS=/workspace/install
WORKDIR $PRJ_WS
# import artifacts
COPY --from=build $PRJ_WS $PRJ_WS

その後依存性を解決させるためにrosdepを使用する。 package.xmlあったと思うので、多分有効なはず。(動作未確認)
ダメならソースも実行環境に引き継いでおけば良い。

# install rosdep
RUN apt-get update && apt-get install -y --no-install-recommends python3-rosdep

# resolve dependency
RUN rosdep init && rosdep update \
        && rosdep install -y --from-paths $PRJ_WS \
        && apt-get remove -y python3-rosdep \
        && apt-get -y clean \
        && rm -rf /var/lib/apt/lists/*

最後に実行時の環境セットアップを行う。 環境変数の設定と、実行時にintall/local_setup.shを呼び出すようにros_entrypoint.shを編集する。 実行時のコマンドはlaunchに差し替えても良い。

# source entrypoint setup
ENV PRJ_WS $PRJ_WS
RUN sed --in-place --expression \
    '$isource "$PRJ_WS/local_setup.sh"' \
    /ros_entrypoint.sh

CMD ["ros2", "run", "py_pubsub", "talker"]
#CMD ["bash"]

docker-compose

talkerとlistenerを別々のコンテナで起動させて通信させている。

version: '2'

services:
  talker:
    build: ./context
    image: py_pubsub:latest
    command: ros2 run py_pubsub talker
  listener:
    build: ./context
    image: py_pubsub:latest
    command: ros2 run py_pubsub listener

2022年1月1日土曜日

単精度浮動小数点での行列積の性能を評価してみた話

単精度浮動小数点での行列積の性能を評価する方法を調べた際のメモ。
ベンチマークにはHPL-AI使う方が良いかもしれない。

環境

PC:DELL Inspiron 16
CPU:11th Gen Intel® Core™ i7-11800H @ 2.30GHz × 16
GPU: NVIDIA GeForce RTX 3050 Laptop GPU/4GB/gen4?
Mem:16G
OS:Ubuntu 20.04LTS

評価方法

C=ABを計算する時間を計測する。 また、openblasによる計算結果との差がepsilon()以下であることも確認する。

リポジトリをクローンして、jupyter notebookをすべて実行すると結果が得られる。 gcc,cmake,make,openmp,openblas,cudaが必要。

結果

次のグラフの通り。
単純Cループと比較するとOpenBLASはやはりすごい。
行列サイズが大きくなってくるとcublasの効果が際立ってくる。


参考ページ

行列の積演算で openBLAS cuBLAS を体感する
cuBLAS と cuBLAS-XT の調査(その1)。行列の積演算にて
[VC++] OpenBLASを使ってみた