PCの初期設定(アプリとminiconda)

## 前回までのあらすじと今回の話

前回、PC購入までの経緯をいろいろと記述しました。
(前のPCからzenbook14を買うまで)
今回は、macからwindowsに乗り換えたときにどんな初期設定をしていたかの話を、初めての記事投稿イベントに参加しつつお話させていただきます。

それはそうと、前の記事が96 viewとのことで、いろいろな方に見ていただいたようで、非常にうれしかったです。ありがとうございます。

今回は、初期設定でかなり悪戦苦闘したので、それについての話をしていきます。
悪戦苦闘した過程を記載するので、かなり長くなります。

## installしたアプリケーション
インストールしたアプリは以下の通りです
- python3.12 (MS store経由)
    &ensp;condaなどのベースに必要
- miniconda (ブラウザ(brave)経由)
    &ensp;前のパソコンでanacondaを使っていたが、
    &ensp;インストールされるパッケージが多すぎたのでこちらを選択
- vscode (ブラウザ(brave)経由)
    &ensp;前のパソコンで使い慣れていたためこちらをinstall
- PowerToys
    &ensp;キーボードショートカットの調整に必要 キーマッピングとショートカット改善
- MacType
    &ensp;フォントなどをmac風にするのに使用　なんかよくわからん
- intel oneAPI base toolkit(uninstall済み)
    &ensp;後ほど

(完全に余談ですが、steam経由でtrials risingというゲームをインストールしたんですが、Fail to start EAC(easy anti cheat)というポップアップが出て起動できない、というエラーに会いました
eacのサイトのsupportページがなぜかアクセスできなくなっていたりしました。
asusのAura？なるソフト(正確にはその中のlightning.exe)と競合するみたいな話があったので、もしかしたらそれ関連なのかと思いますが、原因特定はできませんでした。
情報お持ちの方がいたらご提供いただけると助かります。)

## minicondaの初期設定
１，インストーラーからインストール後、windowsボタンを押して出てくるおすすめから、"anaconda prompt"を右クリック、プロパティからショートカットのリンク先をコピーする
２，windows power shellを開いて、左上の下三角マークから設定を開き、左サイドバーの"新しいプロファイルを追加する"
３，コマンドラインの部分に、コピペ用pathを貼り付けて保存(名前とかはお好きに)
４、powershellの右上プラスボタンから、今作成したプロファイルを選択すれば、anaconda promptが起動する
(以下、anaconda promptへのショートカットと、コピペ用pathの見本)

```path
#anaconda promptのショートカットへのpath参考
"C:\Users\your-user-name\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Miniconda3 (64-bit)\Anaconda Prompt (miniconda3).lnk"

#コピペに使う、プロパティから取得できるpath参考
%windir%\System32\cmd.exe "/K" C:\Users\your-user-name\miniconda3\Scripts\activate.bat C:\Users\your-user-name\miniconda3
```
# 一つ目のminiconda環境作り
一つ目のminiconda環境では、以下のコードを実行した
```conda command(py312)
#condaの仮想環境を作成(pythonのバージョンは3.12)
conda create -n py312 python=3.12

#使うライブラリをインストール(ipykernelはvscodeのipynb実行に必要)
conda install numpy scipy scikit-learn ipython pandas ipykernel matplotlib
```

# vscodeの初期設定
vscodeでは、extension(ctrl+Shift+x)から以下をインストール
- python
- jupyter
- ~~ipykernel(なぜか複数あるので注意)~~->condaでinstall

condaの環境をvscodeに認識させるため、以下を実施
- file > preferences > settingsを起動し、searchにcondaと入力
- python conda pathの部分に、先ほどコピペしたanaconda promptのプロパティリンクをコピペする<br>

また、vscodeのterminalでもconda環境を認識させるため以下を実施
- configure terminal settings > External: Windows Execを開く
- 開いたとこに、さっきのanaconda promptのプロパティリンクをコピペ<br>

