NVIDIA DIGITS 6.0をWindowsで使う!

はじめに

以前のブログにてDIGITS4.0をWindowsにインストールする手順を取り上げてから2年立ちましたが、ディープラーニングの普及は益々進み、 老若男女問わずこの技術の習得に関心が高まるこのごろですね。 そんな中、「プログラミングができなくてもディープラーニングできるよ!」という触れ込みでNVIDIA社さんがトレーニング(通称DLI)をオンラインや特別イベントなどでも主催し、少なからずAIに触ったという方は増えてきている様子ですが、 環境構築の面では未だまだ敷居が高いようです。 なにより厳しいのは一般企業の方は"Windows文化"ですよね。WindowsでのノンプラグラミングディープラーニングはSONYさんのNNablaもありますが、特にDLIを受講された方はDIGITSの方になれていると思いますので、内容を少しブラッシュアップしました。

DIGITSは5.0でも6.0でも良いですが、GANをやりたいときは6.0らしいっす。新しいのにしておきましょう。

環境

必須

Anaconda/MinicondaのPythonは2でも3でも良いですが、私自身はPython3.X (現時点では3.6)を普段はメインで使っており将来性の観点から3.Xの導入をおすすめします。

インストール時にAdd Anaconda to my PATH environment variableを有効にしてください.

推奨

これからインストールするもの

CaffeはNVIDIAがお手入れしている通称NVCaffeが一番良いのですが、WindowsでCaffeビルドするのが少し骨だと思いますので、Prebuild版で済ませます。

PowerShellの準備

以降、コマンドプロンプトかPowerShellを使います。PowerShellを前提に書いていくので、こちらを使う場合、機能制限を取っ払ってくださいね。

WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する:Tech TIPS - @IT

Microsoft Visual C++ Compiler for Python 2.7

python 2.7で使うコンパイラの入手とインストールをしておきます

こちらから入手http://aka.ms/vcpython27

Caffeの導入

別途用意したNVCaffeを使います。GPU版かCPU only版かはご自分の環境に合わせてどちらか一つを選択。Chachay/caffe: Caffe: a fast open framework for deep learning.

ダウンロードが終わったら、C:\CaffeやD:\CaffeなどにZipを展開します。好きなところで良いですがPathにスペース(" ")が含まれないほうが楽でしょう。展開後は下記のような構成になっているはず。あとでPATHを使いますので覚えといて。

C:\CAFFE
├─bin
├─include
├─lib
├─python
└─share

Graphvizのインストール

condaのパッケージにありましたね。

conda install graphviz
dot -V

dot -Vが通らなければ、anacondaインストール時に環境変数を設定してなかったことが原因だと思いますので、直してください

生でインストールする場合はこちら

Graphviz - Windows Packagesからダウンロードしてきて、インストール。インストール先を環境変数PATHにbinフォルダを追加します。 こちらのページが詳しいです。

Graphvizインストール手順

DIGITSのクローン

DIGITSを置きたいフォルダでPowerShellを開きます。フォルダのところでShift押しながら右クリックして「PowerShellウィンドウをここで開く」

git clone -b digits-6.0 https://github.com/NVIDIA/DIGITS.git
# DIGITS 5.0を使いたいときは
# git clone -b digits-5.0 https://github.com/NVIDIA/DIGITS.git

zipで落とすならこちら

Python2.7 仮想環境の構築

便利ファイルのダウンロード

以下のレポジトリからrequirements_conda.txt, requirements_pip.txtを入手してください。私のAnaconda環境が悪いのかconda create --file env.ymlがうまく動かなかったので、 マニュアルな方法を案内いたしますが、env.yml読めそうな人は同梱のymlで試してみてください。

Chachay/DIGITS_Windows_Packages

パッケージ類のインストール

DIGITSのオリジナルで付属しているrequirements.txtは、Windowsでは動作が怪しいパッケージだったり、 BVLC版Prebuild Caffeとの相性だったりが悪いので手直ししたものを使います。

もしcondaをpowershellに対応させてなかったら初期化を実行し、一旦閉じます。

conda init powershell

powershellを開き直して続きをします。

