the Computational Network Toolkit by Microsoft Research(CNTK)のインストール

久しぶりにCNTKを触ってみたら、以前の記事とインストール手順が大分変わっていたのでメモ。以前は必要なランタイムのインストールは手動で行うしかありませんでしたが、インストールスクリプトで自動的に行ってくれるようになっています。

対象OSとなるWindowsは64bit版のみです。CUDAに対応していますが、CUDAに対応したGPGPUを搭載していなくても動作します。

CNTKを動かすにはCUDA7.0が必要になるので、NVIDIAのホームページからCUDA 7.0 (https://developer.nvidia.com/cuda-toolkit-70)をダウンロードしてインストールします。

CNTKのバイナリをhttps://github.com/Microsoft/CNTK/releasesからダウンロードします。GPU版とCPU版が用意されていますが、私が試したときにはGPU版しか置かれていませんでした。GPGPUが無い環境でもCUDA7.0をインストールしていれば、GPU版を動作させることができます。

ダウンロードしたバイナリをC:\local\cntkに展開します。

Powershellを管理者権限で起動して以下のコマンドを実行します。これによりAnaconda3のインストール他、必要な環境の設定をおこなってくれます。

cd c:\local\cntk\Scripts\install\windows
.\install.ps1 -execute

最初に何度かセキュリティ警告が表示されますが、全て「[R]一度だけ実行する」を選択してください。

途中で以下のように選択が表示されるので1を入力してください。

1 - I agree and want to continue
Q - Quit the installation process

最後に以下のように確認が表示されるのでyを入力してください。

Do you want to continue? (y/n)

以上でインストール完了します。

サンプルを実行するにはコマンドプロンプトを開いて、最初に以下のコマンドを実行します。

c:\local\cntk\scripts\cntkpy34.bat

 

Microsoft Flowの実行回数

無料の場合の実行回数は750回/月です。

右上の設定ボタンから残回数を確認できます。flow_jikkou_kaisuu

原則としてトリガーが起動される毎に1回としてカウントされます。

Microsoft Flowは無料版の場合15分毎(有料版の場合は1分毎)にトリガーの状態を確認し、トリガー条件を満たしていれば実行します。

トリガー条件を満たしていなければ、実行せずにスキップします。スキップした場合は実行回数にカウントしません。

ちょっと困ったことにエラーが発生してFailedとなったときにもカウントされます。

特にトリガーでエラーとなった場合が困りもので、15分毎なので1日で96回消費してしまいます。これ、無料版だから96回で済んでいますけど、有料版だと毎分トリガー条件をチェックするので、1日で1440回消費してしまうことになります。スクリプトを登録した場合は、実行結果に注意してみておくようにしましょう。

・・・というか、私自身もトリガーでエラーが発生したせいで、今現在は今月の実行数上限まで消費してしまってもう動かない(T_T)

1万PV/月を超えました

2008年からチマチマと更新してきましたが、漸く1万PV/月の大台を超えました。

面白いのは1/3はただ一件の記事(Windows10のディスクアクセス負荷が高い場合の対処)に集中していること。

それに引っ張られるように、その他の記事も検索などでの掲載順位が上がっているのか、一様にアクセスされるようになっている。

ある日突然アクセス数が増えたりすると見聞きはしていたけど、それってこういう記事が突然生まれるからなんだろうな。

無手順通信が好きな人っているよね

掲示板とか見ていると、無手順通信大好きで、無手順でシリアル通信して、データの欠落で困っている人をときどき見かける。開始終端符号やチェックサムすら付けず、ほんとに何もなしで通信してるのだからデータが欠落する場合があるのは当たり前だし、当たり前のことなんだから「仕様です」って受け入れればよいのにといつも思う。

言っておくがデータは欠落したり、エラーで壊れるものだ。エラーになってもリカバリの必要がないと判断したうえで、無手順を選択するのはわかる。あるいは下位のレイヤーでエラー訂正などの手順をサポートしているから上位のレイヤーが無手順なのはわかる。

でも下位の手順がエラー訂正などのプロトコルをサポートしていない状態で、上位レイヤーで無手順通信して、エラーが起きてて困るって「何を考えてるの?」としか言いようがない。

といっても、前任者が馬鹿で無手順通信で設計した上に、相手機器は更新不可で泣いているひともいるのかもしれない。愚痴ってばかりでもなんなので、現実的な解決方法を挙げておこう。

PCIバスに接続する通信ボードを使う

オンボードの232Cでも16バイトのFIFOバッファがあるのて大丈夫そうだが、Windowsって数十ms程度の処理遅れは珍しくないんだ。フロー制御もソフトウェア側でやることになるので、オンボードの16バイト程度だと簡単にオーバーランエラーが発生する。PCIバスに接続するタイプだと128バイト程度のFIFOバッファを備えているのが多いのでわりと大丈夫だ。
予算的に可能なら、フロー制御までボード側でやってくれるインテリジェント232Cボードとか使うともっと安心だけどね。

USB接続の232Cポートは避ける

「USBってエラーも発生しないし、高速だし良いかな」と思ってるなら幻想だからね。USBの欠点の一つがオーバーヘッドが大きいことです。
USB2.0ではバスを複数のデバイスで時分割多重化によって共有します。ひとつのデバイスが125μsの間バスを占有したら、次のデバイスが再び125μsの間バスを占有します。こんな感じで動作するので負荷の状態によっては、数十ms程度の遅延が発生する場合があります。負荷が高いときにUSB接続のマウスが動きにくくなることを経験した事がありますよね。
そのためENQ-ACKを定周期で送受信するような通信プロトコルや、相手デバイスのバッファサイズが小さく制御線の状態を頻繁に読み取ったり、制御線の状態を細かく制御するような場合に、タイミングが安定せずに障害の要因になることがあります。

シリアルポートの仕様確認

オンボードのシリアルポートはチップセットの仕様上制御線が無い事もある。その場合CS/RSやDTR/DSRを使ったフロー制御は出来ない。「オンボードでシリアルあるから大丈夫だよね。」などと安易に判断して、後から制御線が繋がってない事に気がついても、ソフトウェアではどうにも出来ない。最初にきっちり仕様を確認するのが重要。

Microsoft FlowにあるGoogleスプレッドシートのUpdate Row/Get Rowの使い方

Microsoft FlowをGoogle スプレッドシートと連携しようとしたけどRow idの指定などが全く分からなかったので覚え書き。

GoogleスプレッドシートのUpdate row/Get rowの組み合わせはFlowスクリプトを組む上で強力なツールになります。と言うのもFlow自体には正規表現置換や演算機能がありません。Googleスプレッドシートの数式と組み合わせて使うことで、スプレッドシートの関数群による、正規表現置換や文字列編集、演算式を使って結果を取得する事ができるからです。

まず最初にGoogle Drive上でスプレッドシートを新規に作成します。先頭の1行目はデータを識別するためのカラム名として使われます。適当な名前を設定して下さい。flow_spread_sheet_1

新しいステップから「Googleスプレッドシート Update Row」を選択して追加します。flow_update_row_1

Fileの項目は右側のフォルダアイコンをクリックするとGoogle Driveのフォルダ構成が表示されます。フォルダをたどりながら先に作成したスプレッドシートを選択して下さい。Fileを選択後にWorksheetを選ぶとシート名の一覧がドロップダウンするので、対象となるワークシートを選びます。flow_update_row_2

シートを選択すると先ほどスプレッドシートを作成したときに1行目に入力したカラム名が表示されます。
分かりにくいのが「Row id」です。行を特定するための任意の文字列を指定します。ここでは取り急ぎ「_DATA_1_」としましょう。

ここで最初に作成したスプレッドシートに戻ります。するとセルD1に「__PowerAppsId__」と言う項目が追加されています。「Update Row」ステップは「__PowerAppsId__」カラムが「Row id」に指定した文字列と一致する行に対して更新します。ここではセルD2を「_DATA_1_」としておきます。flow_spread_sheet_2

この状態でFlowを動作させると、スプレッドシートの2行目に、「Update Row」ステップの「カラム1~3」に指定した値が入力されます。

ここまで来ると「Get row」で何を指定すれば良いかなんとなく分かりますね。次のように指定するとSampleスプレッドシートの2行目の内容が読み込まれます。カラムに計算式が入力されていた場合、「Get row」は計算結果を取得します。これを利用してFlow単独では出来ない演算機能を実装することができます。flow_get_row

もし3行目の内容が読み込みたければ、スプレッドシートのセルD3に「_DATA_2_」といった文字列を入力しておいて、「Get row」ステップの「Row id」に「_DATA_2_」と指定すれば良いです。