Hyper-VでUbuntu環境構築を行う上で最初にやること/はまりそうなところ
はじめに
いままでCentOSばかり使ってきたけれど、久しぶりにUbuntuをインストールしてみた。 Hyper-V上で環境構築するうえで、はまったところや最初に最低限やっておくべきことをメモしておく。 気づいたことがあれば順次更新予定。
デスクトップ版とサーバ版のどちらを採用するか
Ubuntuには、デスクトップ版とサーバ版の2種類が存在する。 読んで字のごとく、デスクトップ版はGUIが標準でついていて、デスクトップ環境として利用するためのバージョン、サーバ版はサーバとしての機能が充実しているバージョンという区切りらしいが、明確に両者におけるインストールパッケージの違いなどのドキュメントは見当たらなかった。 今回は、デスクトップ版を選ぶ。 また、Ubuntuには、日本語Remixという日本語専用のOSイメージもあるらしいが、今回はそちらではなくUbuntu本体のダウンロードサイトからダウンロードしたイメージを使用した。 尚、バージョンは2017/2現在の最新版の16.04.2を利用した。
Ubuntuインストール時のHyper-Vの設定
UbuntuをHyper-Vにインストールしようとしてインストールが始まらない事象が発生した。(PXEbootでDHCPを探す状態になってしまう) 図のように、セキュアブートを無効化することで、OSイメージを起動することができるようになった。 設定->セキュリティ->「セキュアブートを有効にする」のチェックを外す
ネットワーク構成
ネットワーク接続要件として、以下を満たすようにしたかった。
- 仮想サーバはインターネットに接続可能
- Wifi環境が変わっても、ホストサーバから固定のアドレスで仮想サーバに接続可能
これを満たすためには、外部ネットワーク(ブリッジ接続)と内部ネットワークの2つの仮想ネットワークアダプタの設定を行った。
内部ネットワークの設定
内部ネットワークは、固定IPアドレスを利用したいため、手動でIPv4アドレスを設定する。
また、Hyper-Vの仮想スイッチマネージャと仮想サーバの設定において、以下を実行する。
仮想スイッチマネージャ 内部ネットワークの名称->「管理オペレーティングシステムの仮想LANIDを有効にする」にチェックを入れ、VLANIDを設定する
仮想サーバの設定 設定->内部ネットワーク->仮想LANIDを有効にする にチェックを入れる
外部ネットワークの設定
なんでかよくわからないけれど、最初IPv6の設定がリンクローカルになっていて、インターネットに接続できなかった。
Ubuntuの設定->ネットワーク->NICの番号-> IPv6 Method: Link-Local OnlyになっているのをIgnoreにする
最低限のパッケージのインストール
デスクトップ版は、SSHが標準でインストールされていない。 他にも最低限必要なパッケージをインストールする。
sudo apt-get install ssh vim sysv-rc-conf git curl zsh tree tmux nkf
ホストサーバとの共有ディレクトリを用意する
ホストのWindows上で共有用のディレクトリを作成する。 プロパティを開いて共有設定を行う。 今回は、C:\shareを作成して、共有設定を行った。
rootユーザで/etc/rc.localに以下を記述する。
mount -vvv -t cifs -o username=ユーザ名,password=パスワード,uid=1000,gid=1000,iocharset=utf8 //ホストサーバのIPアドレス/share /mnt/share
ロケールを英語にしたけどあとで日本語が使いたくなって実施したこと
殴り書き。
sudo apt-get install language-pack-ja echo export LANG=ja_JP.UTF-8 >> ~/.profile source ~/.profile sudo update-locale LANG=ja_JP.UTF-8 /etc/default/localeを開いてすべてのパラメータ値をja_JP.UTF-8にする。 sudo apt-get install ibus-mozc ibus-setup killall ibus-daemon ibus-daemon -d -x &
System Settings -> Language Support LanguageSupportがインストールされていません、というポップアップが出る。 インストールする、をクリックする。
上記実施しても日本語入力ができないままだった。 GUI画面で以下を実行すると、できるようになった。 System Settings -> Text Entry Switch to next source usingの箱の上で「変換」ボタンを押す。 Switch to previous source usingの箱の上で「無変換」ボタンを押す。
デフォルトのシェルをzshにする
chsh Password: Changing the login shell for chie8842 Enter the new value, or press ENTER for the default Login Shell [/bin/bash]: /bin/zsh
各種設定ファイルの配置
GitHub上に各種設定ファイルをおいているので、クローン/ダウンロード・配置する。
# GitHubリポジトリからクローン git clone https://github.com/chie8842/configs.git # 設定ファイル .zshrc .vimrc .tmux.conf .jupyter .gitconfig .vnc
その他
英語のリスニング学習ツール
最近仕事で英語を使うらしい妹が、
「お姉ちゃん、TOEIC勝負しよう!」
といってくるので、英語の勉強を始めることにした。
勝負はTOEICだけど、せっかくなので、TOEIC用の勉強でなくて、ちゃんと喋れるようになるための勉強がしたい。
いろいろ調べて試してみたけど、今のところ気に入っている教材を上げておく。
TOEIC presents English Upgrader
1つのトピックが、2分ほどの英語の会話と、そこで出てくるフレーズや解説で合わせて20分程度で構成されている。 比較的分かりやすいゆっくりした発音で、会話が2分程度と短いので、聞き取りやすい。 英語と日本語のスクリプトも用意されていて便利。 感覚的に、実際のTOEICのリスニングの内容よりも易しく感じる。 スマホアプリが便利。
-
Voice Of Americaという、アメリカの国営放送による、英語学習者向けのニュースサイト。 Level oneからthreeまで分かれている。 テーマについて一人のナレータが語る構成。10分程度。 かなりゆっくり話してくれており、ボキャブラリも考慮されていて、初心者でも聴きやすい。 日本語訳はない。 podcastで聞くのがオススメ。
-
イギリスの国営放送BBCによる英語教材。 イギリスの教材なので、もちろんイギリス英語。 上述の2つよりはレベルが高く感じる。 トピックごとに、テーマに則したクイズが出題されており、楽しんで学べる構成になっている。 1トピック6分の会話で成り立っているが、会話途中でネイティブのスピードで話す第三者が出てくる場面があり、聞き取るのが結構疲れる。 英語のスクリプトはあるが、日本語訳はない。
私は以下のpodcastアプリを使って聞いている。
-
リクルートが出している英語学習アプリ。 月額980円と有料だが、おすすめ。 2分程度の会話に対して、内容理解のチェック、単語チェック、ディクテーション、発音チェックが行われる。 最初に実力チェックが行われ、それによってレベルが決められる。 自分の発音を録音して確認する機能などもあり、スピーキングが鍛えられる。 日々の学習進度の管理もできる。
Windows10上にCUDAをインストールしてサンプルプログラムを動かしてみる
CUDAのインストール
CUDAのダウンロードページから、インストーラをダウンロードする。
ダウンロードが終わったらインストーラを実行する。
必要なパッケージのダウンロードに時間がかかる。
インストールの確認
インストールが完了したら、 コマンドプロンプトを開いてnvccコマンドが実行できることを確かめる。
>nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2016 NVIDIA Corporation Built on Mon_Jan__9_17:32:33_CST_2017 Cuda compilation tools, release 8.0, V8.0.60
次にdeviceQueryをビルドして実行し、CUDAが正常にインストール・設定されていることを確認する。 1. エクスプローラで以下の場所に移動する C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\1_Utilities\deviceQuery 2. deviceQuery_vs2010.slnをダブルクリックする。
- Visual Studioが立ち上がったら、Build->Build Solutionを選択してビルドを行う
成功すると、Outputに、
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
と出る。 4. 以下の場所に、deviceQuery.exeができているはず。 C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\bin\win64\Debug コマンドプロンプトから、上記を実行すると、CUDAが認識しているGPUデバイスの情報が出力される
> deviceQuery.exe deviceQuery.exe Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "GeForce GPU" CUDA Driver Version / Runtime Version 8.0 / 8.0 CUDA Capability Major/Minor version number: 5.0 Total amount of global memory: 1024 MBytes (1073741824 bytes) ( 3) Multiprocessors, (128) CUDA Cores/MP: 384 CUDA Cores GPU Max Clock rate: 993 MHz (0.99 GHz) Memory Clock rate: 2505 Mhz Memory Bus Width: 64-bit L2 Cache Size: 1048576 bytes Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096) Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total number of registers available per block: 65536 Warp size: 32 Maximum number of threads per multiprocessor: 2048 Maximum number of threads per block: 1024 Max dimension size of a thread block (x,y,z): (1024, 1024, 64) Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535) Maximum memory pitch: 2147483647 bytes Texture alignment: 512 bytes Concurrent copy and kernel execution: Yes with 1 copy engine(s) Run time limit on kernels: Yes Integrated GPU sharing Host Memory: No Support host page-locked memory mapping: Yes Alignment requirement for Surfaces: Yes Device has ECC support: Disabled CUDA Device Driver Mode (TCC or WDDM): WDDM (Windows Display Driver Model) Device supports Unified Addressing (UVA): Yes Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0 Compute Mode: < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GeForce GPU Result = PASS
bandwidthTestの実行
CUDA Samplesには、deviceQuery以外にも様々なサンプルがある。 Utilityの一つである、bandwidthTestを実行してみる。
このbandwidthTestを実行するうえで、まずGPUを利用されるデータの流れについて記述する。 GPUを搭載しているGPUボードは、ホストのメモリとは別で、GPU用のメモリが搭載されている。 GPUでの計算に使用するデータは、ホストのメモリからGPU用のメモリに転送して利用される仕組みとなっている。
bandwidthTestを実行すると、下記の図のように、 ① Host to Device Bandwidth(ホストのメモリからGPUのメモリへの転送速度) ② Device to Host Bandwidth(GPUのメモリからホストのメモリへの転送速度) ③ Device to Device Bandwidth(GPUのメモリからGPUのメモリへの転送速度) の3種類の転送速度が計測される。
尚、–memoryオプションで、"pageable"もしくは"pinned"を選択することができる。 pageableを選んだ場合は、メインメモリ上でページング可能な領域としてGPU用のメモリを確保する。 pinnedを選んだ場合は、ページロックされた(ページアウトが発生しない)領域としてGPU用のメモリを確保する。
実行方法は、deviceQueryの時と同様に、Visual Studioを使ってソースコードをビルドして、コマンドプロンプトから、 bandwidthTest.exeを実行すればよい。
実行結果は以下のとおり。
memory=pageableの場合
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\bin\win64\Debug>bandwidthTest.exe --memory=pageable [CUDA Bandwidth Test] - Starting... Running on... Device 0: GeForce GPU Quick Mode Host to Device Bandwidth, 1 Device(s) PAGEABLE Memory Transfers Transfer Size (Bytes) Bandwidth(MB/s) 33554432 1312.4 Device to Host Bandwidth, 1 Device(s) PAGEABLE Memory Transfers Transfer Size (Bytes) Bandwidth(MB/s) 33554432 1353.4 Device to Device Bandwidth, 1 Device(s) PAGEABLE Memory Transfers Transfer Size (Bytes) Bandwidth(MB/s) 33554432 34166.0 Result = PASS NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
memory=pinnedの場合
>bandwidthTest.exe --memory=pinned [CUDA Bandwidth Test] - Starting... Running on... Device 0: GeForce GPU Quick Mode Host to Device Bandwidth, 1 Device(s) PINNED Memory Transfers Transfer Size (Bytes) Bandwidth(MB/s) 33554432 1526.8 Device to Host Bandwidth, 1 Device(s) PINNED Memory Transfers Transfer Size (Bytes) Bandwidth(MB/s) 33554432 1611.2 Device to Device Bandwidth, 1 Device(s) PINNED Memory Transfers Transfer Size (Bytes) Bandwidth(MB/s) 33554432 34167.1 Result = PASS NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
bandwidthTestの結果について
データ転送速度が遅い場合、GPU利用による処理の高速化の効果を転送にかかるオーバヘッドで打ち消してしまう可能性がある。 今回、他のスペックのマシンでのベンチマークの情報などはもっていないので、今回のSurface Bookでの実行結果が速いか遅いかは判断できない。 Surfaceの作りとしてCPU/Memoryはモニター側、GPUはキーボード側と離れた配置になっていることや、 Surface Bookを買ってGPGPUで遊ぼうと思ったけど障壁が高かった話で確認できたように、 Surface Bookに搭載されているGPUのスペックが高くないことを考慮すると、転送速度も高くはないのではないかと予想する。
ホストのメモリをpageable領域とした場合、page-lock領域とした場合と比べて少し速度が落ちる。 スワップアウト/スワップインが行われることによる影響と考えられる。
さいごに
CUDAのインストールと、CUDAに付属するサンプルアプリケーションを使ってCUDAの情報やデータの転送速度を確認した。 CUDAが使えるようになったので、TensorflowでGPUを使った機械学習をやってみよう!
Surface Bookを買ってGPGPUで遊ぼうと思ったけど障壁が高かった話
はじめに
Surface BookにNVIDIAのGPUが付けられる!ということで、 仮想サーバ上でGPGPUを試してみよう!と思ったけど、挫折したときの記録です。
Surface Bookゲット
持ち歩き用にずっとMacBookAirを使ってたけど、今どきメモリ4GBとかで結構不便を感じることが多かったので、 思い切ってSurface Bookを買ってみた。
オプションでNVIDIAのGPUが付けることができるということ。 ちなみに、Surface Bookでは、CPU/メモリ/ストレージ/バッテリといった主なモジュールは画面側についているけれど、GPUはキーボード側についているらしい。 こんな薄いのにcorei7だしメモリ16GB、SSD512GBでGPUつきとか、すごい!!!
ということで、ぽん!買ってしまった!高かった!!!
仮想サーバでGPU
とりあえずGPU使うならLinuxでしょ!と思った。 VirtualBoxでは、デフォルトでPCIパススルーの機能がないらしいので、使えない。 (Linux版のVirtualBoxでは、現在experimentalでextension packsがあるらしい。)Hyper-Vは仮想GPU対応しているということなので、 Hyper-V上にUbuntuたててみた。 よしよし、GPUが見えるか確認するぞ! どん!
$ lspci | grep -i nvidia (何も表示されない。)
???
Hyper-Vの設定->物理GPUの設定を確認する。 Surface Bookには、
の2つのGPUを搭載している。
このうち、NVIDIA GeForce GPUを指定すると、 「このGPUはRemoteFXの最小要件を満たしていません」 とのこと。 Windows上で仮想CPUを使う場合、RemoteFXというのが必要らしい。 RemoteFXの詳しい説明は、以下参照。
マイクロソフト RemoteFXの説明.aspx)
Surface Bookに搭載されているGPUの調査
そもそも、GeForceのバージョンがかいてないけど、こいつは何者なのか。。。 DeviceManagerとか確認しても、バージョンがどこにも書いていなかった。。。
そこで、GPU-Zという、搭載されているGPUに関するスペックやステータスなどの情報が見られる軽量ツールをインストールしてみた。
尚、GPU-Zを使うには、OpenCLがないと、エラーが発生してGPU情報がうまく見られない。OpenCLインストール後は、OS再起動が必要となる。
GPU-Zで確認できたSurface BookのGPU情報はこちら。
この情報を、NVIDIAのGeForceのスペックページやNVIDIA モバイルグラフィックス・スペック性能比較|パソコン実験工房資料室で確認されるほかのGeForceシリーズのGPUのスペックと比べてみる。
- コア Surface BookのGPUの搭載コアは、GM108というものである。これは、他のNVIDIAシリーズのGPUで言うと、 GeForce 940M, 930M, 845M1, 840M, 830Mで採用されているらしい。 現在のノートPC用の最新はGeForce 980なので、決して新しくはなさそうである。
- メモリ ノートPC用のGeForce GTXシリーズでは、DDR3とGDDR5の2種類のメモリが利用されている。GPU-Zで確認されたSurface BookのGPUの搭載メモリは、高性能のGDDR5の方だった。 メモリ容量は、多くのGeForce900M/800Mシリーズが2GB以上であるのに対し、Surface BookのGPUの搭載メモリは1024MBと小さい。
分かったこと
- GPU用のメモリが1G程度しかなく、GPGPUを行うにはちょっとつらそう。
- Surface Bookには、GeForce GPUが搭載されているけれど、仮想GPUは使えない。
- Surface Book搭載のGPUは、NVIDIA公式ページで確認されるどのバージョンのGeForceシリーズのGPUとも一致しない。 スペック的には、GeForce 940M, 930M, 845M, 840M, 830Mが近い。決して新しくない。
うーん、GPGPU目当てでSurfaceを買うのはやめた方がよかったかも。 Thinkpad T470pがほしいのだけど、日本で発売されないかなぁーーー。