git clone https://github.com/Chachay/DIGITS_Windows_Packages
cd DIGITS_Windows_Packages
conda create -n DIGITS python=2.7
conda activate DIGITS
conda install -c free --file requirements_conda.txt --yes
pip install -r requirements_pip.txt

scikit-fmmが謎の問題をconda上で起こしますので、手直しします。参考:wheel files not working on Conda with Windows · Issue #27 · scikit-fmm/scikit-fmm

pip uninstall scikit-fmm
pip install --no-binary :all: scikit-fmm
cd ..

さらにGPUを利用する場合はCUDA10.1ツールキットを入れます。

conda install cudatoolkit=10.1.168

仮想環境の環境変数設定

CaffeのバイナリとPyCaffeへのPathを通します

$tmpPythonPath = (gcm python).Definition
$tmpPythonPath = $tmpPythonPath.Substring(0, $tmpPythonPath.Length - 10)
pushd $tmpPythonPath # 仮想環境のルートフォルダまで移動
mkdir .\etc\conda\activate.d
mkdir .\etc\conda\deactivate.d
New-Item -type File .\etc\conda\activate.d\env_vars.ps1
New-Item -type File .\etc\conda\deactivate.d\env_vars.ps1

で、両方のフォルダのenv_vars.batを編集します。

activateの方. Caffeの置き場は覚えていますね?

ファイルを開きます。vimなどを持っていれば、そちらを使って下さい。

notepad .\etc\conda\activate.d\env_vars.ps1

env_vars.ps1のファイルの中身はこちらの通り。

$env:PYTHONPATH="C:\caffe\python;" + $env:PYTHONPATH
$env:OLDPATH=$env:PATH
$env:PATH=$env:ProgramFiles + "\NVIDIA Corporation\NVSMI;" + $env:PATH + ";C:\caffe\bin"

deactivateの方も同様に。似てますけど…

# set PYTHONPATH=%PYTHONPATH:C:\caffe\python:=%
$env:PATH=$env:OLDPATH
$env:OLDPATH=

DIGITS起動

新しくPowerShellを開き直し、git cloneした中に入ってください。

cd digits
ls # .githubに続いてdigitsフォルダが見えるはず…
# digitsの学習結果等保存するフォルダ
mkdir c:\digits\jobs
# DIGITSのために作ったpython仮想環境の有効化
conda activate DIGITS
$env:DIGITS_JOBS_DIR=c:\digits\jobs
# digits起動
python -m digits

ブラウザでhttp://localhost:5000/へアクセスするとDIGITSのホーム画面に。

注意事項

本家BVLCのWindowsブランチが賞味期限切れとなり、プリビルドのバイナリを入手できなくなっています。

今後入手が難しいことが出てきたらBVLC/caffe at windowsの説明の通り本家版Windowsブランチを自分でビルドするか、NVCaffe 0.15をWindowsでビルド(GPU対応) - Qiitaを参照してください。

参考

NVIDIA DEEP LEARNING INSTITUTE TRAINING CATALOG
DLIのコースカタログです。入門者向けはDIGITSを利用したものが多めです。
User Guide — virtualenv 16.0.0 documentation
PowerShellのスクリプト実行ポリシーについて
Managing environments — Conda documentation
activate時にスクリプトを実行する方法

イノベーション経営ブームと現代の古典「イノベーションのジレンマ」について

イノベーションのジレンマ

技術系の企業では、経営者から新米技術者まで部署をまたいで親しまれる名著。

毎日まじめに正しく働いているのに気がついたら自分の働いている会社が新興企業の勢いを目の前に力を失ってしまうという怪談めいた話に背筋を凍らせ、時には、夏休みの怪談・恐怖体験披露のように、会議で話題になり、ひんやりとした気持ちになるも日常に戻るとすっかり忘れられてしまう存在です。

ところが、テスラ、UberやAirbnbの成功で、日本経済を支えているとも言える自動車分野が脅かされ始めた(と感じらる)昨今、日本政府をはじめ尻に火がついたようにコネクテッド・インダストリーズやインダストリー4.0を掲げて政策を手探りしはじめ、 日本企業も「オープンイノベーション」が答えとばかりにシリコンバレー周りに熱を出している様子も報道されています。

