ehnmsのブログ

ボケ防止

NC6 とかのGPUが使えるインスタンスが作れないよ on Azure

In Short

NC6のインスタンスの話ではあるが、fastaiでの学習用にインスタンスを作れないか試す内容の記事。 結論から言うと、Spot Instanceでなく、尚且つサポートされている地域(Central South USなど)であれば作れる。 ただしお金が高めなので自動シャットダウン機能を使うなどでコスト管理に注意する。

なぜGPU VMがほしかったか

先日からの続きでGPUが使える自由な環境をDeep Learning環境に欲しかった。 Paperspaceの無料枠だとすぐに負荷オーバーになってInstanceが使えなかったりするので せっかくなら専用のものをよく知ってるサービスで使えたが方がいいかなと思った。

こまったこと

例の fastai を利用した学習用サイトに、Azureセットアップ用のスクリプトが置いてあるわけです。 Direct link here

こいつをCloud Consoleから実行することで、Resource Groupの作成からVMの作成から実行環境の準備までやってくれるという話。 だったのだが、実際には実施してみるとエラーが...。

ehnms@Azure:~$ bash fastai2onAzureSpotDSVM.sh
Azure VM Name (default: fastai2):
Choose your Password:
Re-enter Password:
Azure VM Zone (default: westus2):

...

Creating Azure Data Science VM fastai2...
Azure Error: InvalidTemplateDeployment
Message: The template deployment failed with error: 'The resource with id: '/subscriptions/xxxxxxx/resourceGroups/fastai2/providers/Microsoft.Compute/virtualMachines/fastai2' failed validation with message: 'The requested size for resource '/subscriptions/xxxxxxx/resourceGroups/fastai2/providers/Microsoft.Compute/virtualMachines/fastai2' is currently not available in location 'westus2' zones '' for subscription 'xxxxxxx'. Please try another size or deploy to a different location or zones. See https://aka.ms/azureskunotavailable for details.'.'.
(ResourceNotFound) The Resource 'Microsoft.Compute/virtualMachines/fastai2' under resource group 'fastai2' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix

...

westus2 で "Standard_NC6" というタイプのVMを設定しようとしているのですが、エラーで終了します。 エラー内容は「サブスクリプションかあるいは地域の関係などでそのタイプのVMは作れないよ」というもの。 この理由を探す旅に出ました。

はじめにRegionがあった

もちろん、地域によってサービスが提供されていないことがあります。 さっきのスクリプトではデフォルトで westus2 という地域にされています。 このサイト から製品がどの地域で使えるのか見ることができます。 そこで今回使おうとしている "NC" というシリーズのVMを見てみる。 そうすると、上記の westus2 では利用できるらしい。

NCシリーズの利用可能性

ということは別の可能性らしいですね。 ちなみにJapanはダメみたい。 v2 とか v3 はより高性能なのでお金がちょっと高めにかかります。 "as" がついているのはARMらしく、無用なトラブルは避けたいのでIntelじゃないCPUは今回無視していました。 ARMでもOKという人は、これが一番お安いです。

次にQuota

Quotaによる制限があるらしい。つまり、Instanceとして生成する場合、「このシリーズのVMはCPU何個まで」といった制限があるらしい。 実際に調べてみると、NCが出始めの頃にはNC シリーズのvCPU Quotaが0 に設定されていたり(つまりQuotaを変更しないとVMが作れない)したらしいが、 現在の自分の値を見てみると、そのような制限はない。

NCシリーズのQuota
「リソースグループ」から「使用料とクオータ」を見て、適当にFiliterを変更することで得られる画面。色々ググっていた関係で英語になっている

Japanでは利用できないが、一応Quotaの設定自体はされているようだ。

ここで、 "East US2" と "West US2" がなんとなくグレーアウト気味になっていることに気づく。これを見てみると

グレーアウトしている地域では使えないらしい。これは理由が不明だが、一説によるとCOVID-19による負荷対策の一環らしい。情報源が1年前なので本当にそうかはよくわからない。 とりあえず、何かしらCustomer Supportに連絡すれば対応はしてもらえるものらしい。

How do I create a virtual machine on azure when there are no sizes available for my subscription/location - Stack Overflow

When Creating VM in Azure 'Select Size' is Greyed Out - Stack Overflow

しかし、それをするのは面倒なので先程の利用可能性の表と今回のQuotaの設定値を見比べて、両方がOKそうな場所を探す。"South Central US" とか良さそう。 こいつのコマンドラインでの名称は southcentralus なので、最初に実行していたスクリプトでRegionを聞かれる際にその文字列を入れてみる。

が、うまく動作しない。

