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_」と指定すれば良いです。

Microsoft Flowの基本文法

Microsoft Flowのプログラム制御に使われるステップです。スクリプト言語として考えると命令の種類が非常に少ないですが、必要十分な機能を厳選して実装しており、大抵のロジックは組むことができます。演算や文字列を扱う命令は提供されていませんが、その辺りは外部のサービスを呼び出す前提で設計されているの感じです。

1.変数

数値型の変数はありません。文字列型の変数として作成ステップが用意されています。

1.1.作成(Compose string variables)

flow_create_step作成ステップはMicrosoft Flowにおける唯一の変数ですが、文字列しか格納できません。例えば同じ内容を複数のSNSに書き込むような処理において、それぞれのSNSのステップにおいて文字列の結合処理を行うのはあまりにも冗長です。これを避けるために整形済みの文字列を一時的に格納するテンポラリとして実装されています。単純な文字列の結合処理を行うだけで、書式指定などの機能も持ち合わせていません。

2.数値演算命令

ありません。数値演算が必要な場合には外部のサービスを利用する事になります。

3.論理演算命令

ありません。
条件ステップの組み合わせによって論理処理を行う事になります。
それ以上の複雑な論理演算が必要であれば、外部のサービスを利用することになります。

4.流れ制御命令

流れ制御命令は以下の5つがあります。必要最低限の命令しか用意されていませんが、基本的なスクリプトを作成するには十分な命令が用意されています。

4.1.条件(Nested conditionals)

flow_nasted_step言わずとしれた条件分岐です。

4.2.それぞれへの適用(Apply to each)

flow_apply_step配列の要素を列挙して、それぞれの要素に対して処理を記述できます。

4.3.Do Until(これだけ日本語に訳されていない)

flow_until_step脱出条件付きのループです。

4.4.配列のフィルター処理(Filter arrays)

flow_filter_step「それぞれへの適用」と「条件」を組み合わせても実装できますが、負荷を考えると処理の最初の方で「配列のフィルター」で件数を絞った方が良いでしょう。

4.5.終了(Abort)

flow_abort_step異常終了として処理を中断できます。

Windowsのファイル共有でEvryoneからのアクセスを許可する

ファイル共有をかけるとき、Everyone(誰でもアクセス可能)にするには、以下の4ヶ所の設定が必要です。

ファイルのアクセス権設定でEvryoneを許可する

フォルダのプロパティを開きセキュリティタブにある編集ボタンを押して、アクセス許可の画面を開く。アクセス許可の画面で追加ボタンを押して、Everyoneアカウントにフルコントロール権限を与える。

ファイル共有のアクセス件設定でEvryoneを許可する

フォルダのプロパティを開き、共有タブにある詳細な共有ボタンを押して、詳細な共有の画面を開く。「このフォルダを共有する」をチェックして、アクセス許可ボタンを押し、Everyoneアカウントにフルコントロールの権限を与える

Guestアカウントを有効にする

Guestアカウントは初期状態では無効にされている。「コンピューターの管理」を開き「システムツール→ローカルユーザーとグループ→ユーザー」にあるGuestアカウントのプロパティを開き「アカウントを無効にする」のチェックを外す。

セキュリティポリシーでGuestsの接続を許可する

「ローカルセキュリティポリシー」を開き「ローカルポリシー→ユーザー権利の割当」の「ネットワーク経由のアクセスを拒否」にGuestアカウントが登録されている。アクセス権設定は「拒否」の設定が優先される。このままだとGuestアカウントでのネットワーク接続に失敗するので、Guestアカウントを拒否リストから削除しておく。

Windows 7やWindows 10はサーバー用途で使うことを異図していません。20セッションを超えると接続エラーとなるので注意しましょう。

複数のゲートウェイが登録されてインターネットに接続出来ない

ゲートウェイの設定を変えたところ、ネットワークに繋がらなくなった。しばらく原因が分からず、再起動を繰り返しながら悩んでいた。

ふとipconfigを実行してみると、デフォルトゲートウェイが0.0.0.0と192.168.xxx.xxxの2つ登録されている。

実際に行う機械は殆ど無いが、アダプターの設定の変更からインターネットバージョン4のプロパティを開き、詳細設定のボタンを開くと複数のデフォルトゲートウェイの設定をすることが出来る。しかしながら、実際にひらいてみると192.168.xxx.xxx一つだけがデフォルトゲートウェアに登録されていて、0.0.0.0は見当たらない。

route delete 0.0.0.0 /p


上のようなコマンドを実行したところ、無事に複数のデフォルトゲートウェイが削除できた。あらためてアダプターの設定の変更からインターネットバージョン4のプロパティを開きデフォルトゲートウェイを開くと正常に動作するようになった。

Windows UpdateでKB3139398の適用に繰り返し失敗する