これは、日本企業だけでなく、ダイナミックさで知られる米国企業でも同じようで、経営管理的なマネジメントでガチガチに固めたポートフォリオ経営の企業でも

と、経営をコンパクトに回せるように肉体改造し、「破壊的イノベーション」の創出にも手を出し始めています。

破壊的イノベーションの5原則

集合・位相・圏 数学の言葉への最短コース
イノベーションのジレンマ
  • 作者: クレイトン・クリステンセン
  • 出版社/メーカー: 翔泳社
  • 発売日: 2001/7/1

本書を読み直してみると、破壊的イノベーションを起こすための処方箋として示唆が多く、デザインシンキングからオープンイノベーションまで、同じエコシステムの中で育まれていることが強く意識されます。

  1. 破壊的イノベーション技術の商品化は顧客担当部門に推進権限を与える

    権限の与え方として、下記が挙げられていますが、「新しいもの」は説得が難しいため「組織の分離」が推奨されています。

    1. 会社を説得する
    2. 組織を独立させる
  2. マーケットのサイズに合わせた小さな組織でオペレーションする
  3. 試行錯誤を前提に「調査・計画・実行」にとらわれない動きで新しいマーケットを見つける
  4. 新規事業部門は既存部門を利用しつつ評価指標を切り離す
    • 利用する:リソース類(資金や人、技術)
    • 切り離す:コスト管理、業績評価基準
  5. 新しいマーケットを探すこと

    新しい技術について、"ありのままを評価"してくれる市場を見つけることに力を入れ、既存事業"にも"受け入れられるための技術的ブレークスルーを夢見た磨きをかけないこと。

この本が書かれたのは、もう20年近く前になる2001年です。現在では、本質的な価値はそのままに、どうやって、この"処方箋"を実行に移していくかに磨きがかけられて来ているように思います。

トヨタがTRIをシリコンバレーに設置したり、AI部門を独立で立ち上げたり、「オープンイノベーション提携」を発表するなかで、なかには処方箋をはみ出した内容も見かけます。 本書の処方箋は必要条件ではありませんが、今後10年でどの施策が効果的だったのか見えてくるのではないでしょうか。

終わりに

本当は下記の関係を整理しようと思って書き始めましたが、おさらいのために読んだ「イノベーションのジレンマ」の偉大さに感じ入るところになりました。舶来もののビジネス書は概念が色々つながってて、一世一代ものの和書とは層の厚みが違うなと感じます。

以下は全て同じ文化圏で一枚岩でつながっています。

  • デザインシンキング
  • リーンスタートアップ
  • Business Model Canvas
  • Value Proposition Design
  • リーン顧客
  • デジタルトランスフォーメーション
  • オープンイノベーション
  • デジタルツイン
  • ビジネスサイクル
  • 組織のフラット化
  • Teal組織

Proxy環境下でUbuntu 16.04LTS日本語版デスクトップ環境を構築

前提環境

Linux系環境が手に入れられました。ハードウェアが準備できて、環境の準備です。

環境準備用PC

  • OS: Windows系
  • インストーラ作成用USBメモリ: 2GB
  • Proxy環境の中にいる

Linux環境構築ハードウェア

  • 詳細はもにょもにょ
  • NVIDIA Titan Xp搭載
  • インストール時はネットワークつながない

UbuntuのインストールUSB作成

ISOイメージの入手

Ubuntu 16.04LTS日本語版を選びました。Ubuntu 16.04 LTS 日本語からダウンロードして、インストールUSBを作ります。

インストールUSBの作成

USBスティックは2GBあれば十分です。Keledgebさんに手順が詳しく書いてあります。

Rufus その1 - WindowsでライブUSBメモリーを作成するアプリ・UbuntuのライブUSBメモリーを作成する - kledgeb

注意点

イメージモードは、ISOモードではなく、DDモードを。

RufusがSyslinux 6.03/20151222の入手に使っているリンクが死んでいたり(そもそもhttpで危ない?)、なんとかしたところでgithubでissueがでてたり、今ひとつ信用できません。 DDモードを使いましょう

