ResearchatLTひとり反省会

今日はResearchatLT。前回からもう1年経ってしまった。年々時が過ぎるのが速くなっていく。 前回→2020/12/26 シンガポール渡航7日目 - おんぷの日記

今回のアーカイブはこちら: www.youtube.com

みなさんのどの発表も興味深かったですね。 感想としては、和音たのしいな勉強し直そ、ホットサンド作って食べたい、目ブラストはバイナリエディタで目grep的な異次元技能か、アケコンはソフトウェアエンジニアがキーボードを凝りたくなるのと一緒だな、などなどたくさんありました。 色んな話題がごちゃ混ぜになってるのがResearchatLTのいいところですね。

今回は発表側として参加させて頂いた。反省としては:

  1. LTなのでもうすこし自分がこうしたああした、といった経験や試行錯誤を踏まえた/交じえた内容を組んだ方がよい。
  2. 厳密な講義をするわけではないので、まずアイキャッチなコンテンツで興味を引いて、そのコンテンツの作り方や経緯を話すとよい。

の2点。内容がちょっと真面目すぎた。

来年も開催したくなったという言質をとれたので、期待すると同時に、もうちょっと鍛錬しよう。

右足首がいたい

右足首内側が痛いので整形外科に行ってきた(11/10)。 後脛骨筋腱炎だそう。 どうも足の外側につっぱる癖があるようで、内側の筋をよく使うかららしい。 インソールを変えたり靴を変えたりするといいよとのこと。 調べた感じでも特段治療法があるわけでもなく、なるべく使わないように器具をつけて日々矯正していく感じっぽい。 それでも治らなかったら手術。

後脛骨筋腱機能不全症の症状と治療方法|プライマリメディカルサポート|港区東麻布のフィジカルコンディショニング・トレーニング

保存的治療
* 発症初期では安静、消炎鎮痛薬。
* 固定終了後は一般的にヒールウェッジやアーチサポートと呼ばれる足底装具を使用します。
* 保存的治療が無効だった場合、手術が必要になります。
手術的治療
* 滑膜切除術、骨切術、腱移行術、関節固定術などが行われます。

つらい。

kernel module(nvidia driver)に署名してsecure bootで困らないようにする

目下windows10とubuntu20.04のデュアルブートのマシンを主に使用している。 windows 11にupgradeするのにsecure boot関係でコケたら嫌だなぁと思って、キチンとsecure bootを有効にした。 以下はメモ書き。

仕組み

ubuntuのsecure bootの対応・仕組みはこちらに詳しい。

ubuntuがbootするときには

  • shim(Microsoftにより署名済み)
  • grub
  • if 鍵の管理するように言われている
    • MokManager
  • else
    • OS起動

という感じで起動するらしい。MOK: Machine-Owner Keyとのこと。 普通はMicrosoftに署名されたものしかブート時に読みこめないが、MokManagerを起動してそこに自分で作ったMOKを登録してあげると、 kernel moduleを事前にそのMOKで署名しておくことで読み込めるようになる、という風に理解した。

手順

secure bootを有効にして起動したubuntu20.04でnvidia driverを入れると、 ncursesなUIでMOKをshimに登録するためのパスワードを要求してきて、そこで勝手にMOKを生成してくれる。 dkmsによりビルドされたnvidia driverもその生成されたMOKにより署名つきになる。 もしそのMOK生成を手動で行うには

Use the following command to enroll an existing key into shim:
$ sudo update-secureboot-policy --enroll-key
If no MOK exists, the script will exit with a message to that effect. If the key is already enrolled, the script will exit, doing nothing. If the key exists but it not shown to be enrolled, the user will be prompted for a password to use after reboot, so that the key can be enrolled.
One can generate a new MOK using the following command:
$ sudo update-secureboot-policy --new-key

のようなコマンドで鍵が生成される。 出力先は /var/lib/shim-signed/mok/MOK.priv (秘密鍵) と /var/lib/shim-signed/mok/MOK.der (証明書、公開鍵)。

この公開鍵をshimに登録するようOSからお願いする。 先程のパスワードを入力する。

$ sudo mokutil --import /var/lib/shim-signed/mok/MOK.der
input password: xxxxx
input password again: xxxxx

これで再起動すると

Perform MOK management

 Continue boot
  <Enroll MOK>
Enroll key from disk
Enroll hash from disk

という画面が現れるので、 を選択し

[Enroll MOK]
View Key 0
<Continue>

でView Key 0で証明書の内容を確認したら。 あとは先程のpasswordをいれて再起動する。 nvidia-smiがちゃんとdriverを認識して色々出力してくれればOK.

他のdkmsなモジュールを自動でsignしてくれるスクリプトも見つけたものの、なぜかすでに勝手に登録されている。要確認。 先のURL(Ubuntu 20.04 その74 - UbuntuとUEFIセキュアブート - kledgeb)によるとdkmsが勝手に署名してくれるらしい。便利だなぁ。

ちなみにsecurebootではhibernationやsuspendはサポートされてないらしい。この点は不便だな。 unix.stackexchange.com

