焼肉が食べたい

ただの日記です。技術的に学んだことも書こうと思っていますが、あくまで自分用メモです。 プロフィールはこちら。https://chie8842.github.io/aboutme/

HeapStatsの使い方メモ

HeapStatsの使い方。ツールの使い方はすぐ忘れるのでメモ。

HeapStatsとは

HeapStatsのWikiページ抜粋

HeapStats とは、JavaVM のヒープやGC状況を監視する軽量なツールで、エラーの兆候を検知してSNMPを通してリアルタイムなアラートを発します。生成するログはかなり小さいもので、GUIツールで解析することができます。 HeapStatsは、次の二つのプログラムで構成されます: エージェント(agent) - JavaVMの情報を収集するJVMTIエージェントプログラムです。 アナライザ(analyzer) - 上記の情報を解析する Javaアプリケーションプログラムです。

エージェントを使ってみる

環境はUbuntu16.04.2。

Javaインストール

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

インストールしたら、Javaのバージョンを確認する。

java -version
# java version "1.8.0_121"
# Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
# Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

プロファイリングを行うサンプルアプリの作成

ArrayListに要素を追加していき、ゆっくりとヒープサイズが大きくなるようにする

// OOMESample.java

import java.util.ArrayList;
import java.util.List;

public class OOMESample {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        long i = 0;
        while (true) {
            if (i++ % 2000 == 0) list.add("aaa");
        }
    }
}

作成したアプリケーションをコンパイルする

javac OOMESample.java
ls
# OOMESample.class  OOMESample.java

OOMESample.classができていること。

HeapStatsのインストール

git clone https://github.com/HeapStats/heapstats.git
sudo apt-get install ant maven binutils-dev libsnmp-dev
./configure
make
su -
make install
ldconfig
exit

HeapStatsをアタッチしてサンプルアプリを実行してみる

java -Xmx512m -agentlib:heapstats OOMESample
# heapstats INFO: HeapStats 2.0.trunk
# heapstats INFO: Supported processor features: AVX
# heapstats INFO: Agent Attach Enable = true
# heapstats INFO: SnapShot FileName = heapstats_snapshot.dat
# heapstats INFO: Heap Log FileName = heapstats_log.csv
# heapstats INFO: Archive FileName = heapstats_analyze.zip
# heapstats INFO: Console Log FileName = None (output to console)

エージェントがアタッチされると、heapstatsの標準出力が現れる。
アプリケーションが終了すると、以下のようにログが出力されている。

ls
# heapstats_analyze170309235501.zip
# heapstats_log.csv
# heapstats_snapshot.dat

エージェントの設定ファイルを操作する

今回は、ソースコードからビルドを行っているので、設定ファイル(heapstats.conf)のテンプレートは/usr/local/etc/にある。
設定を変更する場合は、これをコピーして使用する。

cp /usr/local/etc/heapstats.conf ./
# heapstats.confの設定を行う

java -Xmx512m -agentlib:heapstats=/path/to/heapstats.conf OOMESample

実行中のアプリケーションにエージェントをアタッチするf:id:chie8842:20170325134717p:plain

wget http://icedtea.classpath.org/people/yasuenag/heapstats_tools/raw-file/tip/AgentAttacher/AgentAttacher.java
javac -cp $JAVA_HOME/lib/tools.jar AgentAttacher.java

アプリケーション動作中に、以下を実行する

java -Xmx512m OOMESample # アプリケーションを起動する

java -cp $JAVA_HOME/lib/tools.jar:. AgentAttacher /usr/local/lib/libheapstats.so /path/to/heapstats.conf # アプリケーション実行中に別のプロンプトで実行する。
# Num Process-Info
#   0 AgentAttacher /usr/local/lib/libheapstats.so
#   1 OOMESample
# Input attach target process-number:1 <- エージェントをアタッチしたいプロセスの番号を入力する
# Attacher is successed.

アナライザを使ってみる

Analyzerを起動する

GUI画面上のエクスプローラで、/path/to/heapstats/analyzer/fx/target/heapstats-analyzer-2.0.trunkを開き、heapstats-analyzer.jarをダブルクリックすると、アナライザが起動する。

  • Log Data

    • Resource Data f:id:chie8842:20170325134726p:plain

    • Log Detail Data f:id:chie8842:20170325135147p:plain

  • SnapShot Data

    • Summary Data f:id:chie8842:20170325134729p:plain

    • Histogram f:id:chie8842:20170325134732p:plain

    • SnapShot Data
      f:id:chie8842:20170325134720p:plain:w260f:id:chie8842:20170325134714p:plain:w260

    • Reference Tree
      表示されなかった。理由は不明。

  • Thread Recorder f:id:chie8842:20170325134717p:plain

  • JVMLive
    リアルタイムでプロファイリング結果が見える機能っぽい。JVisualVMで見えるみたいなもの? 今回試していないので、後で試したら追記する。

