cuda10.2+vs2019编译pytorch和Ctranslate2遇到的错误以及解决方法

手上显卡只有算力3.0,想试用一下pytorch和ctranslate2,预编译版都不支持需要自己编译

经查文档cuda11开始不支持算力3.0,所以只能使用cuda10最后一个版本cuda10.2

10.2在windows下的编译器最高只支持VS2019,对一些c++新版的特性支持不是很好也会导致编译错误

环境:conda + python3.10 + cuda10.2 + cudnn8.7 + VS2019

一、pytorch (v1.13.1)

查阅pytorch的release信息可以发现从2.0开始不支持cuda10,的确经多次尝试都无法编译(可能因为VS2019对c++17的支持太差),所以可编译的最后版本为v1的最后一个版本1.13.1,但是此版本也是需要一些改动的

1. member "xxx" may not be initialized

这是由constexpr关键词引起的编译错误,只能将constexpr改为const

将aten/src/ATen/core/dynamic_type.h和c10/core/SymInt.h这两个头文件中的constexpr替换掉即可

2. CUDASparseDescriptors.cpp报错

这其实是因为windows上的10.2不支持CuSparseXXX的API,原代码疑似判断逻辑有误

在aten/src/ATen/cuda/CUDASparse.h中,既然按注释

// cuSparse Generic API added in CUDA 10.1
// Windows support added in CUDA 11.0

也就是11.0全平台支持,10.1只有非Windows平台支持,那么第7行的

((CUSPARSE_VERSION >= 10300) || (CUSPARSE_VERSION >= 11000 && defined(_WIN32)))

 就不对了,于是改成

((CUSPARSE_VERSION >= 11000) || (CUSPARSE_VERSION >= 10300 && !defined(_WIN32)))

 其实就是让AT_USE_CUSPARSE_GENERIC_API()的定义变为0,只是按照我觉得对的逻辑改了

 改完这两个问题就可以顺利编译pytorch了(好慢啊要编译好几个小时)

二、Ctranslate2 (v3.16.1)

Ctranslate2的changelog里虽然写着从v3.0开始不支持cuda10,但是经过尝试,修改部分文件以后还是可以编译的,v4.0+我也试过但是没法编译(可能也是因为c++17)。另外由于从3.17开始增加了cuda10缺少头文件的bfloat16类型支持,产生许多难以解决的错误,所以可编译的最后版本为3.16.1

1. 不支持cuda10

在CMakeLists.txt第417行的find_package(CUDA 11.0 REQUIRED),将11.0改为10.0

2. include/ctranslate2/utils.h报错

该utils.h文件第32行有个中文系统不支持的字符"│",我试过给编译选项加上/utf-8还是不行,于是只能将引号里的字符改为键盘上的竖杠:"|" (看起来一样其实不是同样的字符),或者像最新版本一样改成"\uFFE8"

3. nvcc error : 'cicc' died with status 0xC0000005 (ACCESS_VIOLATION)

这真的是一个超级大坑,一点都看不出问题在哪里。而且不止编译v3,就算是编译支持cuda10的v2.10+也会遇到这个问题。最后终于发现是因为Ctranslate2强制使用了子模块的thrust头文件,看一下CMakeLists.txt第450行的注释:

  # We should ensure that the Thrust include directories appear before
  # -I/usr/local/cuda/include for both GCC and NVCC, so that the headers
  # are coming from the submodule and not the system.

而出现问题时所使用的头文件跟10.2不兼容导致nvcc运行报错。但是因为项目代码中使用了11.0+的cub头文件,完全用10.2的也会编译不过去,所幸经实验用11.0的可以。因此将third_party/thrust这个子模块重新检出为标签cuda-11.0(或者1.9.9),当然它下面的dependencies/cub子模块也需要检出到对应的版本

4. src/cuda/utils.h报缺少par_nosync相关的错误

这个错误是改完上面一个才会出现的,因为旧版本的thrust头文件没有这个东西。经查看历史版本这边使用par_nosync是从2.13.0开始的,所以我们找到2.12.0版本的utils.h文件内容来替换一下,其实就是把

// Convenience macro to call Thrust functions with a default execution policy.
#define THRUST_CALL(FUN, ...) FUN(thrust::cuda::par_nosync.on(ctranslate2::cuda::get_cuda_stream()), __VA_ARGS__)

