Windows Server 2019にPython環境を構築

タイトル通り，Windows Server 2019にPython環境を構築した際の備忘録です．
[Windows Server 2019でWSLやHyper-V上のUbuntu18.04にCUDA環境を構築しようとして断念](https://qiita.com/fararrow/items/5f9eb1e4386707c11b3c)
の，ベースとなるWindows Server部分です．


# Windows Server 2019 (OS)
OSのセットアップ自体は特記事項なし，適宜ユーザを追加したり権限設定したりします．
ただし，
[Windows Server 2019でHyper-V上にUbuntu18.04をインストール](https://qiita.com/fararrow/items/0bdc72ac4f80b4cb35c0)
のBIOSの設定はインストール開始前にやっておきべき．
あと，Windows 10の延長として扱うので「デスクトップ エクスペリエンス」を選択してインストールしました．

CAL(Client Access License)とは別にRDS CAL(Remote Desktop Service CAL)なるものが存在する事をセットアップ中に知った…(´・ω・｀)

ちなみに2016まではEssentialsしか触ったことがなかったのですが，2019からは色んな機能が消え去ったようなのでStandardを選択．

なお，以降Win10でも全く同じ手順で構築可．
というかWindows Server 2019用なんて特異なソフトやライブラリがほとんど存在しないので．
基本的にWindows 10用のものは何でも動くと思われる．
2008や2016ではBluetooth関連を使おうとすると苦労した記憶が…2019はどうなんでしょう．
(今回は要りませんが)

# CUDA関連
これは全体で使います．
(普通に作業していればAdministratorでやっていると思いますが)

## CUDA10.1
NVIDIAの
https://developer.nvidia.com/cuda-downloads
からWindows 10用を落としてインストール．
2019年6月半ば時点では「cuda_10.1.168_425.25_win10.exe」が最新．
一応Platform選択過程でVersionに10とServer2019がありますが，どちらもこのファイル名で，
<details><summary>ハッシュ値も同一でした．</summary><div>

```powershell
> fciv C:\CheckCUDA\ -r -both
//
// File Checksum Integrity Verifier version 2.05.
//
Start Time: 06/半ば/2019 at 時h分'秒'

                MD5                             SHA-1
-------------------------------------------------------------------------
d4b3cfd0ef47573350840dd31cb399ae 7af4cb29883b9de09e7ece934c5bf9bdbb9c39ad c:\checkcuda\10\cuda_10.1.168_425.25_win10.exe
d4b3cfd0ef47573350840dd31cb399ae 7af4cb29883b9de09e7ece934c5bf9bdbb9c39ad c:\checkcuda\Server2019\cuda_10.1.168_425.25_win10.exe

End Time..: 06/半ば/2019 at 時h分'秒'


        Processed 3 directories
        Processed 3 files
Errors have been reported to fciv.err
>
> certutil -hashfile C:\CheckCUDA\10\cuda_10.1.168_425.25_win10.exe SHA256
SHA256 ハッシュ (対象 C:\CheckCUDA\10\cuda_10.1.168_425.25_win10.exe):
52450b81a699cb75086e9d3d62abb2a33f823fcf5395444e57ebb5864cc2fd51
CertUtil: -hashfile コマンドは正常に完了しました。
>
> certutil -hashfile C:\CheckCUDA\Server2019\cuda_10.1.168_425.25_win10.exe SHA256
SHA256 ハッシュ (対象 C:\CheckCUDA\Server2019\cuda_10.1.168_425.25_win10.exe):
52450b81a699cb75086e9d3d62abb2a33f823fcf5395444e57ebb5864cc2fd51
CertUtil: -hashfile コマンドは正常に完了しました。
```
</div></details>


## cuDNN
NVIDIAの
https://developer.nvidia.com/cudnn
から「for CUDA 10.1」に対応するリスト内でWindows 10用を落としてインストール．
展開してインストールした[CUDA](#cuda101)のディレクトリへコピーするだけ．
2019年6月半ば時点では「cuDNN v7.6.0 (May 20, 2019)」の「cudnn-10.1-windows10-x64-v7.6.0.64.zip」が最新．

# Python関連
Windowsの場合環境分けが面倒なので，使いたいユーザがそれぞれJust Meで
C:\Users\\(user_name)\Anaconda3
に構築．

## Anaconda3
https://www.anaconda.com/
のDownloadから「for Windows Installer」を落としてインストール．
上述の通りJust Meで．
2019年6月半ば時点では「2019.03」な「Anaconda3-2019.03-Windows-x86_64.exe」が最新．

## CuPy, Chainer
Anaconda Powershell PromptもしくはAnaconda Promptから

```powershell
> pip install cupy-cuda101
> pip install chainer
```

でOK．
condaで全て整えるのが楽という噂もありましたが，手元ではうまくいかない上にそもそも古いのしか入らない．
しかし自前コンパイルは面倒，ということでpipで．
（Anaconda的にはアレなので，本当はconda createで環境を限定してやるべき．今回はそもそもこれらを使わない環境を想定していないのでこんな入れ方です．）

で，

```powershell
> python -c 'import chainer; chainer.print_runtime_info()'
```

して

```powershell
Platform: Windows-10-10.0.17763-SP0
Chainer: 6.0.0
NumPy: 1.16.2
CuPy:
  CuPy Version          : 6.0.0
  CUDA Root             : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1
  CUDA Build Version    : 10010
  CUDA Driver Version   : 10020
  CUDA Runtime Version  : 10010
  cuDNN Build Version   : 7500
  cuDNN Version         : 7500
  NCCL Build Version    : None
  NCCL Runtime Version  : None
iDeep: Not Available
```

こんな感じになればOK．
Platformの所は入れているのがWin10用だから当然こうなるんでしょう．
NCCLは分散学習するなら必要，iDeepは現状Windowsでは使えない．


ちなみにcondaで入れたりインストール順序がおかしかったりCUDAへのPATHが通っていないとcuDNNの所がNoneになって苦労しました．
(去年までは9系しか構築していなかったので10系に混乱しました．)