pytorch/libtorchの推論の高速化テク

色々と試行錯誤した記憶が薄れてきているので、忘れないうちに書き留めておく。ここでのpytorch/libtorchのversionは1.8.1。 推論にはlibtorchを使うものとする。

1. TorchScriptを使わない

pytorchで書いたモデルをc++に持っていくには一旦TorchScriptに吐いてc++で読み込むのが一般的だと思われる。( 参考: Loading a TorchScript Model in C++ — PyTorch Tutorials 1.10.0+cu102 documentation ) しかし、これを行うと時々推論が遅くなるという問題に遭遇する。 具体的には普通20ms程度で推論できるはずが、なぜかたまに1secかかったりして困る。 そこでpytorchで書いたモデルをc++で書き直すと安定して速い。 もう少し頑張ってくれTorchScript。

2. tensorを作るときはまとめてから

以下のように小さいtensorをたくさん作って後でがっちゃんこする処理はめちゃくちゃ遅い。

std::vector<std::vector<float>> data;
std::vector<torch::Tensor> vtensor;
for(auto&& d : data) {
    vtensor.emplace_back(torch::from_blob(d.data(), {1, N}, torch::kFloat32));
}
auto batch = torch::vstack(vtensor);

そこで、以下のようにstd::vector<std::vector<float>>を一旦std::vector<float>に一列にして、一度にtorch::from_blobするとちゃんと速くなる。

std::vector<float> data;
torch::Tensor batch = torch::from_blob(d.data(), {B, N}, torch::kFloat32);

3. boolean indexingを使わない

boolean indexingというのは[True, False, False, True, True, ...]のような配列でindexを保持するやつ。 これを使って

x = torch.randn(3, 4)
mask = x.ge(0.5)
x[mask]  # とか
torch.masked_select(x, mask)  # とか

のように要素を抜き出すことはよく行われる処理である*1。 同じようにc++

x.index({"...", mask})

などとすると、この処理を何度も繰り返すような場合には遅くなる。なぜかというと以下の箇所で

github.com

boolean indexingから普通のindexingに変換されていて、その処理の中で、

github.com

毎回aten::emptyでtensorを作り直しているからである。 memory poolからあてがってくれているとは思うが、手元の処理ではこれがbottleneckとなったため、boolean indexingは一度普通のindexingに変換してから使い回すようにした。

以上。参考になれば幸いです。

胃カメラは日帰り手術

ここ3ヶ月くらい胃の調子がダメで食事がちゃんと摂れず、 さすがに胃がんとかだと困るので8/5に胃カメラで胃をみてもらった。 日本のようにカメラを入れて苦しむやつかと思ったら、こちらでは手術扱いらしく、麻酔をして診てもらうらしい。

8/2に一度診察を受け、H2ブロッカーがあんまり効かなくて…と相談すると、先生がそれはまずいのですぐ胃カメラしましょうとなり、どたばたと手術室の予約をした。

Covid19下なので前日に抗原検査を受け、当日胃を空っぽにして陰性の検査結果とともに再度病院に行くと、じゃあDay Surgeryという同じ建物の部署に行ってくださいと言われ、向かう。 そこで受付をすませると、貴重品入れに鞄を預けた後、ベッドに案内された。 ではここで服を全部脱いで手術着に着がえてくださいと言われ、使い捨ての下着を履いて手術着に着がえる(胃カメラなのに…?)。 ベッドでぼーっと待っていると麻酔の針を入れられ、またほどなく待っていると、看護師さんが担架ごと手術室に運んでくれた(胃カメラなのに…)。 男性の看護師さんが、じゃあこれからこの美人の同僚が運んでくれるからねーと声をかけてくれたので、クスクス笑ってthat's trueと言うとその二人の看護師も笑っていた。眼鏡を外してたのでよく見えていない。

手術室に入ると、ピカピカの機械が並び明るい天井照明のある部屋に、看護師さんや麻酔医さんがたくさんいらして、(胃カメラなのに…)と思いながら横向きになり、口にスコープを通すための穴のあいた器具を咥えたところで麻酔を打たれ、なにくそ麻酔なんぞに負けないぞ、と目を開けたまま粘ろうとするも、気がついたら元のベッドの場所に戻ってきていた。

ほどなく看護師さんが来られて、気分はどう?と言われるのでまだ眠いです、と言うと、じゃああと15分くらいしたらまた来るね、と言われた。 ぼーっと考え事をしているとまた看護師さんが来られ、もう大丈夫そうね、お茶かコーヒーか水どれがいい?と尋ねるので、じゃあお茶でと答えると、お茶と水とサンドイッチを運んできてくれた。 もしゃもしゃと食べる。 気分がよくなったところで看護師さんに連れられて診察室に戻り、検査結果の説明を受ける。表層性胃腸炎ですねーこの赤い筋のところがそうですーと仰るのでなるほどよかったとなった。いや、よくはないけど腫瘍よりはマシ。 そして受付で処方薬の受け渡しとお会計をしておしまい。 $1000。チン!

医療費がえぐい。