アナライザの詳しい説明は以下のページにある。
HeapStats/Analyzer-version2 - IcedTea

使ってみての所感

インストールや設定は簡単にできて、取得できる情報量も多い。
(エージェントが一括でログを取得してくれてらくちん)
アナライザのGUIについて、Resource Dataなどメモリや凡例がなく、パッと見方がわからないところがあり、改善の余地があるように感じた。
カーソルを当てたら説明がでてくるような機能などあれば便利だと思った。
なぜだかReference Treeの内容が見えなかった。(前に使ったときは見えた。)なぜだろう。

参考にしたページ

JavaVM監視・解析ツール HeapStatsを使ってみた | キャスレーコンサルティング 技術ブログ HeapStats/jp - IcedTea https://github.com/HeapStats/heapstats

GitHub PagesとHUGOでブログサイトを構築する

はじめに

ブログサイト構築について、 WordpressGitHub Pages+HUGO→medium→はてな ということで、現在はてなに落ち着いている。 せっかく試したので、GitHub Pages+Hugoでのブログサイト構築についてもメモしておく。

HUGO環境構築

まずgoをインストールする。

wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz

※ バージョンやOSは環境にあった最新版のものを確認してインストールすること。 goのダウンロード資材のURLはこちら

~/.profileに追記

export PATH=$PYENV_ROOT/bin:$PATH:/usr/local/go/bin
export GOPATH=$HOME/go

追記したら環境変数の変更を現在のセッションに反映すること。

source ~/.profile

続いてHUGOのインストール

go get -v github.com/spf13/hugo
hugo version # インストールしたら、バージョンの確認を行う。
# Hugo Static Site Generator v0.2-DEV linux/amd64 BuildDate: 2017-02-27T23:55:32+09:00

HUGOで新しいサイトを構築する。

cd /pass/to/
hugo new site myblog  # myblogは新しく作成するサイトの名称

基本的な使い方をメモしておく。

  • テーマの利用 HUGOのテーマのページから、気に入ったテーマをクローンして利用する。 私はHugo-Octopressを選んだ。テーマは自分でカスタマイズすることも可能。
 cd /pass/to/myblog/
 git clone https://github.com/parsiya/Hugo-Octopress.git themes/Hugo-Octopress

このサイトのテーマとかかわいくてシンプルでいいなぁ、と思うので、参考にしてカスタマイズしてみたい。

  • 設定ファイル 基本的な設定ファイルは、config.tomlを利用する。Hugo-Octopressの中にsample-config.toml が含まれていたので、それをテンプレートとして利用した。
cp /pass/to/myblog/themes/Hugo-Octopress/sample-config.toml /pass/to/myblog/
  • 新しいコンテンツの投稿 新しいコンテンツを投稿するには、以下のコマンドを実行する。
hugo new post/test.md
# /pass/to/myblog/contents/post/test.mdが作成される。

/pass/to/myblog/contents/post/test.mdを開くと、以下のヘッダが記述されている。ページの内容はヘッダの下にマークダウン形式で記述する。

+++
title = "test"
type = "post"
date = "2017-03-23T16:01:06+09:00"
+++

ブログの要素として、categoriesやtags、authorなども記述しておきたい場合は、/pass/to/myblog/archetypes配下に、 default.md、もしくはpost.mdを配置しておくと、その要素も含めたヘッダを作成してくれる。

cat default.md
# +++
# categories = ["未分類"]
# tags = [""]
# description = ""
# draft = true
# author = "chie8842"
# type = "post"
# +++

