极智AI | 谈谈GPU并行推理的几个方式

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 大家好,我是极智视界,本文主要聊一下 GPU 并行推理的几个方式。

大家好,我是极智视界。本文主要聊一下 GPU 并行推理的几个方式。

CUDA流 表示一个 GPU 操作队列,该队列中的操作将以添加到流中的先后顺序而依次执行。可以将一个流看做是GPU 上的一个任务,不同任务可以并行执行。使用 CUDA流,首先要选择一个支持设备重叠(Device Overlap)功能的设备,支持设备重叠功能的 GPU 能够在执行一个 CUDA 核函数的同时,还能在主机和设备之间执行复制数据操作。

支持重叠功能的设备的这一特性很重要,可以在一定程度上提升 GPU 程序的执行效率。一般情况下,CPU 内存远大于 GPU 内存,对于数据量比较大的情况,不可能把 CPU 缓冲区中的数据一次性传输给 GPU,需要分块传输,如果能够在分块传输的同时,GPU 也在执行核函数运算,这样就形成了异步操作,能够提高极大提升运算性能。

下面实际介绍几种 GPU 并行的方式。


1 Cuda 核函数并行

void privateBlobFromImagesGpu(const float* imageDatas, int batchCount, int width, int height, const float* mean, const float* std, float* blob, cudaStream_t stream)
{
  const dim3 block(3, width);
  const dim3 grid(height, batchCount);
  meanAndStdAndSplit <<<grid, block, 0, stream >>> (blob, imageDatas, mean, std);
}
global static void meanAndStdAndSplit(float* blob, const float* imageDatas, const float* mean, const float* std)
{
  const int c = threadIdx.x;
  const int x = threadIdx.y;
  const int y = blockIdx.x;
  const int idx = blockIdx.y; 
  const unsigned int blobIdx = idx * blockDim.x * blockDim.y * gridDim.x + c * blockDim.y * gridDim.x + y * blockDim.y + x;
  const unsigned int imagesIdx = idx * blockDim.x * blockDim.y * gridDim.x + y * blockDim.x * blockDim.y + x * blockDim.x + c;
  blob[blobIdx] = (imageDatas[imagesIdx] - mean[c]) / std[c];
}
for (int i = 0; i < thNB; i++)
{
  privateBlobFromImagesGpu((float*)m_converArray, imgdata.size.size(), m_inputW, m_inputH, m_mean_GPU, m_std_GPU,
  (float*)m_Bindings.at(m_InputIndex), cudaStream[i]);
}
for (int i = 0; i < thNB; i++)
{
  cudaStreamSynchronize(cudaStream);
}


2 调用英伟达 API 库并行

for (int i = 0; i < imgdata.size.size(); i++)
{
  cv::cuda::GpuMat gpuRgbSrcImg(cv::Size(imgdata.size[i].w, imgdata.size[i].h), CV_8UC3, (cv::uint8_t*)imgdata.data + i * imgdata.size[i].w * imgdata.size[i].h);
  cv::cuda::GpuMat gpuRgbDstImg(cv::Size(m_inputW, m_inputH), CV_8UC3, (cv::uint8_t*)m_resizeArray + i * m_inputC * m_inputH * m_inputW);
  cv::cuda::resize(gpuRgbSrcImg, gpuRgbDstImg, cv::Size(m_inputW, m_inputH), 0.0, 0.0, cv::INTER_LINEAR);
  cv::cuda::GpuMat dst_conver(outputSize, CV_32FC3, (float*)m_converArray + i * m_inputC * m_inputH * m_inputW);
  gpuRgbDstImg.convertTo(dst_conver, CV_32F, 1.0 / 255, 0);
}
stream.waitForCompletion();


3 TRT 并行

int testStream()
{
  int outNB = 0;
  std::string model_path = "./data/";
  int batchsize = 4;
  int streamNB = 2;
  DoInference *doInfer_stream1 = new DoInference();
  std::vector<int> outputSize;
  bool isInit1 = doInfer_stream1->InitModle(model_path, OD, TensorRT, outputSize, streamNB, batchsize);
  std::vector<float*> inputData;
  std::vector<cudaStream_t> cudaStream;
  std::vector<vector<void*>>imgdata_stream;
  inputData.resize(streamNB);
  cudaStream.resize(streamNB);
  int* size = new int[4];
  size[0] = 512 * 512 * 3;
  size[1] = 135168;
  size[2] = 33792;
  size[3] = 8848;
  imgdata_stream.resize(streamNB);
  for (int i = 0; i < streamNB; i++)
  {
    cudaStreamCreate(&cudaStream.at(i));
    cudaStreamCreateWithFlags(&cudaStream.at(i), cudaStreamNonBlocking);
    cudaMallocHost(&inputData.at(i), batchsize * size[0] * sizeof(float));
    imgdata_stream.at(i).resize(4);
    for (int j = 0; j < 4; j++)
    {
      cudaMalloc(&imgdata_stream.at(i).at(j), batchsize * size[j] * sizeof(float));
    }
    for (int z = 0; z < size[0]; z++)
    {
      inputData.at(i)[z] = z;
    } 
  }
  for (int count = 0; count < 5; count++)
  {
    for (int i = 0; i < streamNB; i++)
    {
      cudaMemcpyAsync(imgdata_stream.at(i).at(0), inputData.at(i), batchsize * size[0] * sizeof(float), cudaMemcpyHostToDevice, cudaStream.at(i));
      doInfer_stream1->DoinferTestStream(imgdata_stream.at(i), batchsize, i, cudaStream.at(i));
    }
  }
  for (int i = 0; i < streamNB; i++)
  {
    cudaStreamSynchronize(cudaStream.at(i));
  }
  //cudaStreamSynchronize(cudaStream1);
  //cudaStreamSynchronize(cudaStream2); 
  return 0;
}


