VITANのブログ

Techなことをメモしていきます

CUDA Visual Studio Integration(Windows)の環境下でホストコードでOpenMPを使いたい時の設定

VisualStudioでCUDAコードをビルドする時にホスト側のコードでOpenMPを使いたかった

結論

ソリューションエクスプローラー → プロパティ→CUDA/C++ → Command Line

の、追加のオプションの欄に以下を追加する

-Xcompiler -openmp 

Xcompilerでホスト側コンパイラへ直接オプションを渡すことが出来る

Visual Studioの場合、オプションはfopenmpではなくopenmpだった

(fopenmpだとオプションが見つかりませんでしたと言われる。openmpを指定するとエラーが出なくなり動いているが、これでいいという根拠が見つからないので何か知ってる人がいらっしゃったら教えてください)

f:id:vita_n:20211008105155p:plain

kubernetesのjobでsidecarのコンテナを終了させる方法

sidecar構成(1つのpodの中にメインのコンテナ+proxy等を担当するサブのコンテナを置く)をしている状態でjobやcronjobを走らせようとすると、メインのコンテナが終了してもサブのコンテナが終了しないとjobは完了扱いにならない

cronjobの場合、定期実行なので完了扱いにならないと次の実行で何かと困ったことが起きる

この解決法として、主に2つの解決法がある

  1. concurrencyPolicyをReplaceにする
  2. メインのコンテナからサブのコンテナにSIGTERMを送る

1.の方は、cronjobの設定で定期実行に前回の実行が終わってない時の挙動を設定できる。 これをReplaceにしておくと前回の実行が終了してるかどうかにかかわらず新しくjobを作り直すため、付け焼き刃的ではあるが一応解決はする。

ただ、1.の方法は正攻法ではないので、2.の方を検討する。

メインのコンテナでの処理が終わった時に、サブのコンテナのプロセスにSIGTERMを送ることで終了させる。 昔のkubernetesではpod内で名前空間を共有することができなかった(っぽい)が、今ではできるようになったのでこの方法が使える。

以下、実際の実装例を書く

構成

メインのコンテナ: python
サブのコンテナ: nginx

python

psutilを使ってサブコンテナのプロセスであるnginxのPIDを取得、SIGTERMを送る 実際に使うとしたらこのコードの前に目的の処理を書く、今回はnginxにSIGTERMを送るだけ

import psutil

for proc in psutil.process_iter():
    if  "nginx" in proc.name():
        print(proc.name())
        print(proc.pid)
        proc.terminate()

Dockerfile

特筆することは無いが、nginxの起動を待ってから動くようにsleepを入れた

FROM python:3
ARG project_dir=/project/
WORKDIR $project_dir

ADD . .
RUN pip install -r requirements.txt
CMD sleep 5 && python test.py

jobのyaml

shareProcessNamespace: true

を記述することで、pod内で名前空間が共有されるようになる

他は普通に書く

apiVersion: batch/v1
kind: Job
metadata:
  name: sleep
spec:
  completions: 1
  parallelism: 1
  template:
    spec:
      shareProcessNamespace: true
      containers:
      - name: sigterm-test-python
        image: sigterm-test-python:latest
        imagePullPolicy: Never
      - name: nginx
        image: nginx
      restartPolicy: Never

出力

起動直後

$kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
sleep-c9b8f   2/2     Running   0          6s

終了

&kubectl get pods
NAME          READY   STATUS      RESTARTS   AGE
sleep-c9b8f   0/2     Completed   0          29s
$kubectl get jobs
NAME    COMPLETIONS   DURATION   AGE
sleep   1/1           7s         13s

サブコンテナのnginxも終了されており、jobが完了していることが確認できる

参考

kubernetes.io

VitisでEmulation-SWをするとlibgmp.so.7: cannot open shared object file: No such file or directoryが発生する

 問題

VitisでEmulation-SWとしてビルドしたものを実行しようとすると以下のようなエラーが出る

$./hoge fuga.xclbin 
./hoge: error while loading shared libraries: libgmp.so.7: cannot open shared object file: No such file or directory

 解決策

GNU MPがデフォルトではインストールされてないのにもかかわらずVitisでは標準でLinkerに入っているのが原因
GNU MPをインストールする

The GNU MP Bignum Library

$./configure
$make
$make check
$sudo make install

しかしこれだと/usr/local/libにはlibgmp.soとlibgmp.so.10しか入らないため、libgmp.soへのシンボリックリンクをlibgmp.so.7として作る

$cd /usr/local/lib
$sudo ln -s libgmp.so libgmp.so.7

また、LD_LIBRARY_PATHを加える必要があるため、

$export LD_LIBRARY_PATH=/opt/xilinx/xrt/lib:/usr/local/lib

*2020/10/13 パスが間違っていたため修正

とする。/opt/xilinx/xrt/libの部分は/opt/xilinx/xrt/setup.shに書いてあるのと同じものを持ってくる。

その他

これを解決しても次は

./hoge: error while loading shared libraries: libmpfr.so.4: cannot open shared object file: No such file or directory

となるが、これは先程と全く同じでGNU MPFRをインストールしてシンボリックリンクを張れば良い

参考 qiita.com

qiita.com

PyTorchでFine-Tuningをするためにモデルをカスタムするときの注意

VGGシリーズのように構築済みのモデルをFine-Tuningするとき、出力サイズに合わせてFull-Connectionのパラメータだけ変えようとしてハマったのでメモ

VGG-NETS

pytorch.org

問題

例えばVGG19で、最終FCの出力を1000から10にするために