どうやら原因は Spot Instance らしい

コマンドラインは不慣れでわからなかったため、WebからPortal上でVMを色々条件変更しながら作成してみたところ、 Spot Instanceのチェックを外せばどうやら "South Central US" で NC6 のインスタンスが作成できるらしい。 実際、最初のスクリプトの中でも Spot Instanceとしての設定オプションがいくつか付いている。

初めに掲載しているエラーメッセージの SKU Not availableというところをよく読めばよかったらしい。 そもそも、Spot Instanceがどういう仕組みのものか知らなかったのが敗因か。

I cant create a VM on azure using spot instance - Server Fault

この方法で作ると確かに作成可能だが:

  • スクリプトでお膳立てしていた部分を結局自分でやる必要がある
    • Port を開くところとか、NVIDIA GPUドライバ入れるところとか?
    • 中に入ってスクリプト叩いて環境準備するところとか
  • お値段が高め (120円/hour !!!!)

そもそも、最初のスクリプトってちゃんと動作するんだろうか?Diskとかネットワークとか指定していない物が多すぎるきがするんだけど、その辺は勝手に作ってくれるんだろうか。

実際の設定メモ

  • NC6 を Central South US のRegionで作成。このとき SSH認証に変えているので、最初のスクリプトはそのままでは使えなくなった。
  • Diskも適当に作成してくっつける
  • NVIDIA Derive のExtensionをつける
  • 作成を実施、しばらくかかって起動する
  • 最初のスクリプトに書いてあった 8000 ポートOpenコマンドを実施
  • その後のExtensionコマンドを実施すると、なんだかエラーする。諦めて乗り込むことにする。
  • 中に入って apt しようとすると別で使用中だと言われる。 ps で調べると cuda をインストールしている最中だったので、Extensionのコマンドが走っているのかもしれない。しばらく待ち。
  • しばらくすると apt の排他が取れるので、最初のスクリプトリポジトリにあった installfastai2.sh を手動で実施する。 fastuser は存在しないのでヒアドキュメントの部分も全部 azureuser で実施することになる。
  • その前に、 conda がないので Anaconda を普通にインストールする。
  • インストールスクリプトと同様の内容を実施。自分は怖いので手打ちで実施。
    • 最初に mkdir notebooks というコマンドが必要。スクリプとにはなかった。
  • 準備ができたら jupyter notebook --ip=* --port=8000 --no-browser でJupyter起動。
  • 速度は体感的にpaperspaceの無料インスタンスとどっこいどっこいくらい。

NB: Anacondaは有償ライセンスに敏感になったので、会社で使う際には注意する。

ちなみに、自動シャットダウンも設定がよくわからないのだが、Resoruce Providerというものでなんか設定するらしい。 ここのコメントで怒ってる人がいる。

Cannot press "Save" button in auto shutdown – Customer Feedback for ACE Community Tooling

自分はResource Provider設定されてるけどダメでした。謎。

まとめ

こういう寄り道ばっかりしているので、本筋の勉強が疎かになるんですよ。

Aure Bing Search API (2021/05/07)

In Short

fastai で学習時にBing Search API の設定方法がわからなかったので書きました。

手順

fastaiからForumいくと、色々記載があるがすでに既にやり方が変わってしまっている。 以下のページに書いてある内容が最新版。

docs.microsoft.com

  • Azureアカウントを設定する、無料サブスクリプションでOK(無料だけどクレカが必要)
  • Marketplaceに行く (ここが曲者で、全てのサービスからではたどり着けない。Global検索バーにMarketplaceと打てばMarketplaceが出てくる)
  • Bing Searchを v7検索 → 選ぶ
  • 作成を選んで適当にデータを入れていく
  • 作成を押下
  • しばらくするとデプロイ完了のポップアップが出るのでリソースに移動
  • 左サイドバー「リソース管理」→「キーとエンドポイント」
  • key 1 をコピーする

Fast AIでお勉強した話

In short

Fast AIというサイト(下記)で勉強してみた内容の報告。 Jetsonでの環境構築はやめた方がいいよと言いたかっただけかも。

Practical Deep Learning for Coders

Deep Learningにどこからとっつけばいいかわからない、という人にうってつけかと思います。 (惜しむらくは英語であること...)

日記

なんで今更Deep Learning

  • Deep Learningを始めたかった (仕事で話が出たときに知っていたいなぁ)
  • なぜブログ記事にするか → Fast AI のテキストにそうしろと書いてあったから
    • ブログにしてまとめること、他人に情報を教えることを通して頭を整理できるから
    • 誰も読んでないと思うけど。。。