Windows UpdateのログはC:\Windows\Logs\CBS\CBS.LOGに保存されているのでErrorとなっている場所を検索してみます。

2016-11-08 03:10:52, Info CBS Perf: Doqe: Install started.
2016-11-08 03:10:52, Info CBS Doqe: [Forward] Installing driver updates, Count 5
2016-11-08 03:10:52, Info CBS INSTALL index: 0, phase: 1, result 0, inf: usb.inf
2016-11-08 03:10:52, Info CBS INSTALL index: 1, phase: 1, result 0, inf: usbport.inf
2016-11-08 03:10:52, Info CBS INSTALL index: 2, phase: 1, result 0, inf: tpm.inf
2016-11-08 03:10:52, Info CBS INSTALL index: 3, phase: 1, result 0, inf: disk.inf
2016-11-08 03:10:52, Info CBS INSTALL index: 4, phase: 1, result 5, inf: usbstor.inf
2016-11-08 03:10:52, Info CBS Progress: UI message updated. Operation type: Update. Stage: 1 out of 1. Percent progress: 9.
2016-11-08 03:10:52, Info CBS DriverUpdateInstallUpdates failed [HRESULT = 0x80070005 - E_ACCESSDENIED]
2016-11-08 03:10:52, Error CBS Doqe: Failed installing driver updates [HRESULT = 0x80070005 - E_ACCESSDENIED]
2016-11-08 03:10:52, Info CBS Perf: Doqe: Install ended.
2016-11-08 03:10:52, Info CBS Failed installing driver updates [HRESULT = 0x80070005 - E_ACCESSDENIED]
2016-11-08 03:10:52, Error CBS Shtd: Failed while processing non-critical driver operations queue. [HRESULT = 0x80070005 - E_ACCESSDENIED]
<<中略>>
2016-11-08 03:12:31, Info CSI 0000000b Creating NT transaction (seq 1), objectname [6]"(null)"
2016-11-08 03:12:31, Info CSI 0000000c Created NT transaction (seq 1) result 0x00000000, handle @0x414
2016-11-08 03:12:32, Info CSI 0000000d@2016/11/7:18:12:32.241 CSI perf trace:
CSIPERF:TXCOMMIT;1222683
2016-11-08 03:12:32, Error CBS Doqe: Marked package Package_1_for_KB3139398~31bf3856ad364e35~x86~~6.1.1.1 as failed. [HRESULT = 0x00000000 - S_OK]
2016-11-08 03:12:32, Info CBS Clearing HangDetect value

「Doqe: Failed installing driver updates [HRESULT = 0x80070005 – E_ACCESSDENIED]」とあり、E_ACCESSDENIED(アクセス件がありません)というエラーで終わっていることが分かります。さらに手前の行を追っていく「Info CBS INSTALL index: 4, phase: 1, result 5, inf: usbstor.inf」と、usbstor.infのINSTALLのresultコードが5になっており正常に終了していません。

C:\Windows\usbstor.infのプロパティを開きセキュリティタブのアクセス権を開いてみると・・・SYSTEMとAdministratorsのアクセスを拒否する設定になっていました。アクセス権の拒否のチェックを外してあげると・・・正常に更新する事ができました。

Windows10のWindowsUpdateでKB3197954が繰り返しエラーとなる

ずっとWindows10にてWindows Updateに失敗が続くので、未適用も増えている対応することにした。C:\Windows\Logs\CBS\CBS.LOGを確認してみるとKB3197954でエラーが発生している。

Google等で検索してみると、WindowsUpdateのサイズが大きいために途中でエラーとなってしまい終わらないことがあるとの情報を見つける。そこでWindows Download CenterからKB3197954をダウンロードしてインストールを試みた。しかし残念ながら進捗が60%ぐらいまで進んだ後、遅々として終わらず、OSを強制的に再起動する。

過去のWindowsUpdateに失敗している可能性もあるが、ロールアップパッケージとなってしまったが故に原因の特定が難しい。以前なら修正される内容から、関連しそうな過去のUpdateにあたりを付けてアンインストールできたのだが、ロールアップパッケージとなったためにそれは出来ない。となると、過去のWindowsUpdateで適用したものを順に消してみるしかない。

スタートメニューから「設定→更新とセキュリティ→Windows Update→更新の履歴→更新プログラムをアンインストールする」に進んでみると、なんとKB3197954がインストール済み更新プログラム一覧の中に載っている。どうやらKB3197954のインストールが正常に完了していないために、KB3197954を繰り返し検出してはエラーとなっていたようだ。

KB3197954をアンインストールした後、あらためて先ほどダウンロードしたKB3197954をインストルしたところ今度は正常に完了。その後のWindows Updateでも問題は発生していないので、大丈夫そうです。