OSインストール作業

いろんなインストール方法がありますが、解説はスキップ。エッセンスだけ。

  1. インストール言語:日本語を選択
  2. Ubuntuのインストール準備
    • Ubuntuのインストール中にアップデートをダウンロードする

      → インストール時ネットワークにつなげていないので実施しませんでした

    • グラフィックス、Wi-Fi機器、Flash、MP3やその他のメディアに必要なサードパーティーソフトウェアをインストールする

      → チェックした

  3. インストールの種類
    • ディスクを削除してUbuntuをインストール
    • 新しいUbuntuのインストールにLVMを使用する

あとは適当に。

日本語フォルダ名の英語化

起動して最初に日本語フォルダを廃絶します。Ctrl+Alt+Tを押してターミナルを起動。下記コマンドでフォルダ名を英語名に書き換えて再起動。

LANG=C xdg-usesr-dirs-gtk-update
reboot

参考:Ubuntuでホームディレクトリの中身を英語にする - Qiita

Proxyの設定

システム設定からプロキシ設定しておきます。

Ubuntu プロキシ設定方法(インターネット) - Qiita

設定後LANケーブル接続。

ifconfig
ping www.google.co.jp

インターネッツにつながってたら、それなりの反応をするはず。

システムのアップデート

ネットワークに接続できるようになったところで、色々なパッケージのアップデート。

sudo apt update
sudo apt upgrade
reboot

セキュリティソフト(ウィルス対策ソフト)の導入

Proxy環境といえば学校や会社が定番ですが、セキュリティ規定で何らかのウィルス対策ソフトを入れないとならない方は多いでしょう。軽く探してみましたが、以下2つの記事が詳しそうです。 しかし、Linux機は、セキュリティソフトいらないと断言している方は、なんなんだろうな。

主に個人利用のウィルス対策ソフトの比較評価

こちらのページが鬼気迫る勢いでリストアップしていました

Linux用ウイルス対策ソフトまとめ

評価対象ソフト

  • ClamAV
  • ESET NOD32 for Linux Desktop
  • Avast
  • AVGli
  • Comodo
  • Avira
  • Bitdefender
  • Panda
  • F-PROT
  • Dr.Web

法人利用も含めたウィルス対策ソフトの紹介

ノートンさん競合ソフトも紹介していて良いんですか(ありがとうございます)

Linuxウイルス対策まとめ|予防策からセキュリティソフトまで

リスト掲載ソフト

  • Symantec Endpoint Protection(シマンテック)
  • ServerProtect for Linux(トレンドマイクロ)
  • McAfee Complete Endpoint Protection – Business(マカフィー)
  • エフセキュア Linux セキュリティ(エフセキュア)
  • Kaspersky Endpoint Security for Linux(カスペルスキー)

ESETのNOD32も法人対応ありますがリストからは抜けています。

NVIDIA製ドライバのインストール

デフォルトでは、Nouveauがドライバとして設定されていると思いますが、新しいNVIDIAのグラボですと、 対応している解像度が限定的だったり、 Ctrl+Alt+F1の仮想コンソールが上手く動作しなかったりすると思います。

GPGPUで計算量だけ必要な場合は、UEFIで設定してマザーボード・オンボードのGPUを使ったりしましょう。

詳しい手順は、探せばいろいろ

参考:

Docker環境の構築

で、最後にNVIDIA-Docker環境の構築です。

Dockerインストール

Installation (version 2.0) · NVIDIA/nvidia-docker Wiki · GitHub

Proxy設定(ホスト側)

Control Docker with systemd | Docker Documentation

sudo mkdir -p /etc/systemd/system/docker.service.d
cd /etc/systemd/system/docker.service.d
sudo vi http-proxy.conf
sudo vi https-proxy.conf
sudo systemctl daemon-reload
sudo systemctl restart docker
systemctl show --property=Environment docker

http-proxy.confの中身

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"

https-proxy.confの中身

[Service]
Environment="HTTPS_PROXY=http://proxy.example.com:80/"

Proxy設定(Dockerの内側)

DNSの設定

