Volo di notte

お勉強の成果メモや日常のこと

夜間飛行へ移行中です

 

NVIDIA DIGITSでMNISTする

はじめに

Windows10のGPUレス環境に念願のDIGITS 4.0を導入しました

chachay.hatenablog.com

試験走行用にMNISTを実施。

参考資料

MNISTデータのダウンロード

データのダウンロードツールがDIGITSに付属しています。うちの場合は、Dドライブ直下にDigitsのリポジトリをクローンしたので、D:/DIGITS-master/tools/download_data/ にツールがあります。

D:/DIGITS-master/tools/download_data/でコマンドプロンプトをひらいて、D:/MNIST_DATA/にデータをダウンロードするには…

python main.py mnist D:/MNIST_DATA/

を実行します。

これでDIGITS用のトレーニングデータが、D:/MNIST_DATA/train以下に、 テスト用のデータがD:/MNIST_DATA/test以下に準備できます。

DIGITS上にトレーニング用データセットDBを作成

DIGITS起動後、http://localhost:5000 にアクセスすると、下記のような画面に。

f:id:Chachay:20160723212608p:plain

ここで、New Datasetをクリックして、Classificationを選びます。 f:id:Chachay:20160723212636p:plain

すると、インストール時に設定すらしてなかったUsernameを聞く画面に遷移します。ここのユーザー名は、なんでも良いので適当に入力してSubmitしてください。

f:id:Chachay:20160723212654p:plain

その後出てくるDataset作成ページで必要な情報を入力してCreateすれば出来上がり。 f:id:Chachay:20160723212704p:plain

その後のスクショを取るのを忘れましたが、こんな感じになるはずです。

オフィシャル画像

トレーニングモデル(シナリオ)の作成