好了,以上聊了下 GPU 并行推理的几个方式,希望我的分享能对你的学习有一点帮助。


logo_show.gif

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
2月前
|
机器学习/深度学习 人工智能 UED
OpenAI o1模型:AI通用复杂推理的新篇章
OpenAI发布了其最新的AI模型——o1,这款模型以其独特的复杂推理能力和全新的训练方式,引起了业界的广泛关注。今天,我们就来深入剖析o1模型的特点、背后的原理,以及一些有趣的八卦信息。
314 73
|
20天前
|
人工智能 运维 Serverless
Serverless GPU:助力 AI 推理加速
近年来,AI 技术发展迅猛,企业纷纷寻求将 AI 能力转化为商业价值,然而,在部署 AI 模型推理服务时,却遭遇成本高昂、弹性不足及运维复杂等挑战。本文将探讨云原生 Serverless GPU 如何从根本上解决这些问题,以实现 AI 技术的高效落地。
|
3天前
|
存储 人工智能 安全
CPFS深度解析:并行文件存储加速AI创新
在生成式AI的大潮中,并行文件系统作为高性能数据底座,为AI算力提供高吞吐、低延迟的数据存储服务。在本话题中,我们将介绍阿里云并行文件存储CPFS针对AI智算场景而提供的产品能力演进与更新,深入讲解在性能、成本、稳定、安全等方面的技术创新。
|
13天前
|
机器学习/深度学习 人工智能 弹性计算
阿里云AI服务器价格表_GPU服务器租赁费用_AI人工智能高性能计算推理
阿里云AI服务器提供多种配置选项,包括CPU+GPU、CPU+FPGA等组合,支持高性能计算需求。本文汇总了阿里云GPU服务器的价格信息,涵盖NVIDIA A10、V100、T4、P4、P100等多款GPU卡,适用于人工智能、机器学习和深度学习等场景。详细价格表和实例规格见文内图表。
|
1月前
|
人工智能 调度 开发工具
xGPU来啦!免费GPU资源开发花样AI应用!
为了降低AI应用服务和推广的门槛,解决开发者面临的实际痛点,ModelScope社区推出 xGPU 服务,让大家能够免费使用高性能 GPU 资源,托管自己的AI应用服务。
|
29天前
|
人工智能 NoSQL 机器人
MongoDB Atlas与YoMio.AI近乎完美适配:推理更快速、查询更灵活、场景更丰富
随着MongoDB的新发布和革新,YoMio.AI的“闪电式发展”值得期待。
|
2月前
|
人工智能 自然语言处理 自动驾驶
【通义】AI视界|马斯克亲自辟谣:xAI不可能在特斯拉的推理计算机上运行
本文精选了24小时内的重要科技新闻,包括马斯克辟谣xAI不会运行在特斯拉计算机上、谷歌发布AlphaProteo AI模型、百度贴吧“弱智吧”成为AI训练佳选、荣耀推出跨应用智能体以及苹果即将在iOS 18.2中加入图像生成功能。更多内容请访问通义官网体验。
|
存储 人工智能 Kubernetes
GPU AI 模型训练
适用于 AI 图片训练场景,使用 CPFS/NAS 作为共享存储,利用容器服务 Kubernetes 版管理 GPU 云服务器集群进行图片 AI 训练。
1089 0
GPU AI 模型训练
|
存储 人工智能 Kubernetes
GPU AI 模型训练
适用于 AI 图片训练场景,使用 CPFS/NAS 作为共享存储,利用容器服务 Kubernetes 版管 理 GPU 云服务器集群进行图片 AI 训练。
19314 0
GPU AI 模型训练
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
当前AI大模型在软件开发中的创新应用与挑战
2024年,AI大模型在软件开发领域的应用正重塑传统流程,从自动化编码、智能协作到代码审查和测试,显著提升了开发效率和代码质量。然而,技术挑战、伦理安全及模型可解释性等问题仍需解决。未来,AI将继续推动软件开发向更高效、智能化方向发展。

热门文章

最新文章