窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

GTX 1060をH77系のマザボに増設する際に詰まったこと(マザボ以外のことも)

はじめに

最近GTX 1060 6GBを購入しました.

MSI GeForce GTX 1060 AERO ITX 6G OC グラフィックスボード VD6307

MSI GeForce GTX 1060 AERO ITX 6G OC グラフィックスボード VD6307

自分はマザボに刺して補助電源のケーブルを伸ばしてきて刺すだけでドライバも勝手にインストールされて使えるようになると思っていました. しかし実際に行ってみると画面が映らなかったり,BIOS画面が非常にゆっくりになって停止したりとグラボ増設初めての初心者にはわからないことだらけだったので備忘録として書き残しておきます.

環境

FRONTIERで5年ぐらい前に購入したFRGX716/D GXシリーズのBTOパソコンがベースとなっています. マザボはH77H2-M4が搭載されています. またOSはもともとWindows 7だったものを何年か前にWindows 10に変更しました. クリーンインストールなどではなくアップデート扱いにしたので,ブートディスクはMBRディスクになっています.

問題と解決法

マザボが現時点のバージョンではUEFIブートに対応していない

そうだ、グラフィックボードを増設しよう! でも、その前に... - ツクモ福岡店 最新情報

こちらの記事でも触れられていますが,ここの問題は全てこれに起因していました. そして

価格.com - 『H77H2-M4に取付け可能でしょうか?』 MSI GTX 1060 GAMING X 6G [PCIExp 6GB] のクチコミ掲示板

もうまんま困ってる内容の質問あるやんけ!ということで見てみましたが,基本的には無理そうみたいな反応でした. しかし

【Pascal】NVIDIA GeForce GTX10XX総合 Part44 [無断転載禁止]©2ch.net

より

同じフロンティアのH77H2-M4でも2012年8月出荷分以降のものだとwin8対応済みみたいだからUEFIにも対応してるのかも?

という書き込みがあり,BIOSの更新を行うことでUEFIブートに対応するのではないかと考えました. ということでやってみます.

まずはBIOSのアップグレードです. この時期のものはWindows 8対応版みたいなくくりで行われているようなのでECSのサイトをあさってみます.

ECS Intel Windows 8 Support

このページの指定した順序でBIOSを更新してみたところ,BIOS画面にLEGACYブートかUEFIブートを選択する項目が表れました. これでマザボ相性問題は解決しそうです.

ブートディクスがGPTディスクではない

上記マザボ問題を解決してブート方式をUEFIにしてもそのままではWindowsが起動できません(No diskだかOSが見つからないって感じのものが出て止まった記憶). ということでディスクをUEFIブート出来るように変更しましょう.

これに関してはMicrosoftがMBR2GPTというツールを提供しているのでこれを使うと良いでしょう.

docs.microsoft.com

このツールですがちょっとエラーメッセージが優しくないなぁという感じなので,自分が引っかかった詰まりやすい点を挙げてみます.

  • Validationに失敗する

Too many MBR partitions foundみたいなのが出てきたら,ディスクのパーティションが4つ以上存在していることが原因です. これに関してはディスク管理などから対象のディスクのパーティションを確認しいい感じに3つまで減らすことでValidationが通るようになります. Windows 7からWindows 10へのアップグレードで回復パーティションが2つ以上に増えていることがあり,その場合はこのメッセージが出ないでValidationに失敗することもあるかもしれません(自分がみたいはこのメッセージだったっけという感じだったので).

No room to create EFI system partitionみたいなエラーが出たら先頭パーティションやOSが入っているパーティションのストレージの空き容量が足りていることをまずは確認します. それでも問題ない場合は,/allowFullOSのオプションを使用してOS実行中にMBR2GPTを起動しているのではないでしょうか. 自分の場合はこれが問題で,設定アプリ更新とセキュリティから回復を選択します. すると回復のための画面に切り替わるので,そこでコマンドプロンプトを選択し,そこでMBR2GPTを再度実行することでEFI systemのパーティションが生成されます. exitしBIOSの設定をUEFIに変更することで起動が可能になります.

まとめ

結局何が問題だったか,ということですが,

BIOSが古くてブート方式がLEGACYなのが悪かった

これに限るかなぁと思います. ちゃんとアップデートなどのパッチは適用しようと感じた一件でした.

あとがき

このGPUですが機械学習やマイニング用途として購入したのですが,今のところその用途で使われたことはなく,ヴァーチャルYouTuberの動画を見ることとPUBGをプレーする用途でしか使われてません.

TensorFlowSharpをXamarinで動かしたい!

この記事は Microsoft Student Partners Japan アドベントカレンダーの24日目の記事です.


みなさま,クリスマスイブをいかようにお過ごしでしょうか.私はビルドに1時間以上かかるものをビルドし,それを眺めながら非リアの楽しくも悲しいTwitterを眺めています.

さて,本記事タイトルのTensorFlowSharpをXamarinで動かしたい!ということですが,経緯としては

  • Xamarinで機械学習を試すにはAzure MLとかを使うしかない
    • Azure ML触ってみた感じ楽しかったのですが,込み入ったことをことをするには少し物足りない(気がする)
  • 最近になって iOSのCoreMLが出たけど,Androidも同様に,ということが出来ない
  • 機械学習界隈が積み上げてきた資産をそのまま使いたい

といった自分の中での思いや何やらがあったためです.