HttpProxyの場合、ドメイン変換が必要なので内部ネットワーク向けのDNSを取得します。

nmcli dev show | grep DNS

ここで得られたDNSを/etc/docker/daemon.jsonに追記。

{
  "dns":["XXX.XXX.XXX.XXX"]
}

参考:Fix Docker's networking DNS config | Notes on development | Robin

Proxyの設定

~/.docker/config.jsonを変更する(なければ作成)

{
  "proxies":
  {
    "default":
    {
      "httpProxy": "http://proxy.example.com:80/",
      "noProxy": "localhost"
    }
  }
}

改めてdockerを再起動して終わり。

sudo systemctl restart docker

参考:Configure Docker to use a proxy server | Docker Documentation

たたかいはこれから

ということでがんばりましょう。

日経平均オプション理論価格等情報のPandas読み込み~整形まで

金融工学のお勉強に公開データを使ってブラックショールズ方程式のお勉強。お勉強開始にあたってデータ準備まで。使っている技術の詳細は以下の本で。

 

リファレンス環境

  • Windows 10
  • Python 3.6.0
  • Anaconda 4.3 - 5.0.1
  • Pandas 0.19.2

Jupyter起動~ライブラリ読み込み

%matplotlib inline
# %matplotlib notebook
import pandas as pd
import requests, zipfile, io, dateutil
from datetime import datetime

便利関数定義

あとでcsv読み込み時に使う便利関数

def strip(text):
    try:
        return text.strip()
    except AttributeError:
        return text

データ準備

オプション理論価格等情報 | 日本取引所グループから入手した2017年2月10日の終値データ。 色々入っているけど2017年3月限の原資産:日経225のオプション取引データだけ使う。

ファイル取得~展開

2018年1月12日のデータを取得して、csvを展開します。

# 取得する日付
DL_Date = "20180112"
# 対象とする限月
MatMon = "201802"

# オプション理論価格等情報
#    利用ガイド:http://www.jpx.co.jp/markets/derivatives/option-price/01.html
#    一覧: http://www.jpx.co.jp/markets/derivatives/option-price/index.html
url = "http://www.jpx.co.jp/markets/derivatives/option-price/data/%s.zip"
file = "ose%stp"%DL_Date

r = requests.get(url%file)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()

Pandasへデータ読み込み

  1. データ本体と別に配布されているヘッダー情報をもとに自分でヘッダーを起こして名前をつける
  2. 読み込み中にテキストデータの空白をトリムする
# ヘッダー名 (変数名順)
#     商品コード, 商品タイプ, 限月, 権利行使価格, 予備
#     プットオプション: 銘柄コード, 終値, 予備, 理論価格, ボラティリティ
#     コールオプション: 銘柄コード, 終値, 予備, 理論価格, ボラティリティ
#     原資産終値, 基準ボラティリティ
colName = ("CODE","TYPE","MATURITY","STRIKE", "RSV", 
          "PUT_CODE", "PUT_PRICE", "PUT_RSV", "PUT_TPRICE", "PUT_VOLATILITY",
          "CALL_CODE","CALL_PRICE","CALL_RSV","CALL_TPRICE","CALL_VOLATILITY",
          "F225_PRICE", "Base_VOL")

df_raw = pd.read_csv(file+".csv", names=colName,
                converters = {'CODE' : strip,
                              'TYPE' : strip})
df_raw.head()

読み込んだデータの確認。

CODE TYPE MATURITY STRIKE RSV PUT_CODE PUT_PRICE PUT_RSV PUT_TPRICE PUT_VOLATILITY CALL_CODE CALL_PRICE CALL_RSV CALL_TPRICE CALL_VOLATILITY F225_PRICE Base_VOL
0 NK225E OOP 201703 11000.0 182031018 0.0 0.0 0.94 0.674892 192031018 8350.0 0.0 8372.22 0.792450 19378.93 0.1717
1 NK225E OOP 201703 11250.0 182031218 0.0 0.0 0.99 0.652465 192031218 0.0 0.0 8122.22 0.763183 19378.93 0.1717
2 NK225E OOP 201703 11500.0 182031518 0.0 0.0 1.03 0.627990 192031518 7850.0 0.0 7872.21 0.734523 19378.93 0.1717
3 NK225E OOP 201703 11750.0 182031718 1.0 0.0 1.07 0.603704 192031718 0.0 0.0 7622.20 0.706439 19378.93 0.1717
4 NK225E OOP 201703 12000.0 182032018 0.0 0.0 1.10 0.579896 192032018 0.0 0.0 7372.20 0.678904 19378.93 0.1717

 