改成

    // Define a custom execution policy to set the default stream and disable synchronization.
    struct thrust_execution_policy : thrust::device_execution_policy<thrust_execution_policy> {
    private:
      cudaStream_t _stream = get_cuda_stream();

      friend __host__ __device__ cudaStream_t get_stream(thrust_execution_policy& policy) {
        return policy._stream;
      }

      friend __host__ __device__ cudaError_t synchronize_stream(thrust_execution_policy&) {
        return cudaSuccess;
      }
    };

// Convenience macro to call Thrust functions with a default execution policy.
#define THRUST_CALL(FUN, ...) FUN(ctranslate2::cuda::thrust_execution_policy(), __VA_ARGS__)

好了经过这些改动CTranslate2也可以顺利编译成功了

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyTorch 是一个用于科学计算和深度学习的 Python 库,它能够在 CPU 和 GPU 上高效地运行。PyTorch 通过使用类似 NumPy 的语法和动态计算图来简化了深度学习模型的实现。 CUDA 是 NVIDIA 开发的用于高性能计算的并行计算平台和编程模型,它使得程序能够在 NVIDIA GPU 上并行执行。CUDA 能够显著提高深度学习模型的训练速度。 GCC 是 GNU Compiler Collection 的缩写,它是一款优秀的开源编译器,支持多种编程语言,如 C、C++、Objective-C、Java、Ada 和 Fortran 等。在 Linux 上,GCC 通常是默认的 C/C++ 编译器。 PyTorch 可以与 CUDA 和 GCC 一起使用,以便在 GPU 上加速深度学习模型的训练和推断。要在 PyTorch 中使用 CUDA,您需要安装适当的 CUDA 版本和 CuDNN 库。要在 PyTorch 中使用 GCC,您需要确保安装了合适的版本,并且将其配置为默认编译器。 ### 回答2: PyTorchCUDA GCC是不同的软件工具。PyTorch是一个用于深度学习的开源框架,而CUDA GCC是用于编译和优化CUDA代码的编译器工具。 PyTorch的版本与CUDA GCC的版本之间没有直接的对应关系。PyTorch有自己的版本号体系,用于区分不同的发布版本。每个PyTorch发布版本都可以兼容一定范围内的CUDA运行时版本。 而CUDA GCC的版本则与NVIDIA的CUDA Toolkit版本相关联。CUDA Toolkit提供了用于开发和运行CUDA应用程序的一系列工具和库。每个CUDA Toolkit版本都包含了特定的CUDA GCC版本,用于编译CUDA代码。 在选择PyTorchCUDA GCC版本时,应该首先了解两者的兼容性。一般来说,PyTorch的官方文档会明确指出支持的CUDA版本范围。同时,NVIDIA官方也会在CUDA Toolkit的文档中列出支持的CUDA GCC版本。 为了确保PyTorchCUDA GCC的兼容性,应该选择满足两者要求的版本。在安装PyTorch时,可以通过指定合适的CUDA版本来确保PyTorchCUDA GCC的兼容性。 总结而言,PyTorchCUDA GCC是两个相互独立的工具,没有直接的版本对应关系。在选择版本时,要注意PyTorchCUDA GCC的兼容性,以确保代码的正常运行。 ### 回答3: PyTorchCUDA的版本之间是有对应关系的。PyTorch是一个使用GPU加速的深度学习框架,而CUDA是NVIDIA公司提供的GPU并行计算平台和编程模型。 PyTorch的版本通常会与其所支持的CUDA版本相对应。PyTorch的每个主要版本都会明确声明其所需要的最低CUDA版本。比如,PyTorch 1.8版本需要CUDA 10.2及以上的版本。也就是说,如果想要使用PyTorch 1.8,必须安装CUDA 10.2或更高版本的驱动和库。 需要注意的是,CUDA版本与GPU型号是一一对应的,并非所有老旧的GPU都支持最新的CUDA版本。因此,在选择PyTorchCUDA版本时,还要考虑自己的GPU型号是否与目标CUDA版本兼容。 另外,GCC(GNU Compiler Collection)是一套开源的编程语言编译器集合,其中包含了C、C++等语言的编译器。与PyTorchCUDA的版本对应无关,GCC版本的选择主要取决于操作系统和具体的代码编译要求。通常情况下,PyTorchCUDA的版本并不要求特定的GCC版本。 总结而言,PyTorchCUDA的版本有对应关系,PyTorch会明确声明所需的最低CUDA版本。而GCC编译器的版本选择与PyTorchCUDA的版本无关,主要依赖于操作系统和编译需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值