default.mdに記述した場合はすべてのコンテンツ、post.mdに記述した場合はpost/*.mdに対してのみ反映される。 詳しくはArchetypesのページ参照。

$ ~/go/bin/

  • ローカルにWebサーバをたててサイトの内容を確認する

    hugo server --theme=Hugo-Octopress-Orange --buildDrafts --baseURL=WebサーバのIPアドレス --bind=0.0.0.0 --disableLiveReload=false --watch

    オプションについて一部説明する。

    • –bind 今回Ubuntuでたてた仮想サーバ上でHUGOを動かしており、ホストのWindows上で画面を確認をしたかったが、デフォルトだとローカルからしかHUGOでたてたWebサーバへのアクセスができないため、–bindオプションで全てのNICのアドレスをバインドして、ホスト側から閲覧可能なようにした。
    • –buildDrafts HUGOでは、下書きと公開用のコンテンツを、コンテンツのヘッダのdraft = true/falseで判別している。デフォルトでは、draft = falseのコンテンツのみ静的コンテンツのジェネレートを行うが、下書きの確認をしたい場合は、–buildDraftsオプションを利用する。
    • –disableLiveReload, –watch disableLiveReloadはHUGOでサイトをrebuildしたときにブラウザをリロードするかどうかの設定。watchはファイルシステムを監視して変更があった場合はリクリエイトする設定。サイトの内容をリアルタイムに確認しながら編集したい場合に使用するとよい。
  • アップロード用のページをジェネレートする

hugo

上記のコマンド一発で、config.tomlのpublishDirで指定したディレクトリ配下に、サイトのHTML/CSS/JSなどのファイルが作成・格納される。

Wordpressからの移行

Wordpressに投稿したブログの移行もやってみた。

ブログを Wordpress から Hugo に移行したを参考にした。

Wordpressには、wordpress-to-hugo-exporterというHUGOへの移行のためのプラグインがあるので、それを利用する。 ちなみに、他のブログサイトとの間の移行ツールもいろいろあり、以下にまとまっている。 https://gohugo.io/tools/

GitHubでの管理と、GitHubページの設定

以下のような構成で管理するようにした。

├── myblog --> masterブランチ
│   ├── archetypes
│   ├── config.toml
│   ├── content
│   ├── docs(HUGOでジェネレートされたファイルのディレクトリ) --> gh-pagesブランチ→GitHub Pagesで公開
│   ├── layouts
│   ├── static
│   └── themes ── mytheme --> themeブランチ

尚、GitHub PagesはデフォルトだとJekyllを使ってビルドしようとする。今回はJekyllは利用しないので、docsディレクトリ配下には、.nojekyllという名前のファイルを作成しておく。

touch /path/to/myblog/docs/.nojekyll

使ってみての所感

使ってみて、いいな、と思ったところは以下のとおり。 * マークダウンで記事がかける。 * githubで記事を管理できる。 * サイトの管理にお金がかからない。 * カスタマイズできる。アフィリエイトなども自由にできる。

一方で、以下の点で使い勝手が悪かった。 * HUGOをインストールしたPCからでないと、記事がアップできない。 * HUGO自体に不具合があったときに、GO言語に詳しくないので直せなくて困る。 * テーマがあまり豊富でない。かわいい系のテーマがない。  気に入ったものを自分で作る必要があるがそこに時間をかけたくない場合は面倒。 * SEO対策を自分でがんばらないと、最初は全然見てもらえない。 * 全てマークダウンで記事を書くので、表現に制約がある。 * 画像を載せるときとか、小さく表示しておいてクリックしたらポップアップしたい、とかそういうかゆいところは自分で頑張って実装する必要がある。

最終的に、サイトは見やすくしたいけど自分でメンテするのに労力をかけたくなかったので、一旦はてなに移った。 また時間ができたらいじってみようと思う。

最後に、一応HUGOで作ったサイトのURLを載せておく。 https://chie8842.github.io/blog/

参照

Go言語のページ: https://golang.org/
HUGOのドキュメント:https://gohugo.io/
HUGOのテーマのページ: http://themes.gohugo.io/
GithugPagesのページ:https://pages.github.com/

Hyper-VでUbuntu環境構築を行う上で最初にやること/はまりそうなところ

はじめに

いままでCentOSばかり使ってきたけれど、久しぶりにUbuntuをインストールしてみた。 Hyper-V上で環境構築するうえで、はまったところや最初に最低限やっておくべきことをメモしておく。 気づいたことがあれば順次更新予定。

デスクトップ版とサーバ版のどちらを採用するか

Ubuntuには、デスクトップ版とサーバ版の2種類が存在する。 読んで字のごとく、デスクトップ版はGUIが標準でついていて、デスクトップ環境として利用するためのバージョン、サーバ版はサーバとしての機能が充実しているバージョンという区切りらしいが、明確に両者におけるインストールパッケージの違いなどのドキュメントは見当たらなかった。 今回は、デスクトップ版を選ぶ。 また、Ubuntuには、日本語Remixという日本語専用のOSイメージもあるらしいが、今回はそちらではなくUbuntu本体のダウンロードサイトからダウンロードしたイメージを使用した。 尚、バージョンは2017/2現在の最新版の16.04.2を利用した。

Ubuntuインストール時のHyper-Vの設定

UbuntuHyper-Vにインストールしようとしてインストールが始まらない事象が発生した。(PXEbootでDHCPを探す状態になってしまう) 図のように、セキュアブートを無効化することで、OSイメージを起動することができるようになった。 設定->セキュリティ->「セキュアブートを有効にする」のチェックを外す

f:id:chie8842:20170323151109p:plain:w320

ネットワーク構成

ネットワーク接続要件として、以下を満たすようにしたかった。

  • 仮想サーバはインターネットに接続可能
  • Wifi環境が変わっても、ホストサーバから固定のアドレスで仮想サーバに接続可能

これを満たすためには、外部ネットワーク(ブリッジ接続)と内部ネットワークの2つの仮想ネットワークアダプタの設定を行った。

f:id:chie8842:20170323151107p:plain

内部ネットワークの設定

内部ネットワークは、固定IPアドレスを利用したいため、手動でIPv4アドレスを設定する。

f:id:chie8842:20170323151116p:plain

また、Hyper-Vの仮想スイッチマネージャと仮想サーバの設定において、以下を実行する。

  • 仮想スイッチマネージャ 内部ネットワークの名称->「管理オペレーティングシステムの仮想LANIDを有効にする」にチェックを入れ、VLANIDを設定する

  • 仮想サーバの設定 設定->内部ネットワーク->仮想LANIDを有効にする にチェックを入れる

f:id:chie8842:20170323151112p:plain:w280f:id:chie8842:20170323151114p:plain:w280

外部ネットワークの設定

なんでかよくわからないけれど、最初IPv6の設定がリンクローカルになっていて、インターネットに接続できなかった。

Ubuntuの設定->ネットワーク->NICの番号-> IPv6 Method: Link-Local OnlyになっているのをIgnoreにする

f:id:chie8842:20170323151119p:plain

最低限のパッケージのインストール

デスクトップ版は、SSHが標準でインストールされていない。 他にも最低限必要なパッケージをインストールする。

sudo apt-get install ssh vim sysv-rc-conf git curl zsh tree tmux nkf

ホストサーバとの共有ディレクトリを用意する

ホストのWindows上で共有用のディレクトリを作成する。 プロパティを開いて共有設定を行う。 今回は、C:\shareを作成して、共有設定を行った。

f:id:chie8842:20170323151122p:plain:w280f:id:chie8842:20170323151126p:plain:w280 f:id:chie8842:20170323151128p:plain:w280f:id:chie8842:20170323151106p:plain:w280

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

その他

SELinuxとかiptablesとかもやらないと。(やってない。) JUJUとか触ってみないと。

英語のリスニング学習ツール

最近仕事で英語を使うらしい妹が、

「お姉ちゃん、TOEIC勝負しよう!」

といってくるので、英語の勉強を始めることにした。

勝負はTOEICだけど、せっかくなので、TOEIC用の勉強でなくて、ちゃんと喋れるようになるための勉強がしたい。

いろいろ調べて試してみたけど、今のところ気に入っている教材を上げておく。

  1. TOEIC presents English Upgrader

    1つのトピックが、2分ほどの英語の会話と、そこで出てくるフレーズや解説で合わせて20分程度で構成されている。 比較的分かりやすいゆっくりした発音で、会話が2分程度と短いので、聞き取りやすい。 英語と日本語のスクリプトも用意されていて便利。 感覚的に、実際のTOEICのリスニングの内容よりも易しく感じる。 スマホアプリが便利。

  2. VOA Learning English

    Voice Of Americaという、アメリカの国営放送による、英語学習者向けのニュースサイト。 Level oneからthreeまで分かれている。 テーマについて一人のナレータが語る構成。10分程度。 かなりゆっくり話してくれており、ボキャブラリも考慮されていて、初心者でも聴きやすい。 日本語訳はない。 podcastで聞くのがオススメ。

  3. BBC 6 minutes English

    イギリスの国営放送BBCによる英語教材。 イギリスの教材なので、もちろんイギリス英語。 上述の2つよりはレベルが高く感じる。 トピックごとに、テーマに則したクイズが出題されており、楽しんで学べる構成になっている。 1トピック6分の会話で成り立っているが、会話途中でネイティブのスピードで話す第三者が出てくる場面があり、聞き取るのが結構疲れる。 英語のスクリプトはあるが、日本語訳はない。

    私は以下のpodcastアプリを使って聞いている。

    英語 学習ESL リスニング – BBC

  4. スタディサプリ

    リクルートが出している英語学習アプリ。 月額980円と有料だが、おすすめ。 2分程度の会話に対して、内容理解のチェック、単語チェック、ディクテーション、発音チェックが行われる。 最初に実力チェックが行われ、それによってレベルが決められる。 自分の発音を録音して確認する機能などもあり、スピーキングが鍛えられる。 日々の学習進度の管理もできる。

Windows10上にCUDAをインストールしてサンプルプログラムを動かしてみる

CUDAのインストール

CUDAのダウンロードページから、インストーラをダウンロードする。 f:id:chie8842:20170322230030p:plain:w280

ダウンロードが終わったらインストーラを実行する。 f:id:chie8842:20170322230034p:plain:w280f:id:chie8842:20170322225954p:plain:w280f:id:chie8842:20170322225958p:plain:w280f:id:chie8842:20170322230002p:plain:w280

必要なパッケージのダウンロードに時間がかかる。

f:id:chie8842:20170322230007p:plain:w280f:id:chie8842:20170322230010p:plain:w280

インストールの確認

インストールが完了したら、 コマンドプロンプトを開いて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をダブルクリックする。

f:id:chie8842:20170322230534p:plain:w320

  1. Visual Studioが立ち上がったら、Build->Build Solutionを選択してビルドを行う

f:id:chie8842:20170322230738p:plain:w320

成功すると、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用のメモリに転送して利用される仕組みとなっている。

f:id:chie8842:20170322230023p:plain:w320

bandwidthTestを実行すると、下記の図のように、 ① Host to Device Bandwidth(ホストのメモリからGPUのメモリへの転送速度) ② Device to Host Bandwidth(GPUのメモリからホストのメモリへの転送速度) ③ Device to Device Bandwidth(GPUのメモリからGPUのメモリへの転送速度) の3種類の転送速度が計測される。

f:id:chie8842:20170322230025p:plain:w320

尚、–memoryオプションで、"pageable"もしくは"pinned"を選択することができる。 pageableを選んだ場合は、メインメモリ上でページング可能な領域としてGPU用のメモリを確保する。 pinnedを選んだ場合は、ページロックされた(ページアウトが発生しない)領域としてGPU用のメモリを確保する。

f:id:chie8842:20170322230026p:plain:w320f:id:chie8842:20170322230028p:plain:w320

実行方法は、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 BookNVIDIAGPUが付けられる!ということで、 仮想サーバ上でGPGPUを試してみよう!と思ったけど、挫折したときの記録です。

Surface Bookゲット

持ち歩き用にずっとMacBookAirを使ってたけど、今どきメモリ4GBとかで結構不便を感じることが多かったので、 思い切ってSurface Bookを買ってみた。

オプションでNVIDIAGPUが付けることができるということ。 ちなみに、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を搭載している。

f:id:chie8842:20170322223730p:plain:w320

このうち、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 BookGPU情報はこちら。

f:id:chie8842:20170322223724p:plain:w320

この情報を、NVIDIAのGeForceのスペックページNVIDIA モバイルグラフィックス・スペック性能比較|パソコン実験工房資料室で確認されるほかのGeForceシリーズのGPUのスペックと比べてみる。

  • コア Surface BookGPUの搭載コアは、GM108というものである。これは、他のNVIDIAシリーズのGPUで言うと、 GeForce 940M, 930M, 845M1, 840M, 830Mで採用されているらしい。 現在のノートPC用の最新はGeForce 980なので、決して新しくはなさそうである。
  • メモリ ノートPC用のGeForce GTXシリーズでは、DDR3GDDR5の2種類のメモリが利用されている。GPU-Zで確認されたSurface BookGPUの搭載メモリは、高性能のGDDR5の方だった。 メモリ容量は、多くのGeForce900M/800Mシリーズが2GB以上であるのに対し、Surface BookGPUの搭載メモリは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がほしいのだけど、日本で発売されないかなぁーーー。


  1. GeForce 845MはNVIDIAの公式ページには載っていない。