トップページ ( http://localhost:5000 )へ戻ります。 次は、NewModelをクリックして、Classificationを選びます。

f:id:Chachay:20160723212727p:plain

CPUなしのインストールなので計算に使用するGPUを選択リスト…は出てきませんが、 2箇所クリックして、モデル名(LeNetなど)を入力するだけの簡単な作業で済みます。 f:id:Chachay:20160723213056p:plain

モデルが作成されると同時に、トレーニングが開始されます。 うちのPCは、あまり高速ではないので50分くらい放っておいて終わるようなペースでした。

トレーニング中はページをリロードすると進捗が更新されます。 f:id:Chachay:20160723213309p:plain

トレーニング完了後の試験

トレーニング後はページの下の方に配置されたTrained Modelsを使って遊びます。

画像ファイル1個を使った例(単ファイル テスト)

単ファイルを認識させるテストをします。このように認識させる画像ファイルをD:\MNIST_DATA\testフォルダなどから適当に選択してやり、Classify Oneを実行します。

f:id:Chachay:20160723214146p:plain

すると、ニューラルネットの途中過程も含めた認識作業結果が出力されます。100%の確率で「5」と出てますね。よくわかってます。

f:id:Chachay:20160723214344p:plain

画像を複数使った例 (いわゆる画像認識精度の確認試験)

こちらは画像がどこに入っているかまとめて記入されているファイルが必要になります。今回用意したMNISTデータには最初から用意されているので、それを利用します。

f:id:Chachay:20160723214840p:plain

すると、testフォルダの全ファイルについての認識精度が確認できます。 f:id:Chachay:20160723214913p:plain

おわりに

CPUだけでもNVIDIA DIGITSが動いてよかった!

あとはCaffe | Model ZooとかどうやってDIGITSに取り込むのかなぁと思ってます。

[Windows] NVIDIA DIGITS 4.0をGPUなしで使う!

DIGITSのバージョンアップもあり内容を更新しました

新しい記事はこちら → NVIDIA DIGITS 6.0をWindowsで使う! - 夜間飛行

はじめに

NVIDIA Deep Learning Day 2016などで華々ししく紹介されているNVIDIA DIGITS. いつものことながらWindows文化のメーカー系会社員には中々導入が難しいです。 そのうえ、支給パソコンにはGPUがないものまであります。

そんな環境でもDIGITSをお試ししてみたい!という思いで試験的にインストールしました。

環境

DIGITSとは

NVIDIA DIGITS (the Deep Learning GPU Training System)NVIDIAが公開しているディープラーニングのWebアプリ インタフェースです。バックエンドはCaffeとなっており、ディープラーニングのライブラリとして有名なCaffeをプログラミングしないでも使えるようにするツールです。

使い方などは、たぶんビデオ見た方が早いですが、ブラウザベースで画像をアップロードするなどして、ニューラルネットワークを選んでほおっておくと出来上がり!


NVIDIA Deep Learning Course: Class #2 - Getting Started with DIGITS

手っ取り早く結果のイメージだけ紹介すると、こんな風にディープラーニングできちゃうのだそうです! f:id:Chachay:20160721221208p:plain 出典:NVIDIA DIGITS

さっそくインストールしてみよう!

DIGITSのインストール

DIGITSはCaffe+Pythonで動くので、まずCaffeをインストールする必要があります。

すでにCaffeが入っている方は読み飛ばしてもらって結構です。

  1. Pythonの必要なライブラリインストール
  2. Caffeのインストール
  3. Graphizのインストール
  4. DIGITSのインストール

DIGITSソースコードのダウンロード (GitHubからのダウンロード方法)

DIGITS4.0はGitHubから落とせます ⇒ NVIDIA/DIGITS: Deep Learning GPU Training System

"GitHubデスクトップ"をインストールしていない方は、zipとしてダウンロードして解凍してください。

f:id:Chachay:20160721220018p:plain

インストール作業の全体像

基本的に付属のマニュアルに従います ⇒ DIGITS/BuildDigitsWindows.md

必要なPythonのライブラリの追加

DIGITS(Caffe)の動作には

  • numpy
  • scipy
  • matplotlib
  • scikit-image
  • h5py
  • google protobuf
  • pyreadline
  • gevent
  • requests
  • image
  • pillow
  • wergzeug
  • wtforms
  • flask
  • flask-wtf
  • flask-scoketio
  • pydot
  • lmdb
  • gunicorn

が必要になります(多いですね) 以下で.whlで終わるファイルについてはPython Extension Packages for Windows - Christoph Gohlkeからダウンロードしてきて、pipコマンドでインストール。

pipのバージョンが7.1.2など古い場合はうまく動きませんので、念のためアップグレード。

python -m pip install --upgrade pip
pip install cython
pip install numpy-1.11.0+mkl-cp27-cp27m-win_amd64.whl
pip install scipy-0.17.0-cp27-none-win_amd64.whl
pip install matplotlib-1.5.1-cp27-none-win_amd64.whl
pip install scikit_image-0.12.3-cp27-cp27m-win_amd64.whl
pip install h5py-2.6.0-cp27-cp27m-win_amd64.whl
pip install protobuf
pip install pyreadline
pip install gevent
pip install requests
pip install image
pip install pillow
pip install wergzeug
pip install wtforms
pip install flask
pip install flask-wtf
pip install flask-socketio
pip install pydot
pip install lmdb
pip install gunicorn

Caffeのインストール

Windows用のCaffeもGitHubにあります。⇒ BVLC/caffe at windows

CaffeのビルドにはVisual Studio 2013が必要だそうです! VS2015でやろうとしましたが、boostライブラリのバージョン違いなど細かいところで面倒です。

Caffeビルドオプションの作成と変更

Caffe-Windowsのフォルダの中にwindowsフォルダがあります。

そのフォルダの中にCommonSettings.props.exampleというファイルがありますが、 これをCommonSettings.propsという名前でコピーします。

そして、コンパイルオプションをGPUなしに変え、python用とするため、 ファイルの中の6~7行目が

        <!--NOTE: CpuOnlyBuild and UseCuDNN flags can't be set at the same time.-->
        <CpuOnlyBuild>false</CpuOnlyBuild>
        <UseCuDNN>true</UseCuDNN>
        <CudaVersion>7.5</CudaVersion>
        <!-- NOTE: If Python support is enabled, PythonDir (below) needs to be
         set to the root of your Python installation. If your Python installation
         does not contain debug libraries, debug build will not work. -->
        <PythonSupport>false</PythonSupport>

となっていますが、これを

        <!--NOTE: CpuOnlyBuild and UseCuDNN flags can't be set at the same time.-->
        <CpuOnlyBuild>true</CpuOnlyBuild>
        <UseCuDNN>false</UseCuDNN>
        <CudaVersion>7.5</CudaVersion>
        <!-- NOTE: If Python support is enabled, PythonDir (below) needs to be
         set to the root of your Python installation. If your Python installation
         does not contain debug libraries, debug build will not work. -->
        <PythonSupport>true</PythonSupport>

に変更します。

さらに、Pythonフォルダを設定します。47行目あたりの

    <PropertyGroup Condition="'$(PythonSupport)'=='true'">
        <PythonDir>C:\Miniconda2\</PythonDir>

Pythonインストールフォルダに合わせて

    <PropertyGroup Condition="'$(PythonSupport)'=='true'">
        <PythonDir>C:\Python27-64\</PythonDir>

へ変更。

Caffeのビルド + Pythonへのインストール

Caffe-Windows以下のCaffe.slnVisual Studio 2013でひらき、ビルドを実行します。 10分後くらいにはCaffe-windows/Build/x64以下にビルド結果ができているはず。

そして、caffe-windows/Build/x64/Release/pycaffe以下のcaffeフォルダを、 C:/Python27-64/Lib/site-packages以下へコピー。

コマンドプロンプト

python -c "import caffe"

としてエラーがでなければ大丈夫です。

さらに、caffe-windows/Build/x64/Release/以下を、C:\Caffe\フォルダを作り、そこへコピー。 環境変数にC:\Caffe\を追加

Graphvizのインストール

DIGITSでディープラーニングニューラルネットを可視化するために使います。

Download | Graphviz - Graph Visualization Softwareから、Windowsインストーラをダウンロードしてきて、インストール。

DIGITSからのアクセス性を考えて、C:\Graphviz2.38\やD:\Graphviz2.38\へのインストールがおすすめ。

そして環境変数にC:\Graphviz2.38\binを追加しましょう。

DIGITSのインストール

やっと本体のインストールですね。

コマンドプロンプトをDIGITSのREADME.mdがあるフォルダで開きます。

そして、インストールに必要な要件がそろっているか確認するコマンドを実行します。 ただし、pipのバグかわかりませんが、pillowのファイル名をPIL⇒pilなど軒並み小文字に変えてしまい、 モジュール動作ができなくなってしまうような事態が発生するので、一部同梱のrequirements.txtを編集する必要があります。 具体的には最初の3行を消して、

protobuf>=2.5.0,<=2.6.1
six>=1.5.2,<=1.10.0
requests>=2.2.1,<=2.9.1
gevent>=1.0,<=1.1.0
Flask==0.10.1
Flask-WTF==0.11,<=0.12
wtforms>=2.0,<=2.1
Flask-SocketIO==0.6.0
gunicorn==17.5
setuptools>=3.3,<=20.7.0
lmdb==0.87
h5py>=2.2.1,<=2.6.0
pydot==1.0.28

とします。 そのうえで、下記を実行しましょう。モジュールのバージョンを調整してくれます。

python -m pip install -r requirements.txt

DIGITSの起動と実行

DIGITSフォルダで開いたコマンドプロンプトで、

python digits-devserver

を実行すると、http://localhost:5000でDIGITSにアクセスできます。

f:id:Chachay:20160723144520p:plain

MNISTも動きました!

chachay.hatenablog.com

注意事項

DIGITS 4.0からは物体認識タスクに対応したようですが、使っているCaffeがNVCaffeではないため、 detectNETをそのままでは構成することができずサンプルの物体認識は実行できません。

参考

GPUなしのNVIDIA DIGITS3で始めるDeepLearning - Qiita

G2's Forest – Deep Learning 用ライブラリ Caffe を Windows で使う

ドウジンテイスウ.log — Caffeのvisual studioビルド

Windows版Python 2.7 64bit版でCython

2018/1/17 追記: Python3系についても困った場合について、対策を記事にしました:Python環境でVisual StudioのCコンパイラのエラーに困ったら… - 夜間飛行
Python 2.7でも同じ対策でなんとかなれば幸いです。

ディープラーニングフレームワーク Chainerなどで使われるnVidia CUDAなども64bit版のみのサポートになるなど、Python2.7の環境も64bitへの移行を余儀なくされました。

その一方でWindowsの環境だとPython 64bit版ではCythonがうまく動かないという問題もあり、ちょっとぐぐって調べてみてもCythonはPython 64bit Windows版に対応しないとまで言及されています[1]。

これに対して、Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1を使えば解決できるという情報があったものの[2][3]、なんとかMicrosoft Visual C++ Compiler for Python 2.7だけでCythonを使えたので、覚書として残します。

(Cythonというよりdistutilの問題である気がしますが…)

0. 環境

1. Python 2.7へVisual C++の設定

Python2.7の32bit版でもVC++を使う場合は同じことをします。

まずC:/Python27/Lib/distutils/distutils.cfgの中身の書き換えて、Visual C++を使うようにします
(distutils.cfgがない場合は作成する)

[build]
compiler=msvc

このままだと

error: Unable to find vcvarsall.bat

というエラーが出てしまいVC++コンパイラーが見つけられないので、 C:/Python27/Lib/distutils/msvc9compiler.pyのfind_vcvarsallを下記のようにコードを追加します。
([2]を参考にしました)

def find_vcvarsall(version):
    """Find the vcvarsall.bat file

    At first it tries to find the productdir of VS 2008 in the registry. If
    that fails it falls back to the VS90COMNTOOLS env var.
    """
    vsbase = VS_BASE % version
    #---Patch----
    vcpath = os.environ['ProgramFiles']
    vcpath = os.path.join(vcpath, 'Common Files', 'Microsoft',
        'Visual C++ for Python', '9.0', 'vcvarsall.bat')
    if os.path.isfile(vcpath): return vcpath
    vcpath = os.path.join(os.environ['LOCALAPPDATA'], 'Programs', 'Common', 'Microsoft', 'Visual C++ for Python', '9.0', 'vcvarsall.bat')
    if os.path.isfile(vcpath): return vcpath
    #-------------

2. Python 2.7 - 64bit版でのCython

VC++で64bit版のオブジェクトを作成するために毎回実行しなくてはいけないというのがいけてないですが、 次の手順でVC++の環境を設定していきます。

VC++用にコマンドプロンプトを64bitの環境設定で起動する

    スタートメニュ > Microsoft Visual C++ Compiler Package for Python 2.7
    > Visual C++ 2008 64-bit Command Prompt

コンパイラが出力するオブジェクトを64bit版に設定する

set DISTUTILS_USE_SDK=1
setenv /x64 /release

うまくいくと字が緑色になります。

f:id:Chachay:20160606230851p:plain

このとき、環境変数が上書きされてしまっているので、Pythonへのパスが通るようにする

set path=C:\Python27\;C:\Python27\Scripts;%path%

VC++コンパイラcl.exeとlink.exeにパスが通るようにする

set path=C:\Users\%USERNAME%\AppData\Local\Programs\Common\Microsoft\Visual C++ for    
Python\9.0\VC\bin\amd64;C:\Users\%USERNAME%\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\WinSDK\Bin\x64;%path%
VC

VC++コンパイラのincludeフォルダへのパスを設定する。 libpathは設定しても有効ではなさそうです。

set include=C:\Users\%USERNAME%\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\WinSDK\Include;C:\Users\%USERNAME%\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\include;%include%

この状態でCythonizeしたいpyxファイルが置いてあるフォルダへ移動して、

python setup.py build_ext --inplace

を実行すると、Cythonizeとコンパイルが正常に実行された後、リンカがエラーを吐きます。 ライブラリにパスが通っていないためですが、前述の通りlibpathの設定では対処できないので、 setup.pyを書き換えます。Cython 事始め - 雑食性雑感雑記の例を下敷きにした変更ですと[4]

#! -*- coding: utf-8 -*-
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
 
ext_modules = [
    Extension( "calculate", ["calculate.pyx"],
    extra_compile_args=[],
    extra_link_args=[
        "/LIBPATH:C:\Users\(ユーザー名)\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\lib\\amd64", 
        "/LIBPATH:C:\Users\(ユーザー名)\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\WinSDK\Lib\\x64"
    ]
    ),
]
setup(
    name = "Sample calculate app",
    cmdclass = { "build_ext" : build_ext },
    ext_modules = ext_modules,
)

改めて

python setup.py build_ext --inplace

を実行するとpydファイルが作成され、出来上がり

3. 2. のまとめ

Visual C++ 2008 64-bit Command Promptを起動し、以下を実行

set DISTUTILS_USE_SDK=1
setenv /x64 /release
set path=C:\Python27\;C:\Python27\Scripts;%path%
set path=C:\Users\%USERNAME%\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\bin\amd64;C:\Users\%USERNAME%\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\WinSDK\Bin\x64;%path%
set include=C:\Users\%USERNAME%\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\WinSDK\Include;C:\Users\%USERNAME%\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\include;%include%
cd (pyxを置いてあるワークディレクトリへ移動)
python setup.py build_ext --inplace

そして、setup.pyにはリンカオプションをつけておく

ということでした。

[参考文献]

[1] akorn / wheezy.template / issues / #10 - Installation on windows fails — Bitbucket
https://bitbucket.org/akorn/wheezy.template/issues/10/installation-on-windows-fails#comment-12006152

[2]CythonExtensionsOnWindows · cython/cython Wiki · GitHub
https://github.com/cython/cython/wiki/CythonExtensionsOnWindows

[3] cython を windows 64bit 版で使う方法 - researchmap
http://researchmap.jp/jo9jywwyp-23687/

[4] Cython 事始め - 雑食性雑感雑記
http://kazuki-nagasawa.hatenablog.com/entry/start_cython