どう学ぶのか

  • fast.ai という無料で見れる動画(Youtube)とテキスト(Github)のサイトがあるのでそこで学習
  • オライリーの教科書を買うのが推奨(労力かけて書いてるしね)だが、買わないでもOK
  • 教科書の内容は Jupyter Notebook形式でGithubにあげられている
  • 教科書をベースに動画で講義をする形式、大学時代を思い出す
  • 教科書を先に読んで動画を見ると理解が非常に早い、大学時代を思い出す
  • 動画には日本語の字幕も出せるので、内容理解には困らない(はず)
  • 英語字幕で勉強すると英語の勉強にもなる(はず)

どんな感じだったのか

  • fastai という独自のフレームワークを使う、軽く使った感じ使いやすそう
    • GPUを利用した環境がうまいことPaaSで用意されているので、それを使う。基本無料。速度を出そうとすると別途いいインスタンスを使うための金はかかる。
    • Paperspace GradientというPaaSだと、Jupyter NotebookのUIをそのまま扱えるのでお勧め。ただ、初見だとJupyter Notebookに辿りつけなかった。
      • GPU搭載のInstanceを選ぶことを忘れずに。これも無料。。。どういうカラクリなんだ。
      • Instance起動後、サイドバーにJupyterのアイコンが出るので、そこからJupyter Notebookに行ける
      • Jupyterに行く前の画面でも、教科書として読む分には差し支えない。多少崩れているけど。
    • 自力で環境構築しても構わないが、結構めんどくさいしつまづきやすい。Jetson Nano 2GBで頑張ろうとしたがARMアーキであることなどからインストールが難航したので教科書でお勧めされている通り大人しくPaaSを利用することにした。(FYI: 最終的に spaCy という自然言語処理フレームワークの依存ライブラリの thinc が入れられず諦めた)
    • Jupyter上で簡単に学習内容などを確認できるのでとっつきやすい。
    • ここからPyTorchなどの所謂一般で広く使われているフレームワークへ簡単に移住できるのかは気になった。教科書によると数日学べば他のFrameworkに移行するのは容易いとのこと。
  • Jupyter Notebook上でコマンドを叩いて体験しながら覚えていくスタイルなので、とっつきやすい
  • 最初の2章で、とりあえず fastai を使ってアプリケーションを作成する方法(学習したモデルをexportしてアプリケーションサーバに持っていく方法)まで学べる。
  • 各章の最後に問題がくっついているので、そこをみてから勉強すると重要なポイントがわかりやすいらしい。
  • 何か「やりたいこと」を持った上で望むとChapter 2のアプリ作成部分で気持ちが違ってくるかもしれない。
  • 英語の教科書のご他聞に漏れず、書いてある文字の量が非常に多いので読むのはなかなか大変。でも言葉足らずより10億倍マシ
  • 動画講義はChapterと対応はしていない。
    • 動画講義は教科書の内容に沿っているのが大部分だが、文字には起こされていない話がいくらかある。
    • 教科書の切りはりのパワポが多いのでその辺は眠くなる。
    • ところでこの動画講義はなんなんだろう、サンフランシスコ大学の授業?

まとめ

勉強した内容というより、メタな話ばっかりになってしまった。

本当は学んだ内容を書くつもりでござんした。まぁ2章までだとまだ体系だった学習はしてないので多めにみてください。

しばらく本を読んでいない

最後に真面目に本を読んだのがいつなのか、すぐには思い出せない。

中学生の時代には学校で朝の読書を習慣づけろ、と強制されていたのでいくらか本を読んだことを覚えている。この時代には小難しい本は読めなかったが、当時から知識的にカッコつけることを重んじていたので明治時代のいわゆる純文学とか言われるものや時代小説などを読んでいた。時代小説については、もともと三国志のゲームだとか戦国時代のゲームだとかが流行っていたので興味がなかったわけではなかったが、明治時代の小説は完全にカッコつけであった。夏目漱石の文章は現代的な文章でわりかし読みやすく、内容もすんなりと入ってきたのでよく覚えている。他の文豪たちについては、申し訳ないが頭の中から完全に削除されてしまっている。

高校時代に入ると、カッコつけがランクアップする。つまり、哲学書などの類を読もうとするステージに入った。この年代の悪い癖は、まだ失敗から学ぶことになれていないため、いきなり原本を読もうとするなどの無謀な行為をするところだ。私も他聞に漏れずにカントとかデカルトとかの本を読もうとしては時間を無駄にしていた。哲学に興味がなかったわけではなかったが、今思うとそれらの本に本来的な興味はなかったのではないかと思われる。結局読破していないので内容は知らないが、カントのWikipediaを読む限りは人間の認知に関わる話など心理学的な話にかなり踏み込んでいるようで、現段階での自分としてもそこにはあまり興味がないし。ちなみにこれらの本は現在父親の蔵書として保管されている。

