我的python GIL锁似乎失效了!!
最近硬盘坏了,重装了系统,重装之前python单进程只能达到CPU50%利用率。环境i5-6300HQ,GTX965M,显卡驱动382,Anaconda3-5.2.0,CUDA8.0GA2,
在装好CUDA环境后,又安装了cupy库,这个库基本上继承了numpy的大部分,程序中可直接import cupy as np即可用GPU加速numpy的计算,
安装方式是 pip install cupy-cuda80
我在装好GPU计算环境后,先测试了CPU的速度,
测试代码是我自己用numpy实现的单进程单线程三层全连接网络(3-DNN),import numpy as np,CPU利用率瞬间达到了100% ??
然后测试GPU,import cupy as np,也能正常计算,GPU利用率也接近100%。
这个情况让我比较困惑,为什么CPU利用率也能达到100%??是我装的CUDA的作用,还是cupy库的作用??亦或者GIL锁失效了。
有能解答我疑惑的朋友吗?
2小时没有回复的话可以给我发邮件964348286@。
代码的一部分附在下面:
import numpy as np
from activate_function import *
import time
import matplotlib.pyplot as plt
data = np.load("train_data.npy")
label = np.load("train_label.npy")
data = data.reshape(60000,28**2)/256
z_1 = np.dot(x,w_1)+b_1
a_1 = relu(z_1)
z_2 = np.dot(a_1,w_2)+b_2
cem,dz_2 = softmax_cross_entropy_mean_and_derivative_GD(y,z_2,batch_size)
loss = cem#+rglzr/2/batch_size*(np.sum(w_1*w_1)+np.sum(w_2*w_2))
acc = np.equal(np.argmax(y,1),np.argmax(z_2,1)).mean()
# 反向传播
dw_2 = np.dot(a_1.T,dz_2)
db_2 = np.sum(dz_2,axis=0,keepdims=True)
da_1 = np.dot(dz_2,w_2.T)
dz_1 = relu_derivative(z_1)*da_1
dw_1 = np.dot(x.T,dz_1)
db_1 = np.sum(dz_1,axis=0,keepdims=True)
w_2 -= learning_rate*dw_2#+rglzr*w_2
b_2 -= learning_rate*db_2
w_1 -= learning_rate*dw_1#+rglzr*w_1
b_1 -= learning_rate*db_1
activate_function.py(部分):
def relu(x):
return np.maximum(0, x)
def relu_derivative(x):
return np.where(x<0,0,1)
def softmax_cross_entropy_mean_and_derivative_GD(y,z,batch_size):
t = np.exp(z)
a = t/(np.sum(t,axis=1).reshape(-1,1))
l = -np.sum(y*np.log(a+1e-8),axis=1)
j = np.mean(l)
dz = (a-y)/batch_size
return j,dz