さて現時点の進捗としては,

  • AndroidでTensorFlowが使える環境が出来た
  • AndroidのTensorFlowで足し算,掛け算が出来た

というところが確認できています.

成果物としてはこちらになります.

github.com

今回の記事では実際に学習したモデルを使って評価まで行きたかったのですが,準備が終わらず修論に追われ間に合いませんでした...っ! 次回のちゅうこ先生の作品にご期待ください.

それでは現時点進めているのはモデルの評価が可能なのかどうなのかの確認?と思われるかも知れませんが,今進めているのはiOSのサポートとなっています. ビルドするソースを2,3個忘れてシンボルが出力されていない,という状況なので,あと数時間もすればサポートできるんじゃないかなぁとは思っていますが,さてさてどうなるか...

ということで,とりあえずAndroidだけでもという方向けにビルド方法をちょこっと解説する記事にしたいと思います.

実験環境

  • Mac (Linuxは自分がDocker環境で出来ていたので問題ないことを確認済み,Windowsは試していません)
  • Bazel 0.81 (0.9だとビルドが通りません)
  • Android NDK r14b (Bazel 0.81未満だとr12bが良かったのですが,完全に上手く言った組み合わせが今回の環境です)

Android向けにTensorFlowをビルドしてみよう

さて,Android向けにTensorFlowをビルドということで検索してみると色々と解説記事が出てきます. しかし内容としてはJavaで使うことしか書かれておらず(当たり前)C# で使うときに行う必要があるC-apiとしてのexportだったりが書かれていません.

ということで,そこから解説していきたいと思います.

  • (1) TensorFlowの準備

当たり前ですね.ここから始めて行きましょう. 現時点で公開されているTensorFlowはr1.5が最新バージョンですが,TensorFlowSharpが対応しているAPIは現状r1.4となっています. そのためcloneしたらr1.4にcheckoutしましょう.

実験環境に欄あるようにr14bをダウンロードし配置します. その後TensorFlowのrootディレクトリにあるWORKSPACEファイルを編集し,Android NDKのPATHを指定します. この時64bit対応にするためにapi_levelを21に引き上げておきましょう.

  • (3) Android向けのTensorFlowの共有ライブラリの出力シンボル指定

ここが一番重要だったりします. Java向けのJNIのシンボルだけを出力するように設定されているシンボル出力を,C-api向けに変更します.

方法としては,tensorflow/contrib/android/jni/version_script.ldsファイルを以下のように編集します.

VERS_1.0 {
  # Export JNI symbols.
  global:
    Java_*;
    JNI_OnLoad;
    JNI_OnUnload;
+   *TF_*;
+   *TFE_*;
  # Hide everything else.
  local:
    *;
};

TF_から始まるシンボルをTensorFlowSharpでコールしているため,ここでExportするようにしてあげます.

  • (4) ビルドする

今回は一般的なAndroid Smartphoneのアーキテクチャのarmeabi-v7aとarm64-v8aを対象にビルドしていきます.

まずはarmeabi-v7a

CC_OPT_FLAGS="-march=armv7-a -std=c++11" ./configure
bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so --crosstooltop=//external:android/crosstool --host_crosstool_top=@‍bazel_tools/cpp:toolchain --cpu=armeabi-v7a

configureを叩くとcuda使うか?など色々聞かれますが,とりあえず全部 No でいいと思います(自分はモバイル向けだしどれも No かなと思ったため). ビルドが終わるとbazel-bin/tensorflow/contrib/android以下にlibtensorflow_inference.soファイルが生成されていると思います. このファイルは各アーキテクチャ毎に必要なので別途保存しておいてください.

次にarm64-v8a

CC_OPT_FLAGS="-std=c++11" ./configure
bazel build --config=android_arm64 //tensorflow/contrib/android:libtensorflow_inference.so --crosstooltop=//external:android/crosstool --host_crosstool_top=@‍bazel_tools/cpp:toolchain --cpu=arm64_v8a

だいたいおんなじですね. 他にx86_64とかx64とかもありますが,大体こんな感じです. tensorflowディレクトリのBUILDファイルを見るとどのように指定すればそのアーキテクチャのものもビルドできるかわかると思うので,上記アーキテクチャ以外の物が必要であればそのようにビルドしてみてください.

  • (5) TensorFlowSharpで使う

これで必要なファイルが揃いました. ここからはもう楽をしちゃいましょう.上記のPRを引っ張ってきてビルドしたライブラリを配置してdotnet packしちゃいましょう.

えっ,解説は?という感じですが,古いバージョンのcsprojのマイグレートをして,Android向けにネイティブライブラリを配置してということを書くのは非常に...

ということで,その辺のネイティブライブラリ関連のことが気になる場合は

NuGet でプラットフォームごとにdllimportするネイティブライブラリを同梱してそれを使うラッパーのパッケージを作る方法 - 窓を作っては壊していた人のブログ

DllImport クロスプラットフォーム nuget パッケージ作成方法(unitypackage もあるよ!) - Qiita

このあたりを御覧ください.

最後に

さて,今回ちゃんとした成果物が出来ていないので記事としてもぺらいものになってしまいました. 最初Bazelを使わずにmakefileを叩いてビルドしていたのですが,完全に無駄でした.bazelを使いましょう.

あとネイティブライブラリをC# で使うのはそこまで厳しい茨の道ではないので,ぜひともネイティブの資産を上手く使えるC# erが増えてくれることを期待しています.