競プロ雑記帳

MSYS2上でVanilla Pythonが動かない

追記 (2021/05/07)

下記のことをしたらMSYS2上でsshが使えなくなりました。
おそらく、MSYSのsshではなくWindows標準のsshを使っていることが原因になっていそうです(MSYSのsshを明示的に指定したら上手くいったため)。
似たような不具合がかなりありそうなので、aliasを作るなどで解決できる場合はそうした方がよさそうです。


この前、MSYS2側にWindowsのPATHを渡す設定をしたので、Vanilla PythonをMSYS2上で動かそうと思ったら、MSYS2のPythonが動いてしまったのでそれを解決したときのメモ

※あまり詳しくないので、下記のようにする場合は自己責任でお願いします。

とりあえず

where python

をしてみると、4つくらい表示されて "C:\msys64..." から始まる python.exe が上にあったので優先順位を変更すれば治りそう。

自分の場合はPythonに限らず、Windows側のアプリケーションが優先されてほしいのでPATHの順番を変更することにした。

/etc/profile を変更すればよさそうなので、ファイルを見る。
それっぽい部分が49行目くらいにあるはずなのでこれのPATHの部分
を変える。

case "${MSYSTEM}" in
MINGW*|CLANG*|UCRT*)
  MINGW_MOUNT_POINT="${MINGW_PREFIX}"
  PATH="${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
  PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
  ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
  MANPATH="${MINGW_MOUNT_POINT}/local/man:${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
  ;;
*)
  PATH="${MSYS2_PATH}:/opt/bin${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
  PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/share/pkgconfig:/lib/pkgconfig"
esac

これを下記のように変更する。

case "${MSYSTEM}" in
MINGW*|CLANG*|UCRT*)
  MINGW_MOUNT_POINT="${MINGW_PREFIX}"
  PATH="${ORIGINAL_PATH:+${ORIGINAL_PATH}:}${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}"
  PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
  ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
  MANPATH="${MINGW_MOUNT_POINT}/local/man:${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
  ;;
*)
  PATH="${ORIGINAL_PATH:+${ORIGINAL_PATH}:}${MSYS2_PATH}:/opt/bin"
  PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/share/pkgconfig:/lib/pkgconfig"
esac

実際に変更した箇所は、「PATH="..."」とある部分。
一応二ヵ所あるので両方とも $ORIGINAL_PATH が先になるようにした。
ORIGINAL_PATH にWindowsのPathが入っているので、それを先に書くことで優先順位を上げた。

${ORIGINAL_PATH:+:${ORIGINAL_PATH}} は ORIGINAL_PATH に値が入っていれば :${ORIGINAL_PATH} を入れるという意味なのでコロンの位置を元とは変える必要がある。

変更した後、ターミナルを開いて再び

where python

とすると、Vanilla Pythonが上に来ている。

また

echo $PATH |  tr ':' '\n' #そのままだと見にくいので改行

とすると、Windows側のPathが上に来ていることが確かめられる。

余談
winpty python

としないと対話モードで実行できないので注意。
対話モードでなくとも print の出力がされない?
適当な場所に alias を追記しておくと便利。

MSYS2でLaTeXが動かせない

MSYS2を導入する前からTeX Liveを使っていて、コマンドプロンプト等からは動かせるのにMSYS2上やMinGW上で動かせなかったので、調べたところWindowsのPathがMSYS2等には渡されない設定になっているらしい。

環境変数に以下を追加すればよい。
変数 : MSYS2_PATH_TYPE
値 : inherit

msys2.iniやmingw64.iniを編集してもできるらしい(なぜか自分の環境ではできなかったけど)

VScodeでMSYS2のgitを使う

MSYS2だけでgit for windows使わなくてもいいかなと思って、git for windows消したらVSodeからgitが使えなくて困った話です。

解決策

github.com

脳死でこれをやってもうまくいかなくてなんでだろうなぁと思っていたらきちんとコメントアウトして書いてありました。
C:\msys64\usr\bin へのPathを通せばよいだけです。

windows10 + tensorflow 2.1 で学習がうまくいかない

タイトル通りです。