データ整形

2017年3月限の日経225オプションだけ抜き出し。ついでに要らない列を削除してスッキリ。

df_raw = df_raw.query("MATURITY == %s & CODE==\"NK225E\""%MatMon)\
    .drop(['RSV','PUT_RSV','CALL_RSV','PUT_CODE','CALL_CODE','CODE','TYPE','MATURITY'], 1)
  • PUTとCALLが分かれてしまっているので、データを正規化。
  • CALL列がTRUEのときCALLのデータ、FLASEのとき、PUTのデータとする。
  • 行使価格も14000円以上、22000円未満に絞る
df_p = df_raw[["STRIKE","PUT_PRICE","PUT_TPRICE", "PUT_VOLATILITY","F225_PRICE", "Base_VOL"]]\
    .rename(columns={'PUT_PRICE': 'OP_PRICE', 'PUT_TPRICE':'OP_TPRICE', 'PUT_VOLATILITY':'OP_VOL'})
df_p['CALL'] = False
df_c = df_raw[["STRIKE","CALL_PRICE","CALL_TPRICE", "CALL_VOLATILITY","F225_PRICE", "Base_VOL"]]\
    .rename(columns={'CALL_PRICE': 'OP_PRICE', 'CALL_TPRICE':'OP_TPRICE', 'CALL_VOLATILITY':'OP_VOL'})
df_c['CALL'] = True
df = df_p.append(df_c).query("OP_PRICE > 1.0 & STRIKE < 25000 & STRIKE >= 22000")
del (df_p,df_c)
df.head()

CALLとPUTで共通の列名に変更。

STRIKE OP_PRICE OP_TPRICE OP_VOL F225_PRICE Base_VOL CALL
17 15250.0 2.0 1.53 0.318070 19378.93 0.1717 False
18 15500.0 2.0 2.00 0.306616 19378.93 0.1717 False
19 15750.0 3.0 2.56 0.294521 19378.93 0.1717 False
20 16000.0 3.0 3.00 0.279297 19378.93 0.1717 False
21 16250.0 5.0 5.00 0.275828 19378.93 0.1717 False

データの可視化

オプション価格情報をPUT, CALL別にプロット

cmap = plt.get_cmap('rainbow')
fig, ax = plt.subplots()

for i, (key, group) in enumerate(df.groupby(['CALL']), start=1):
    ax = group.plot(ax=ax, kind='Scatter', x='STRIKE', y='OP_PRICE',color=cmap(i / 2.0),label = "CALL" if key else "PUT")
    
plt.title(u"MAT %s / %s close"%(MatMon, DL_Date))
fig.patch.set_facecolor('white') 
plt.show()

理論価格とか基準ボラティリティって何だろうね。

Python環境でVisual StudioのCコンパイラのエラーに困ったら…

Windows環境でPythonを頑張る皆さんお元気ですか?MinGWのGCCを使わずに努力されている勇者もいるかもしれません。そんな同志のための対策メモ書きです。

想定される場面

  • Visual Studio Build Tool環境で“rc.exe が見つかりません”というエラーが出る
  • CythonでVCコンパイラがエラーをはく
  • SwigでVCコンパイラが文句を言う
  • Jupyterノートブックで%%Cythonマジックが上手く機能しない
  • Chainerなどのインストール時にVisual Studioがイヤイヤ期
  • VCコンパイラがcrtなんやらdllが見つからないとか反抗期

リファレンス環境

  • Windows > 7
  • Python > 3.6.0
  • Anaconda > 5.0
  • Visual Studio 2019 Build Tools
  • Visual Studio 2017 Build Tools
  • Visual Studio 2015 Build Tools(2017と両方入っています)

 

 