(この後仮想環境が認識されないなあと思っていたが、jupyterのチュートリアルを見た段階で突然認識した。再起動が必要だったと思われる。)

以上で、anacondaと関連するvscode設定は完了した。

## PowerToys
Microsoft作成のなんかwindowsに入れようとして入らなかった機能の詰め合わせみたいなやつ
便利機能として、プレビューやキーボードの再マップなどがある。
macからwindowsに変えた当初、ショートカットキーが違いすぎて違和感がすさまじかったが、それを解決するために採用した。

まず、キーボード設定をこのサイト([Link](https://future-architect.github.io/articles/20230216a/))をベースにして、microsoft IMEから、キーテンプレートをmicrosoft IMEにして、無変換/変換キーをそれぞれ、IME-オフ/オンに変換した。これにより、macの英語/かなをワンボタンで切り替えるのを再現できた。

その後、powertoyのkeyboard managerで、
¥ → Shiht+¥
を設定し、ショートカットでは
ctrl+W -> alt+f4
を設定した。これによって、ブラウザなどのタブ閉じショートカット操作をmacと同じにすることが出来た。

ここからは、いろいろと挑戦して苦戦した記録を残す。

## 悪戦苦闘1 ~numpy編~
numpyは内部で別の計算ライブラリ？を使っているバージョンがあるらしく、pip経由とconda経由だと入るものが異なり、conda経由のほうが早い、という話を見つけた
いろいろ調べていくと、以下のものが存在しそうだと分かった。

- condaでinstallしたやつ(MKLベース)
- pipでinstallしたやつ(OPENBLASベース)
- condaのintel channelからinstallしたやつ
    &emsp;intelが最適化したやつらしい([Link](https://www.intel.com/content/www/us/en/developer/tools/oneapi/distribution-for-python.html))処理が早そう

numpyは、show_config()でいろいろな情報が見れるので、conda経由のものとintel最適化について確認してみた(長いので折り畳み)

<details><summary>conda numpyのconfig</summary>

```
#conda install numpyしたもの(ver1.26.4)
>>np.show_config()
{
  "Compilers": {
    "c": {
      "name": "msvc",
      "linker": "link",
      "version": "19.29.30154",
      "commands": "cl.exe"
    },
    "cython": {
      "name": "cython",
      "linker": "cython",
      "version": "3.0.8",
      "commands": "cython"
    },
    "c++": {
      "name": "msvc",
      "linker": "link",
      "version": "19.29.30154",
      "commands": "cl.exe"
    }
  },
  "Machine Information": {
    "host": {
      "cpu": "x86_64",
      "family": "x86_64",
      "endian": "little",
      "system": "windows"
    },
    "build": {
      "cpu": "x86_64",
      "family": "x86_64",
      "endian": "little",
      "system": "windows"
    }
  },
  "Build Dependencies": {
    "blas": {
      "name": "mkl-sdl",
      "found": true,
      "version": "2023.1",
      "detection method": "pkgconfig",
      "include directory": "C:/Users/your-user/miniconda3/envs/py312/Library/include",
      "lib directory": "C:/Users/your-user/miniconda3/envs/py312/Library/lib",
      "openblas configuration": "unknown",
    },
  },
  "Python Information": {
    "version": "3.12"
  },
  "SIMD Extensions": {
    "baseline": [
      "SSE",
      "SSE2",
      "SSE3"
    ],
    "found": [
      "SSSE3",
      "SSE41",
      "POPCNT",
      "SSE42",
      "AVX",
      "F16C",
      "FMA3",
      "AVX2"
    ],
    "not found": [
      "AVX512F",
      "AVX512CD",
      "AVX512_SKX",
      "AVX512_CLX",
      "AVX512_CNL",
      "AVX512_ICL"
    ]
  }
}

```
</details>

<details><summary>intel numpyのconfig</summary>

```
#conda install -c intel numpyしたもの(ver1.26.4)
>>np.show_config()
blas_armpl_info:
  NOT AVAILABLE
blas_mkl_info:
    libraries = ['mkl_rt']
    library_dirs = ['C:/Users/your-user/miniconda3/envs/intel\\Library\\lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['C:/Users/your-user/miniconda3/envs/intel\\Library\\include']
blas_opt_info:
    libraries = ['mkl_rt']
    library_dirs = ['C:/Users/your-user/miniconda3/envs/intel\\Library\\lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['C:/Users/your-user/miniconda3/envs/intel\\Library\\include']
lapack_armpl_info:
  NOT AVAILABLE
lapack_mkl_info:
    libraries = ['mkl_rt']
    library_dirs = ['C:/Users/your-user/miniconda3/envs/intel\\Library\\lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['C:/Users/your-user/miniconda3/envs/intel\\Library\\include']
lapack_opt_info:
    libraries = ['mkl_rt']
    library_dirs = ['C:/Users/your-user/miniconda3/envs/intel\\Library\\lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['C:/Users/your-user/miniconda3/envs/intel\\Library\\include']
Supported SIMD extensions in this NumPy install:
    baseline = 
    found = 
    not found =  

```

</details>

ざっと見た範囲では、mkl-sdlに依存してるか、mkl-rtに依存してるか、の違いと、拡張命令セットを認識してるかどうか、という部分に違いがありそう
加えて、intel版はnp.__mkl_version__なるものを認識するが、そのバージョンが2024とかなので、そこの分早くなってたりするんじゃないかな、という感じ
```
print(np.__mkl_version__)
>>2024.0.1
```

MKL版をビルドするとかあっていろいろ苦戦していたが、普通にconda経由でやるのが一番楽でよさげ！パッケージ依存問題もなさげなので！

まとめると、普通のを入れるのが一番楽
早さを求めたいなら -c intelでnumpy、scipy、scikit-learnを入れるがいいかも(ただし後述の依存関係エラーあり)

## 悪戦苦闘2 ~intel早いらしい拡張パック~

悪戦苦闘1で得た知識から、intel最適化ライブラリの存在を知ったので、どうせならもっと早くやるにはどうしたらいいかと思っていろいろ試していた。
ここでは、
- scikit-learn extension(成功)
- pytorch extension(失敗)
- data parallel extension for numpy(失敗)

の話をしたいと思います。ほぼ全部失敗してるのであしからず

# scikit-learn extension
scikit-learnの拡張ライブラリである。
```
from sklearnex import patch_sklearn
patch_sklearn()
```
をsklearnのimport前に入れることで速度が増すらしい。([Link](https://intel.github.io/scikit-learn-intelex/latest/quick-start.html))
'''
install場合は、
```
conda install -c intel scikit-learn-intelex
```
でOK
※installすると、pythonが3.10くらいまで戻るので注意


# pytorch extension

モチベ：内臓GPUに計算をさせたい。
前提：arc driverのinstallとoneAPIのinstallが必要([Link](
https://intel.github.io/intel-extension-for-pytorch/index.html#installation?platform=gpu&version=v2.1.30%2bxpu&os=windows&package=pip))
ただし、その前にvisual studio 2022のinstallと、そこでのパソコンでの開発用C++のinstallが必要

その後pytorch extensionを入れようとしていろいろ苦戦した。([Link](https://intel.github.io/intel-extension-for-pytorch/index.html#installation?platform=gpu&version=v2.1.30%2bxpu&os=windows&package=pip))


次のコードによって、パッケージのインストールを行うことが出来る。
```
conda install pkg-config libuv
python -m pip install torch==2.1.0.post2 torchvision==0.16.0.post2 torchaudio==2.1.0.post2 intel-extension-for-pytorch==2.1.30 --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/
```
installした後、callを使って、pathを通す必要がある。
```

#その後このコマンドを入れた
#install後、dpcppとmklのrootpath/env/vars.batをcallする
call {DPCPPROOT}\env\vars.bat
call {MKLROOT}\env\vars.bat

#callするpathについては、以下の通り

#dpcppのcall
call "C:\Program Files (x86)\Intel\oneAPI\dpcpp-ct\2024.1\env\vars.bat" #dpcppのpath通し

#mklのcall(候補4つ)
call "C:\Program Files (x86)\Intel\oneAPI\mkl\2024.1\env\vars.bat" #

call "C:\Program Files (x86)\Intel\oneAPI\compiler\2024.1\env\vars.bat"

call "C:\Program Files (x86)\Intel\oneAPI\dpcpp-ct\2024.1\env\vars.bat"

call "C:\Program Files (x86)\Intel\oneAPI\toolkit_linking_tool\.envs\2024.1\basekit\compiler\env\vars.bat"

#callをすべてした後、次のコードが問題なく走ればOK
python -c "import torch; import intel_extension_for_pytorch as ipex; print(torch.__version__); print(ipex.__version__); [print(f'[{i}]: {torch.xpu.get_device_properties(i)}') for i in range(torch.xpu.device_count())];"

#errorが出たら、var.batファイルを再度探索
```

という流れでinstallをしたが、最終的にextensionを認識してくれなかったためにuninstallした。

反省点
おそらく、無理やりwindowsでやろうとしたのが間違い
今だったらWSL2経由でインストールする方法をなんとなく把握してるので、そっちからやればよかった。
やる場合は、そもそも環境構築とoneAPIとかのinstallからLinuxでやるべき
(と思ったが、installしてたのがGPU対応版であり、見る限りArc Aシリーズのみの対応だったらしい。)

# data parallel extension for numpy

```
conda install dpnp -c intel -c conda-forge # data parallel extension for numpyのinstall
```

installは上記のコマンドで行えた。
しかし、適当な行列計算をさせたところ、画面が一瞬暗転して落ちる、というのが起こるようになったので、uninstallした。

反省点
不明　dpnpのgithubのページにベンチマークが乗っているが、基本ubuntuのものしかないので、wsl2経由でやれば動きそう



## 悪戦苦闘3 ~intel python3_full環境~
intel最適化ライブラリだけに囲まれた環境で作業したい場合、あらかじめまとまったパッケージ？のようなものがあるので、それを入れるのが楽そう
ということで、それをもとに環境構築を以下のコードで行った

```
conda create -n intel#仮想環境だけ構築
conda install intel::intelpython3_full#pythonは3.10
conda install ipython ipykernel matplotlib
conda install pandas -c intel
```

これによって、環境構築とついでにライブラリを入れた環境を作れた。
しかし、この状態でmatplotlibのimportがerrorを吐いた
```
#matplotlibでのimport error
DLL load failed while importing _imaging: 指定されたモジュールが見つかりません
```
このエラーは、matplotlibではなく、Pillowのバージョンによって起きているということが分かったので、Pillowを10.1.0にしたところ、pythonのバージョンが下がるということはありつつも、何とかerrorを解決することができた

```
conda install --channel conda-forge pillow=10.1.0

>>import PIL
>>PIL.__version__
'10.1.0'
```

以下、impoer errorからの試行錯誤
<details><summary>あがきのcondaいじり</summary>

```
conda update matplotlib 
conda install matplotlib -c intel
conda uninstall Pillow#matplotlibのuninstall
conda install Pillow -c intel
conda install matplotlib
#matplotlibだけimport errorを吐く　謎
conda install Pillow
conda update Pillow
conda update Pillow
conda install --channel conda-forge pillow=10.1.0
conda uninstall pillow
conda install Pillow=10.1.0
#pythonのバージョンが下がっただけで終わった
```
</details>

## まとめ
今回は、PC購入後から初期設定ということで、python関連の初期設定や操作性のための設定の話をし、そこからライブラリ関連での挑戦と失敗を記述した。
投稿がこんなに期間空くのは想定外でした！！！

ただ、intel最適化ライブラリの存在を知れたことは収穫だったなと思いました。
この記事がだれかの(未来の自分含め)役に立つといいですね！！

## 参考サイト
anacondaのpathを通す際に閲覧
https://qiita.com/harutine/items/39116f0abd2b0fbb9472