この前環境構築をしてからkerasを使ってGANを作っていたのですが、学習が全然進まないので loss を見てみると generator も discriminator も loss が 0 に近くなっており、状況としてはおかしいものになっていました。
そこで他の方のコードとデータセットをお借りして試してみたところそちらもうまくいかないのでいろいろ調べていると
https://github.com/tensorflow/tensorflow/issues/36072
ここや、ここの中で言及されているほかの issue を見ているとなんとなくそれっぽいので

import tensorflow as tf
tf.keras.layers.BatchNormalization._USE_V2_BEHAVIOR = False

と付け加えてみたところ借りたコードはうまく生成されました。

import tensorflow as tf
tf.compat.v1.disable_v2_behavior()

これにしてもよさそうです。まあ、tensorflow 2.1 を導入しなければいいだけなのですが...

もし、 _USE_V2_BEHAVIOR が何なのかを知っている方がいればコメントなどをいただけるとありがたいです。

windows10 で python 3.7 + tensorflow-gpu 2.1 の導入

前回の記事では Anaconda で導入しましたが、Anaconda を使っていると pip と conda の両方でうまく管理をしなくてはいけなくて結構な頻度で環境が壊れてしまうことがありました。なので今回は、vanilla python で導入したいと思います。
また、NVIDIA ドライバのインストールについては説明しません。事前にインストールしておいてください。

関連するもののアンインストール

CUDAやCuDNN、pythonのアンインストールをして、環境変数も関連するものは削除します。

python3.7のインストール

tensorflow 2.1 では今のところpython 3.7までにしか対応していないので今回は3.7.6をインストールします。
下記のサイトで Windows x86-64 executable installer をダウンロード、それを実行しインストールします。
インストールするときに Add python 3.7 to Path をチェックします。
インストールが終わると Disable path length limit とでるので特殊な事情がない限りはクリックをします。
www.python.org

CUDA10.1のインストール

下記のサイトに行き、 windowsx86_64 → 10 → exe (local) と選択し、CUDA 10.1 update2 をダウンロードします。
ダウンロードが終わったら実行し、カスタムインストールを選択します。
特に事情がなければ何も変えずにそのまま次へ進み、インストールを終わらせます。

developer.nvidia.com

CuDNN7.6のインストール

下記サイトに行き、CuDNN Download を選択し、ログインをして、Download CuDNN ~~~~ ,for CUDA 10.1(CuDNN 7.6と書いたが、CUDA 10.1に対応していればよい) を選択し、ダウンロードします。そして解凍し、cuda フォルダの中身(bin, include, lib, NVIDIA_SLA_cuDNN_Support.txt) をCUDA 10.1をインストールしたフォルダ(変更していなければ、 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1 ) にコピーする。
その後、システム環境変数に、
変数名: CUDNN_PATH
変数値: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1
と設定する。
developer.nvidia.com

その他の設定

コマンドプロンプト等で、
pip install -U pip
pip install -U setuptools
をする。

tensorflow-gpu のインストール

コマンドプロンプト等から
pip install -U tensorflow-gpu tensorflow_datasets
を実行する。バージョンを指定してインストールした方が良いかもしれない( -U オプションは外す)。
インストールが終わったら py list をして、インストールされたものの確認をしてください。
その後、 python で下記のコードを実行します。

from tensorflow.python.client import device_lib
device_lib.list_local_devices()

GPU が使われていることが確認できれば大丈夫です。
エラーが出る場合は不必要なタスクを終了してから実行するとできるかもしれません。もしくは再起動をすると良いかもしれません。
それでもできなければ、どこかで間違えたか、ファイルが壊れているなどが考えられます。

jupyter notebook でgpuを使用するときの注意

tensorflow-gpu を頑張って導入して動かしてたら Blas GEMM launch failed ってエラーが出た...

jupyter notebook を Quit とかせずに閉じると gpu のメモリが使われたままになることがあるらしい
きちんとQuitすれば問題ない
間違えてそのまま閉じちゃったときは 再起動とかタスクキルすれば大丈夫

別のファイルに移るときは実行中になっているものを止めて File -> Close and Halt をすれば問題ない
メモリが足りないのに並行して動かそうとしてもエラーは出ます

追記 (2020/01/29)

Close and Halt とかせずにタブ閉じちゃった場合はファイルとか選択する画面の Running ってところから Shutdown を選べば問題なさそう