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 環境はほぼ完成しました。
最後までお読みいただきありがとうございました。


  • Numpy を GPU で動作させる に戻る
  • TensorFlow-GPU, cuDNN, CUDA バージョン対応 に戻る
  • TensorFlow インストール確認Ⅱ に戻る
  • TensorFlow インストール確認Ⅰ に戻る
  • TensorFlow インストール版数確認 に戻る
  • cuDNN インストール確認 に戻る
  • cuDNN 概要 に戻る
  • CUDA Toolkit のインストール に戻る
  • WSL2 Ubuntu Python GPU 環境 に戻る
  • WSL2 Ubuntu Python 概要 に戻る
  • 70VPS に戻る