Windows11 WSL2 Ubuntu Python
Cupy インストール動作確認
Cupy のインストールが完了しました。
引き続き cupy がうまくインストールされたか動作確認します。
Cupy 動作確認ファイルを作成します。
n×n の乱数配列を
numpy 配列
cupy 配列
でそれぞれ2つづつ作成し
numpy と cupy で内積(dot 積)
を行い計算時間を比較します。
この内容をまとめると以下のようになります。
# -*- coding: utf-8 -*- import cupy as cp import numpy as np import time n = 4 t1 = time.time() # n×n の乱数配列を作成 a = np.random.rand(n,n) b = np.random.rand(n,n) ab = np.dot(a,b) t2 = time.time() c = cp.random.rand(n,n) d = cp.random.rand(n,n) cd = cp.dot(c,d) t3 = time.time() print ('numpy:', t2-t1) print ('cupy :', t3-t2)
TeraPad 等で作成したら、ファイル名を cupy-test-1.py として保存します。
文字コ-ドは、UTF-8N
BOM なし
改行コ-ドは、LF
です。
保存先はホスト Wimdows OS の
Linux \Ubuntu-22.04 \\wsl.localhost フォルダ
Linux/Ubuntu-22.04/home/yama/public_html/cupy-test-1.py
としました。
Cupy インストール確認実行
yamada@yama:~$ conda activate
として conda 環境を有効にします。
cupy-test-1.py ファイルを実行します。
yamada@yama:~$ conda activate (base) yamada@yama:~$ python3 public_html/cupy-test-1.py numpy: 0.00731205940246582 cupy : 1.2549364566802979
エラーなく実行できましたが、処理時間は cupy の方が圧倒的に時間がかかっています。
そうなんです、n の値が小さいと、numpy の方がずっと処理が速いのです。
私の PC の場合、n = 5000 でやっと同じ処理時間になりました。
ちなみに n = 10000 にした時の結果を示します。
(base) yamada@yama:~$ python3 public_html/cupy-test-1.py numpy: 6.193216800689697 cupy : 0.9390401840209961
Cupy の問題点
大量のデータを扱うときは処理が速くなるのは素晴らしいのですが問題点もあります。
cupy で定義した配列は GPU 上にあるので、そのままだと他のライブラリで使えないことが多いです。
また、逆に numpy の配列を cupy の配列に変換して GPU 上で計算したいこともあります。
データのつくり書式は全く同じなのですが困ります。
cupy には numpy 配列と cupy 配列を相互に変換はする関数が用意されています。
numpy ⇒ cupy 配列へ変換: cupy.asarray
cupy ⇒ numpy 配列へ変換: cupy.asnumpy
また、numpy 配列への変換には python コマンド にある .get() も利用できます。
Cupy 問題点確認ファイル
Cupy 問題点確認ファイルを作成します。
cupy-test-1.py に追加します。
numpy で計算した内積結果 ab を cupy 配列へ変換します。
メインメモリ上のデータを GPU 上のメモリに移動するだけです。
ab_gpu = cp.asarray(ab)
次に
cupy で計算した内積結果 cd を numpy 配列へ変換します。
GPU メモリ上のデータをメインメモリに移動するだけです。
cd_np = cp.asnumpy(cd)
また、
cd_cpu = cd.get()
とすることもできます。
cd_np と cd_cpu は同じ内容で CPU のメインメモリ上にあります。
この内容をまとめると以下のようになります。
# -*- coding: utf-8 -*- import cupy as cp import numpy as np import time n = 4 # n=2000 では np が速い # 5000 では同じ t1 = time.time() # n×n の乱数配列を作成 a = np.random.rand(n,n) b = np.random.rand(n,n) ab = np.dot(a,b) t2 = time.time() c = cp.random.rand(n,n) d = cp.random.rand(n,n) cd = cp.dot(c,d) t3 = time.time() print ('numpy:', t2-t1) print ('cupy :', t3-t2) # np.ndarray から GPU 上のメモリにデータを移動する # numpy ⇒ cupy 配列へ変換 ab_gpu = cp.asarray(ab) print("ab_gpu") print(ab_gpu) # cupy ⇒ numpy 配列へ変換 ① cd_np = cp.asnumpy(cd) print("cd_np") print(cd_np) # ①と同じ、メインメモリ上にデータを移動する cd_cpu = cd.get() # cd_cpu は np.ndarray 型 print("cd_cpu") print(cd_cpu)
TeraPad 等で作成したら、ファイル名を cupy-test-2.py として保存します。
文字コ-ドは、UTF-8N
BOM なし
改行コ-ドは、LF
です。
保存先はホスト Wimdows OS の
Linux \Ubuntu-22.04 \\wsl.localhost フォルダ
Linux/Ubuntu-22.04/home/yama/public_html/cupy-test-2.py
としました。
Cupy 問題点確認ファイル実行
yamada@yama:~$ conda activate
として conda 環境を有効にします。
cupy-test-2.py ファイルを実行します。
yamada@yama:~$ conda activate (base) yamada@yama:~$ python3 public_html/cupy-test-2.py numpy: 0.007213115692138672 cupy : 1.268014907836914 ab_gpu [[1.34462076 1.06830897 0.51799402 0.76379886] [0.90680231 0.75106187 0.10271353 0.72441734] [1.25126913 1.15121991 0.58509331 0.71333019] [1.03388574 0.98335917 0.42868025 0.61246347]] cd_np [[2.07808233 1.3542982 0.68222058 1.19437862] [0.87541227 0.64668005 0.64324263 0.39902229] [1.30968612 0.81177681 0.94517202 0.2842247 ] [1.20244641 0.77456312 0.71527137 0.47463282]] cd_cpu [[2.07808233 1.3542982 0.68222058 1.19437862] [0.87541227 0.64668005 0.64324263 0.39902229] [1.30968612 0.81177681 0.94517202 0.2842247 ] [1.20244641 0.77456312 0.71527137 0.47463282]]
cupy, numpy 間のメモリ移動ができることが確認できました。
cd_np と cd_cpu の内容が同じなことから .get() はすべてのメモリ空間を見渡すことができることがわかります。
これで Windows11 WSL2 Ubuntu Python 環境はほぼ完成しました。
最後までお読みいただきありがとうございました。