大学に入り、苦手にも関わらず理系に進んで四苦八苦していく中でようやく勉強の仕方というものを理解する。この頃はもうあまり「本」を読まなくなっていた。読むとしても、勉強のための参考書や、興味のある分野の専門書などでカッコつけからは遠ざかっていった。遠ざかると同時に読書とも疎遠になったのかもしれない。そこからは活字を相手にするのは勉強するときだけになったように思う。この頃、自分の蔵書には漫画が増えていった。自分に素直になったという捉え方をしている。

社会に出て、仕事をしているうちに悩み始める。悩みの解決を探るために、また本を探そうとするようになった。自由に自分を貫いて生きるために参考にできそうなものがないかなど探してみた。そこそこの本を借りたり買ったりしたが、最後まで読破したものは恐らく一冊も存在しない。本を読むこと自体は目的ではなく、手段になったからではないかと思う。大体の本は役に立ちそうになかった。

振り返ってみると、真面目に本を読んだのは高校時代が最後なのかもしれない。ちなみに、漫画を含めていいのなら自分が最後に読んだ本はチェーンソーマン9巻である。

(何これ)

料理下手と自由闊達な開発

料理が下手な人は実在する。私です。

料理が下手な理由は諸説ありますが、割と有力なのが「独自アレンジ」によるものです。例えば、弱火で15分煮込むような作業を強火でやれば時短になると言い張ったり、調味料の持ち合わせがないから代わりになると思って全く関係のない調味料を入れたり、こうしたらおいしくなるんでしょ知ってるよ!と言わんばかりに関係のない食材を入れたりすることを「独自アレンジ」と言います。

これはその調理の工程や調味料あるいは食材の存在意義を独自に解釈したところ、全く違う解釈をしてしまっていることが原因なのでしょう。要するに背景を理解しないで早合点しているということなんでしょうね。

(ここで料理の話は終わりで、あとは愚痴なので読まないでいいです)

 

ところで、ソフトウェア開発において工程というものと成果物というものがあります。もうわかると思いますが、この工程というものの独自解釈をしやがるやつらが残念ながら存在するということを書きます。

ソフトウェア開発で親の仇のようにたたかれ続ける方式としてウォーターフォール開発というものがあります。ウォーターフォール(=滝)のように、上から順に作業をしていって最下流にたどり着いたときに製品が出来上がっているという、いわばベルトコンベアのような方式です。これは時代遅れで前時代的ではあるのですが、とても分かりやすく管理方法もほかに比べれば単純なので今でも現役の手法です。例えば、関わる製品に急な要件変更がない時や(今風に言うとプロダクトアウト)、ハードウェアと密接にかかわるソフトウェア(まぁこれもプロダクトアウトですけど)を開発する際にはよく使われます。

ウォーターフォールのように、と言ってもそんなにうまいこと上から下に流れるように行くはずはありません。人間だれしも間違いがあるので、基本的には細かく行ったり来たり、上に戻ったり下に行ったり、を繰り返して調整をしながら徐々に下っていくイメージです。

そんな細かい行ったり来たりを繰り返しながらも、一度下って次に進んでもいいよ、というための承認プロセスというものがあります。いわば検問です。この検問で一定の出来栄えになっていないと上司とかが通せんぼしてきます。一定の基準を満たしていないと通すわけにはいかねぇぜ!ということなんです。

「でも、結局行ったり来たりするなら意味なくないですか?」とお思いの方もいらっしゃるでしょう。そういう気持ちもわかるのですが、それでも要所要所で一度チェックをすることは大事です。一度行って、戻ったときにすべてを覆すような修正(例えばゲーム作ってたけどやっぱり表計算ソフトにしますみたいなレベル)が入った日にはすべてやり直しですが、入る修正というのは大抵の場合において全体の構造を大きく変えるものではないです。「なんかここの計算式間違ってね?」とか、「ここのデータ逆じゃね?」とか、「ここ使い方分かりづらいからこの方法にしね?」とかそんなものです。仮に大きく変わったとしても次のチェックポイントがあるので、そこで何かしらのチェックが入ります。

ですが、この検問を無視するヤカラが居ます。ウォーターフォール方式と同じ工程を採用して予定も立てているくせに、検問がないのです。これはウォーターフォール方式ではなく、ただ単に流れる水です。そのままのウォーターフォールです。自由落下です。なすがままです。