model = torch.hub.load('pytorch/vision:v0.6.0', 'vgg19', pretrained=True)
model.classifier[6].out_features = 10

このように指定するとmodelのprint結果自体は正しく10になっている

print(model)
>
...

(2): Dropout(p=0.5, inplace=False)
(3): Linear(in_features=4096, out_features=4096, bias=True)
(4): ReLU(inplace=True)
(5): Dropout(p=0.5, inplace=False)
(6): Linear(in_features=4096, out_features=10, bias=True)
...

しかしこれで実際にモデルに画像を入れてみると、出力が1000のまま変わってない

outputs = net(images)
print(outputs.size())

>torch.Size([64, 1000]) #バッチサイズ64

解決策

FCの出力をちゃんと10にするにはこうしなければいけない

model.classifier[6] = nn.Linear(4096, 10)
outputs = net(images)
print(outputs.size())

>torch.Size([64, 10]) #バッチサイズ64

参考

How to modify the final FC layer based on the torch.model - PyTorch Forums

Transfer Learning with PyTorch : Learn to Use Pretrained VGG16 Model 間違っている方の例

Vivado HLSのC/RTL Cosimulationが終わらない問題の解決法

Vivado HLSでC/RTL協調シミュレーションを行うときに、以下のようなWaringが出続けて永遠に終わらないことがある。

f:id:vita_n:20200709175248p:plain

 

シミュレーションの設定画面でsetup onlyにチェックを入れると、シミュレーションは実行されずにシミュレーションを実行するためのファイル群の用意だけが行われる。

これによってプロジェクトフォルダ内に ./sim/verilog/sim.bat というファイルが生成されるため、これをターミナルから直接実行すると正常に実行できる。

 

f:id:vita_n:20200709175416p:plain

 

 

 

参考:

https://forums.xilinx.com/t5/High-Level-Synthesis-HLS/C-RTL-Simulation-is-extremely-slow-if-it-is-working/m-p/786173/highlight/true#M9838

 

Raspberry Pi3を使ってADS-Bを受信、FlightRadar24にフィードする

前回はbump1090を使ってADS-Bを受信し表示させましたが、今回は更にそのデータをFlightRader24に送信してみます。前提として24時間の電源確保とインターネット接続が必要になります。 条件を満たしている場合、フィーダー特典としてビジネスアカウント($49.99/月)が提供されます。

 

 

以下を打ち込み、その後必要事項を記入するだけで簡単にフィードをすることができます。

sudo bash -c "$(wget -O - http://repo.feed.flightradar24.com/install_fr24_rpi.sh)"

 

インストールが終わると初期セットアップが始まります。

 

Enter your email address (username@domain.tld)

 

最初にメールアドレスを聞かれますアカウントを登録するときに必要となります。

次に、過去にキーを持っていたか聞かれるので、持っていない場合は空欄で次にすすみます。

 

 

Would you like to participate in MLAT calculations? 

MLATを使うかです。

どちらでもいいと思います。

 

 

 Enter antenna's latitude (DD.DDDD) 

 Enter antenna's longitude (DDD.DDDD)

アンテナの緯度経度、海抜高度をです。

緯度経度はGoogleMAP上で右クリックをして”この場所について”をクリックすると表示出来ます。 海抜高度は

Google Maps 標高 (SRTM版)

こちらのサイトで取得できます。

 

次に、

Would you like to continue using these settings?

と聞かれるのでyesを入力します。

 

 

 

Receiver selection

次に使用する受信機を聞かれるので答えます。私の使っているR820T2の場合

1 - DVBT Stick (USB) を選びます。

 

 

 

Enter your additional dump1090 arguments or leave empty

こちらは空白のままでOKです

 

 

Would you like to enable RAW data feed on port 30002 (yes/no)

Would you like to enable Basestation data feed on port 30003 (yes/no)

 

こちらの2つはどちらもnoにしておきます。

 

Please select desired logfile mode

ログファイルの設定です /var/log に置かれます。 お好みで選択してください。

 

 

以上で設定は終わりです。FlightRader24からメールが届きます。

以下、FR24のコマンドです

 

sudo service fr24feed start フィードをスタート
sudo service fr24feed stop フィードをストップ
sudo service fr24feed restart 再起動
sudo service fr24feed status 現在のステータス

Raspberry Pi3でADS-Bを受信する

 

 

前回はPCを使って受信しましたが、今回はRaspberry Pi3を使って受信していきます。

Raspberry Piの初期設定は終わっている前提で進めていきます。

 



必要なパッケージをインストール

sudo apt-get install git
sudo apt-get install cmake
sudo apt-get install libusb-1.0-0.dev
sudo apt-get install build-essential
sudo apt-get install pkg-config
 
 

rtl-sdrをGitHubから取得

git clone git://git.osmocom.org/rtl-sdr.git

 

 

rtl-sdrをビルド

cd rtl-sdr
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig
cd -
sudo cp rtl-sdr.rules /etc/udev/rules.d/
 

 

SDR受信機のテスト

sudo rtl_test

Found 1 device(s):○○ が表示されればOK
されない場合、以下を試す

sudo rmmod dvb_usb_rtl28xxu




dump1090をGitHubから取得

git clone git://github.com/MalcolmRobb/dump1090.git

 

dump1090をビルド

cd dump1090
make

 

dump1090を実行

./dump1090 --interactive --net



コンソールに受信したデータのリストが出ていれば成功です。

また、ブラウザでRaspberry PiIPアドレスの8080番ポートポートにアクセスして以下のような地図を見ることができます。

 

f:id:vita_n:20170214225405p:plain