PYTHON调用GPU之HelloWorld

本文展示了如何使用Python的Numba库在GPU上进行计算加速。通过两个示例,包括图像处理和矩阵乘法,演示了CUDA内核的编写和执行,对比了GPU与CPU的处理时间,强调了GPU在并行计算中的优势。
部署运行你感兴趣的模型镜像

PYTHON调用GPU之HelloWorld


import cv2
import numpy as np
from numba import cuda
import time
import math
import os
# os.environ['CUDA_VISIBLE_DEVICES'] = "0"


@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 k in range(channels):
        color = img[tx,ty][k]*2.0 + 30

        if color > 255:
            img[tx,ty][k]=255
        elif color < 0:
            img[tx,ty][k] = 0
        else:
            img[tx,ty][k] = color


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


if __name__ == '__main__':
    img = cv2.imread("test-nvidia.png")
    rows,cols,channels = img.shape
    print(rows,cols,channels)
    dst_cpu = img.copy()
    dst_gpu = img.copy()
    start_cpu = time.time()
    #process_cpu(dst_cpu,dst_cpu)
    end_cpu = time.time()
    print("CPU process time: " + str(end_cpu - start_cpu))

    dImg = cuda.to_device(img)
    threadsperblock = (16,16)
    blockspergrid_x = int(math.ceil(rows/threadsperblock[0]))
    blockspergrid_y = int(math.ceil(cols/threadsperblock[1]))
    print(blockspergrid_x,blockspergrid_y)
    blockspergrid = (blockspergrid_x,blockspergrid_y)
    cuda.synchronize()
    start_gpu = time.time()
    process_gpu[blockspergrid,threadsperblock](dImg,channels)
    cuda.synchronize()
    end_gpu = time.time()
    dst_gpu = dImg.copy_to_host()
    print("GPU Process time: " + str(end_gpu - start_gpu))

    cv2.imwrite("result_gpu.png",dst_gpu)
    #cv2.imwrite("result_cpu.png",dst_cpu)

from numba import cuda,float32
import numpy as np
import math
TPB = 16
@cuda.jit
def gpu_matrix_multiply(matrix1,matrix2,res_matrix):
    row,col = cuda.grid(2)

    sum = 0
    for i in range(matrix1.shape[1]):
        sum += matrix1[row,i] * matrix2[i,col]
    #print(row,col,sum)
    res_matrix[row,col] = sum


@cuda.jit
def gpu_share_matrix_multiply(matrix1,matrix2,res_matrix):
    sA = cuda.shared.array(shape=(TPB,TPB), dtype=float32)
    sB = cuda.shared.array(shape=(TPB,TPB), dtype=float32)

    row, col = cuda.grid(2)
    if row >= matrix1.shape[0] or col >= matrix2.shape[1]:
        return
    thread_x = cuda.threadIdx.x
    thread_y = cuda.threadIdx.y
    tmp = 0.0
    for i in range(int(matrix1.shape[1]/TPB)):
        sA[thread_x,thread_y] = matrix1[row, thread_y+i*TPB]
        sB[thread_y,thread_x] = matrix2[thread_x+i*TPB, col]
        cuda.syncthreads()
        for j in range(TPB):
            tmp += sA[thread_x, j] * sB[j, thread_y]
        cuda.syncthreads()
    res_matrix[row,col] = tmp


if __name__ == '__main__':

    A = np.full((TPB*50, TPB*50), 3, np.float)
    B = np.full((TPB*50, TPB*50), 4, np.float)
    C = np.full((A.shape[0], B.shape[1]), 0, np.float)
    D = np.full((A.shape[0], B.shape[1]), 0, np.float)
    print(".......")
    print(A.dot(B))
    threadPerBlock = (TPB, TPB)
    blockPerGrid_x = math.ceil(A.shape[0]/TPB)
    blockPerGrid_y = math.ceil(B.shape[1]/TPB)
    blockPerGrid = (blockPerGrid_x, blockPerGrid_y)

    A_gpu = cuda.to_device(A)
    B_gpu = cuda.to_device(B)
    C_gpu = cuda.to_device(C)
    D_gpu = cuda.to_device(D)

    gpu_matrix_multiply[blockPerGrid, threadPerBlock](A_gpu, B_gpu, C_gpu)
    cuda.synchronize()
    C_gpu_res = C_gpu.copy_to_host()
    print("..........")
    print(C_gpu_res)
    print("..........")
    gpu_share_matrix_multiply[blockPerGrid, threadPerBlock](A_gpu, B_gpu, D_gpu)
    D_gpu_res = D_gpu.copy_to_host()
    print(D_gpu_res)


您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### 配置和使用GPU加速以优化Ollama本地模型性能 #### 安装必要的依赖项 为了使Ollama能够利用GPU进行加速,需确保已安装相应的驱动程序和支持库。对于NVIDIA GPU而言,这通常意味着要安装CUDA Toolkit以及cuDNN库。 ```bash sudo apt-get update && sudo apt-get install -y nvidia-driver-<version> distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \ && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker ``` 上述命令用于设置NVIDIA容器工具包环境[^2]。 #### 设置Ollama环境变量 为了让Ollama识别并充分利用可用的GPU硬件,在启动服务之前应适当配置环境变量: ```bash export CUDA_VISIBLE_DEVICES=0 # 或者根据实际情况指定其他设备编号 export NVIDIA_DRIVER_CAPABILITIES=compute,utility export NCCL_DEBUG=INFO ``` 这些指令可以帮助系统更好地管理和分配GPU资源给Ollama应用实例[^1]。 #### 启动带有GPU支持的服务 当一切准备就绪之后,可以通过如下方式启动具备GPU加速特性的Ollama服务器端口: ```bash docker run --gpus all -p 8000:8000 ollama/ollama-server ``` 此命令会告诉Docker引擎为该容器分配所有的物理GPU,并将其绑定到主机上的特定网络端口上监听请求[^3]。 #### 测试GPU加速效果 最后一步是验证是否成功启用了GPU加速功能。可以编写简单的Python脚本来加载预训练的语言模型并通过它执行一些预测任务来观察实际运行情况下的性能差异。 ```python from transformers import pipeline generator = pipeline('text-generation', model='distilgpt2') print(generator("Hello world!", max_length=50)) ``` 这段代码展示了如何创建一个基于Hugging Face Transformers库的文字生成器对象,并测试其处理能力。如果一切都正常工作,则应该可以看到明显的速度提升[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值