vswhereのインストール

Visual Studio 2017以降のインストールパスを探し当てるのが中々面倒なので、コマンドラインツールvswhereを使うmicrosoft/vswhereにはVisual Studio 2017以降標準でついてくるとか書いてあるけど、パスの設定や管理が面倒なので、 scoopを使ってインストールします。公式はchocolateyを使おうとか書いてある。

chocolateyではなく、scoopにした理由はWindows開発環境の構築をChocolateyからscoopに切り替えるに詳しい。

scoopの準備

パッケージ管理が楽になるので Scoopを使います。やさしいインストール手順はWindowsコマンドラインツールScoopのすすめ(基礎編) - Qiitaを参照していただいて、vswhereはextrasのbucketに入っているので、これを追加してからインストール。

scoop bucket add extras
scoop install vswhere

対策

vswhereを使う場合

vswhereなどでvcvarsallのパスを特定し、これを呼び出すバッチを実行する

@setlocal EnableDelayedExpansion
@setlocal ENABLEEXTENSIONS
@echo off

REM 使いたいVisual Studioのバージョンを指定
REM Visual Studio 2017ならば15
REM Visual Studio 2015ならば14
REM Visual Studio 2013ならば12
REM Visual Studio 2011以下は別途改造必要
set MSVC_VERSION=15

REM 環境設定とvcvarsall.batのパス取得
if %MSVC_VERSION% GEQ 15 (
    for /f "usebackq tokens=*" %%i in (`vswhere -latest -products * -property installationPath`) do (
      set batch_file=%%i\VC\Auxiliary\Build\vcvarsall.bat
    )
) else (
    set batch_file=!VS%MSVC_VERSION%0COMNTOOLS!..\..\VC\vcvarsall.bat
)
REM vcvarsall.bat実行
@echo on
call "%batch_file%" %processor_architecture%
REM 以下に実行したいコマンドを追加
REM Swigやjupyter notebook, cythonなど…

vswhereを使わない方法

cmd/poweshell

vswhereを利用できない場合、レジストリに登録されているパスを使う。vswhereを使っている行を書き換えてください。

REM Visual Studio 2017のインストール取得用のキー
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7"
set VALUE_NAME=15.0

REM 環境設定とvcvarsall.batのパス取得
if "%MSVC_VERSION%"=="15" (
    for /F "usebackq tokens=1,2,*" %%A in (`REG QUERY %KEY_NAME% /v %VALUE_NAME%`) do (
        set batch_file=%%CVC\Auxiliary\Build\vcvarsall.bat
    )
)

Jupyter Notebookの場合

さきのコマンドを実行してからJupter notebook!

これで、cythonマジックは機能するようになりますが、distutilsが基本的にVS2015までしか対応していないようなので、 VS2017の設定でvcvarsall.batを実行しても、VS2015でビルドがされます。 リンカなどは2017のライブラリなどを参照している可能性がありますが、不思議なことにエラーが出ません。

このバッチをmyjup.cmdなどの名前でshift-JISで作業フォルダ以下に保存して使っています。

@setlocal EnableDelayedExpansion
@setlocal ENABLEEXTENSIONS
@echo off

REM 使いたいVisual Studioのバージョンを指定
REM Visual Studio 2017ならば15
REM Visual Studio 2015ならば14
REM Visual Studio 2013ならば12
REM Visual Studio 2011以下は別途改造必要
set MSVC_VERSION=15

REM Visual Studio 2017のインストール取得用のキー
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7"
set VALUE_NAME=15.0

REM 環境設定とvcvarsall.batのパス取得
if "%MSVC_VERSION%"=="15" (
    for /F "usebackq tokens=1,2,*" %%A in (`REG QUERY %KEY_NAME% /v %VALUE_NAME%`) do (
        set batch_file=%%CVC\Auxiliary\Build\vcvarsall.bat
    )
) else (
    set batch_file=!VS%MSVC_VERSION%0COMNTOOLS!..\..\VC\vcvarsall.bat
)
REM vcvarsall.bat実行
@echo on
call "%batch_file%" %processor_architecture%
jupyter notebook

 

参考