Jetson Nano安装Numba遇到的一些坑

一开始简单粗暴的pip3 install numba,结果安装llvmlite时候报错。

然后百度,参考了CSDN上的一篇博客

以下为博客中内容:

首先numba安装需要依赖包llvmlite,llvmlite又需要安装llvm

本次安装numba版本为0.31.0,llvmlite版本为0.16.0,llvm版本为3.9

首先安装llvm-3.9,命令为sudo apt-get install llvm-3.9

然后源码安装llvmlite0.16.0,命令为sudo LLVM_CONFIG=/usr/bin/llvm-config-3.9
python3 setup.py install,需要进入源码目录中安装。

最后安装numba ,命令为sudo LLVM_CONFIG=/usr/bin/llvm-config-3.9 pip3
install numba==0.31

源码包可以先pip3 install llvmlite==0.16.0在终端里显示出的链接中下载。

安装成功以后,跑了一个CUDA Python的程序:

import matplotlib.pyplot as plt
from PIL import Image

#显示待处理的图片
infer_path='mojave.jpg'
image=Image.open(infer_path)
print(image.size)
plt.imshow(image)
#plt.show()

#定义GPU CPU处理函数
import cv2
import numpy as np 
from numba import cuda
import time
import math

#Create an image.
img = cv2.imread('mojave.jpg')

#GPU function
@cuda.jit
def process_gpu(img,channels):
	tx = cuda.blockIdx.x*cuda.blockDim.x+cuda.threadIdx.x
	ty = cuda.blockIdx.y*cuda.blockDim.y+cuda.threadIdx.y
	for c in range(channels):
		color = img[tx,ty][c]*2.0+30
		if color>255:
			img[tx,ty][c]=255
		elif color<0:
			img[tx,ty][c]=0
		else:
			img[tx,ty][c]=color

#CPU function
def process_cpu(img,dst):
	rows,cols,channels=img.shape
	for i in range(rows):
		for j in range(cols):
			for c in range(3):
				color=img[i,j][c]*2.0+30
				if color>255:
					dst[i,j][c]=255
				elif color<0:
					dst[i,j][c]=0
				else:
					dst[i,j][c]=color

rows,cols,channels=img.shape


##GPU process
dImg = cuda.to_device(img)
threadsperblock = (16,16)
blockspergrid_x = int(math.ceil(rows/threadsperblock[0]))
blockspergrid_y = int(math.ceil(cols/threadsperblock[1]))
blockspergrid = (blockspergrid_x,blockspergrid_y)
cuda.synchronize()
dst_gpu = img.copy()
start_gpu = time.time()
process_gpu[blockspergrid,threadsperblock](dImg,channels)
cuda.synchronize()
end_gpu = time.time()
dst_gpu = dImg.copy_to_host()
time_gpu = (end_gpu-start_gpu)
print("GPU process time: "+str(time_gpu))
#save
cv2.imwrite("result_gpu.jpg",dst_gpu)

#GPU处理的图片
infer_path='result_gpu.jpg'
image=Image.open(infer_path)
plt.imshow(image)
plt.show()

##CPU process
dst_cpu = img.copy()
start_cpu = time.time()
process_cpu(img,dst_cpu)
end_cpu = time.time()
time_cpu = (end_cpu-start_cpu)
print("CPU process time: "+str(time_cpu))
#save
cv2.imwrite("result_cpu.jpg",dst_cpu)

#CPU处理的图片
infer_path='result_cpu.jpg'
image=Image.open(infer_path)
plt.imshow(image)
plt.show()

是一个对比CPU和GPU处理图片亮度时间的代码

运行程序后出现报错:

Traceback (most recent call last): File
“/usr/local/lib/python3.6/dist-packages/numba/cuda/cudadrv/nvvm.py”,
line 111, in new
inst.driver = open_cudalib(‘nvvm’, ccc=True) File “/usr/local/lib/python3.6/dist-packages/numba/cuda/cudadrv/libs.py”,
line 41, in open_cudalib
raise OSError(‘library %s not found’ % lib) OSError: library nvvm not found

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File “1.py”, line 76, in
process_gpublockspergrid,threadsperblock File “/usr/local/lib/python3.6/dist-packages/numba/cuda/compiler.py”, line
701, in call
kernel = self.specialize(*args) File “/usr/local/lib/python3.6/dist-packages/numba/cuda/compiler.py”, line
712, in specialize
kernel = self.compile(argtypes) File “/usr/local/lib/python3.6/dist-packages/numba/cuda/compiler.py”, line
730, in compile
kernel.bind() File “/usr/local/lib/python3.6/dist-packages/numba/cuda/compiler.py”, line
489, in bind
self._func.get() File “/usr/local/lib/python3.6/dist-packages/numba/cuda/compiler.py”, line
370, in get
ptx = self.ptx.get() File “/usr/local/lib/python3.6/dist-packages/numba/cuda/compiler.py”, line
342, in get
**self._extra_options) File “/usr/local/lib/python3.6/dist-packages/numba/cuda/cudadrv/nvvm.py”,
line 463, in llvm_to_ptx
cu = CompilationUnit() File “/usr/local/lib/python3.6/dist-packages/numba/cuda/cudadrv/nvvm.py”,
line 146, in init
self.driver = NVVM() File “/usr/local/lib/python3.6/dist-packages/numba/cuda/cudadrv/nvvm.py”,
line 116, in new
raise NvvmSupportError(errmsg % e) numba.cuda.cudadrv.error.NvvmSupportError: libNVVM cannot be found. Do
conda install cudatoolkit: library nvvm not found Exception ignored
in: <bound method CompilationUnit.del of
<numba.cuda.cudadrv.nvvm.CompilationUnit object at 0x7f3ed0ee48>>
Traceback (most recent call last): File
“/usr/local/lib/python3.6/dist-packages/numba/cuda/cudadrv/nvvm.py”,
line 152, in del
driver = NVVM() File “/usr/local/lib/python3.6/dist-packages/numba/cuda/cudadrv/nvvm.py”,
line 116, in new
raise NvvmSupportError(errmsg % e) numba.cuda.cudadrv.error.NvvmSupportError: libNVVM cannot be found. Do
conda install cudatoolkit: library nvvm not found

找不到nvvm,但是cuda10.0已经安装了,百度一下后得知是缺少环境变量。

在.bashrc中添加如下内容:

export NUMBAPRO_NVVM=/usr/local/cuda-10.0/nvvm/lib64/libnvvm.so
export NUMBAPRO_LIBDEVICE=/usr/local/cuda-10.0/nvvm/libdevice/

CUDA的环境变量之前配置好了已经,加上上面两条完整的如下:

export CUDA_HOME=/usr/local/cuda-10.0
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-10.0/bin:$PATH
export NUMBAPRO_NVVM=/usr/local/cuda-10.0/nvvm/lib64/libnvvm.so
export NUMBAPRO_LIBDEVICE=/usr/local/cuda-10.0/nvvm/libdevice/

然后再次执行py程序,出现新的报错:

Traceback (most recent call last): File “1.py”, line 61, in
process_gpublockspergrid,threadsperblock File “/usr/local/lib/python3.6/dist-packages/numba/cuda/compiler.py”, line
701, in call
kernel = self.specialize(*args) File “/usr/local/lib/python3.6/dist-packages/numba/cuda/compiler.py”, line
712, in specialize
kernel = self.compile(argtypes) File “/usr/local/lib/python3.6/dist-packages/numba/cuda/compiler.py”, line
730, in compile
kernel.bind() File “/usr/local/lib/python3.6/dist-packages/numba/cuda/compiler.py”, line
489, in bind
self._func.get() File “/usr/local/lib/python3.6/dist-packages/numba/cuda/compiler.py”, line
370, in get
ptx = self.ptx.get() File “/usr/local/lib/python3.6/dist-packages/numba/cuda/compiler.py”, line
342, in get
**self._extra_options) File “/usr/local/lib/python3.6/dist-packages/numba/cuda/cudadrv/nvvm.py”,
line 464, in llvm_to_ptx
libdevice = LibDevice(arch=opts.get(‘arch’, ‘compute_20’)) File “/usr/local/lib/python3.6/dist-packages/numba/cuda/cudadrv/nvvm.py”,
line 340, in init
raise RuntimeError(MISSING_LIBDEVICE_FILE_MSG.format(arch=arch)) RuntimeError: Missing libdevice file for compute_50. Please ensure you
have package cudatoolkit 7.5. Install package by:

conda install cudatoolkit=7.5

但是我也没用使用conda,报错中提示的命令对我无效。百度了很久找不到办法,终于在CSDN的一篇博客的评论里找到了解决方法:

因为Missing libdevice file for compute_50,在/usr/local/cuda-10.0/nvvm/libdevice下发现只有一个
libdevice.10.bc。这里我们创建一个软链接sudo ln -s libdevice.10.bc libdevice.compute_50.10.bc

再次运行py程序,正常运行!

最后說一下Jetson Nano跑这个程序的速度,处理图片的分辨率是5120x2880标准5K图片,用CPU跑全程单核在跑,最终用时大概1090秒,用GPU跑1秒钟左右。

相同程序在PC机,至强U跑大概160秒。Tesla V100显卡跑大搞0点几秒。

不得不感叹CUDA处理这些性能强大!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值