これだと何が問題かというと、先ほど言った要所要所のチェックがないので、すべてのチェックが最後の最後に行われることになります。そうすると、途中でチェックしておけば発見できたようなものが最後まで残って尾を引いていたり(例えば最後の最後にゲームじゃなくて表計算ソフトになっていたとか)、途中でチェックがないせいでその後の作業に混乱をもたらしたり(例えば何も必要なことが書いていないものを説明書といいはるとか)、ハプニングがいっぱい起きることになります。

そんなドキドキな思い出がいっぱい詰まった開発方式を玉手箱方式と言います。箱を開けてみると、時間がものすごく経つ上に疲労が溜まってしまいます。今名付けてみました。うまい。

 

「いやいや、話だけ聞いてると途中のチェックを飛ばさなきゃいいだけじゃん。」と思うかもしれませんが、途中のチェックが「面倒くさい」「大変だ」「開発に関係のない作業(!?)が増える」ということをいう人がいるので飛ばされてしまうんです。この場合、チェックを飛ばす人の方が正しいことになります。チェックをしないとだめよ、と発言する人は急進派であり理想論者です。「そんなものしたって問題は出るし、チェックの時間もかかっちまうんだぜ、へへっ甘ちゃんにはわからんだろうな!」と現実をわかっているクールな彼らには理想を掲げた世間知らずの意見など通りません。

いや、別にそこまで言われはしないですけど、なぜか拒否されるんですよね。

 

なんででしょうね。好きなのかな、残業。

私も残業代は好きです。

Rake

Rake

 

rake

f:id:ehnms:20200907205800p:plain

熊手...?

 

rake

f:id:ehnms:20200907205850p:plain

君があの...?

 

 rake meaning

f:id:ehnms:20200907210348p:plain

君だ!!!

 

Guitar Rake Technique

rakeとは、パーカッション的な音を少し足すことである。目的の音の前に数個のミュート音を足すことでちょっといい感じになる。

目的の音の前っていうか、どこでもやれる奴だと思ってたんですけど違うんですかね?↓こんなかんじの。

 

 

CmakeのCtestでWinの環境変数に複数の値を設定したい

結論から言うと、バックスラッシュ三個です。 言われてみれば普通の話。

変数に1つの値を設定する時(普通バージョン)

Cmakeを利用したプロジェクトでユニットテスト ctest を利用しているとします。該当するテストで、例えば example.cpp を利用したテストで環境変数を利用したいとき CMakeLists.txt に次のような記載をします。

add_executable(test_test example)
add_test(NAME example COMMAND test_test)
set_property(TEST example
             PROPERTY ENVIRONMENT MY_CONFIG_DIR=/usr/local/)

環境変数に一個だけ値を入れたいのであればこれでOK

変数に複数の値を設定する時(Linux)

けど、例えば PATH みたいな感じで環境変数複数の値を入れてやりたいときがあります。Linuxなら単純に、

set_property(TEST example
             PROPERTY ENVIRONMENT MY_CONFIG_DIR=/usr/local/:/mnt/share/nantoka)

ってやれば、あとはプログラム内部でデリミタを : として解析してあげればいいんです。普通ですね。

変数に複数の値を設定する時(Windows)

問題はWindowsWindowsだとドライブ文字の後の区切り文字が : であるため、環境変数の区切り文字が ; (semicolon)になっているのですよね。単純にやると以下のようになりそうじゃないですか。

set_property(TEST example
             PROPERTY ENVIRONMENT MY_CONFIG_DIR=C:/work;D:/docs)

これダメなんですよ。なぜかセミコロンで終了扱いにされているらしく、 getenv() とかで環境変数を見てみてもセミコロンの前までしか入っていないんです。この例だと C:/work までしか入ってない。 セミコロンがダメならバックスラッシュでエスケープしてあげれば行けるだろう!と思ってやってみても、意味がなく、同じ結果になります。

バックスラッシュ三個です

実はバックスラッシュを三個入れてあげるとうまく動作します。つまり以下の通りです。

set_property(TEST example
             PROPERTY ENVIRONMENT MY_CONFIG_DIR=C:/work\\\;D:/docs)

StackOverflowに解説がありました。

stackoverflow.com

Cmake的にはこの設定値を一回解釈し(ここでエスケープが外れる)、そのあと再度解釈するので、2回解釈します。つまり2回分エスケープしていないとダメなんですね。焦ってるとあんまり考えが及ばないので思いつかなかったけど言われてみると単純な理由だったけど、それどっかドキュメントに書いてほしかった。書いてあったらごめんなさい。

いじょうです。

ついに何のブログなのか意味不明になってきた。