后端
Eclipse Deeplearning4j 的硬件设置,包括 GPU 和 CUDA。
ND4J 在所谓的后端或线性代数库上工作,例如 Native nd4j-native 和 nd4j-cuda-10.2 (GPU),您可以通过将正确的依赖项粘贴到项目的 POM.xml 文件中来选择它们。
用于 GPU 和 CPU 的 ND4J 后端
通过更改 ND4J 的 POM.xml 文件中的依赖关系,您可以为后端线性代数运算选择 GPU 或本机 CPU。
您的选择将影响您的应用程序中使用的 ND4J 和 DL4J。
如果您安装了 CUDA v9.2+ 和 NVIDIA 兼容的硬件,那么您的依赖声明将如下所示:
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-cuda-11.2</artifactId>
<version>1.0.0-M1.1</version>
</dependency>
截至目前,CUDA 版本的 artifactId 可以是 nd4j-cuda-11.0、nd4j-cuda-11.2 之一。
通常,给定版本支持最后 2 个 cuda 版本。
您还可以通过 Maven Central 搜索或在发行说明中找到可用的 CUDA 版本。
否则,您将需要使用 ND4J 的本机实现作为 CPU 后端:
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>1.0.0-M1.1</version>
</dependency>
为多个操作系统构建
如果您在多个操作系统/系统架构上开发项目,您可以将 -platform 添加到 artifactId 的末尾,这将为大多数主要系统下载二进制文件。
<dependency>
...
<artifactId>nd4j-native-platform</artifactId>
...
</dependency>
捆绑多个后端
为了在运行时启用不同的后端,您可以通过环境变量设置环境的优先级
BACKEND_PRIORITY_CPU=SOME_NUM
BACKEND_PRIORITY_GPU=SOME_NUM
相对于优先级,它将允许您动态设置后端类型。
CPU
什么是 AVX,它为什么重要?
AVX(高级矢量扩展)是一组用于加速数值计算的 CPU 指令。有关更多详细信息,请参阅维基百科。
请注意,AVX 仅适用于 x86 设备的 nd4j-native (CPU) 后端,不适用于 GPU 和 ARM/PPC 设备。
为什么 AVX 很重要:性能。您想使用系统支持的最高级别 AVX 编译的 ND4J 版本。
对不同 CPU 的 AVX 支持 - 摘要:
大多数现代 x86 CPU:支持 AVX2
部分高端服务器CPU:可能支持AVX512
旧 CPU(2012 年之前)和低功耗 x86(Atom、Celeron):不支持 AVX(通常)
请注意,支持更高版本 AVX 的 CPU 也包括所有早期版本。这意味着可以在支持 AVX512 的系统上运行通用 x86 或 AVX2 二进制文件。但是,无法在不支持这些指令的 CPU 上运行为更高版本(例如 avx512)构建的二进制文件。
在版本 1.0.0-beta6 及更高版本中,如果 AVX 未进行最佳配置,您可能会收到如下警告:
*********************************** CPU Feature Check Warning ***********************************
Warning: Initializing ND4J with Generic x86 binary on a CPU with AVX/AVX2 support
Using ND4J with AVX/AVX2 will improve performance. See deeplearning4j.org/cpu for more details
Or set environment variable ND4J_IGNORE_AVX=true to suppress this warning
************************************************************************************************
配置 mkl 使用
在 intel 平台上使用 nd4j-native 后端时,我们的 openblas 绑定提供了同时使用 mkl 的能力。
为了使用 mkl,在启动时或在使用 Nd4j.create() 初始化 Nd4j 之前,将系统属性设置如下:
System.setProperty("org.bytedeco.openblas.load", "mkl");
在 ND4J/DL4J 中配置 AVX
如前所述,为了获得最佳性能,您应该使用与您的 CPU 支持的 AVX 级别相匹配的 ND4J 版本。
ND4J 默认配置(当仅包括 nd4j-native 或 nd4j-native-platform 依赖项而没有 maven 分类器配置时)对于 nd4j/nd4j-platform 依赖项是“通用 x86”(无 AVX)。 要配置 AVX2 和 AVX512,您需要为适当的架构指定分类器。
为 x86 架构提供了以下二进制文件(nd4j-native 分类器):
通用 x86(无 AVX):linux-x86_64、windows-x86_64、macosx-x86_64
AVX2:linux-x86_64-avx2、windows-x86_64-avx2、macosx-x86_64-avx2
AVX512:linux-x86_64-avx512
从 1.0.0-M1 开始,以下组合也可以使用 onednn:
通用 x86(无 AVX):linux-x86_64-onednn、windows-x86_64-onednn、macosx-x86_64-onednn
AVX2:linux-x86_64-onednn-avx2、windows-x86_64-onednn-avx2、macosx-x86_64-onednn-avx2
AVX512:linux-x86_64-onednn-avx512
- 示例:在 Windows 上配置 AVX2 (Maven pom.xml)
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>${nd4j.version}</version>
</dependency>
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>${nd4j.version}</version>
<classifier>windows-x86_64-avx2</classifier>
</dependency>
- Example: Configuring AVX512 on Linux (Maven pom.xml)
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>${nd4j.version}</version>
</dependency>
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>${nd4j.version}</version>
<classifier>linux-x86_64-avx512</classifier>
</dependency>
- Example: Configuring AVX512 on Linux with onednn(Maven pom.xml)
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>${nd4j.version}</version>
</dependency>
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>${nd4j.version}</version>
<classifier>linux-x86_64-onednn-avx512</classifier>
</dependency>
请注意,您需要 nd4j-native 依赖项 - 有和没有分类器。
在上面的示例中,假设 Maven 属性 nd4j.version 设置为适当的 ND4J 版本,例如 1.0.0-M1.1
Cudnn
将 Deeplearning4j 与 cuDNN 结合使用
有两种方法可以将 cudnn 与 deeplearning4j 一起使用。
一种是下面描述的旧方法,它内置在 java 级别的各种 deeplearning4j 层中。
另一种是使用在 c++ 级别链接到 cudnn 的新 nd4j cuda 绑定。
两者都将在下面进行描述。 新方法先,旧方法后。
Cudnn 设置
cuDNN 的实际库未捆绑,因此请务必从 NVIDIA 下载并安装适合您平台的软件包:
英伟达 cuDNN
请注意,支持多种 cuDNN 和 CUDA 组合。 Deeplearning4j 的 cuda 支持基于 javacpp 的 cuda 绑定。读取版本的方式是:cuda 版本 - cudnn 版本 - javacpp 版本。例如,如果 cuda 版本设置为 11.2,您可以期望我们支持 cudnn 8.1。
要安装,只需将库解压缩到本机库使用的系统路径中的目录即可。最简单的方法是将它与来自 CUDA 的其他库放在默认目录中(Linux 上的 /usr/local/cuda/lib64/、Mac OS X 上的 /usr/local/cuda/lib/ 和 C:\Program Files\ NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin\、C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\ 或 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10。 2\bin\ 在 Windows 上)。
或者,对于最新支持的 cuda 版本,cuDNN 与 JavaCPP Presets for CUDA 的“redist”包捆绑在一起。
同意许可后,我们可以添加以下依赖项,而不是安装 CUDA 和 cuDNN:
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>cuda-platform-redist</artifactId>
<version>$CUDA_VERSION-$CUDNN_VERSIUON-$JAVACPP_VERSION</version>
</dependency>
通过 nd4j 使用 cuDNN
与我们的 avx 绑定类似,nd4j 利用我们的 c++ 库 libnd4j 来运行数学运算。
为了使用 cudnn,您需要做的就是更改 cuda 后端依赖项:
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-cuda-11.4</artifactId>
<version>1.0.0-M2.1</version>
</dependency>
or
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-cuda-11.4</artifactId>
<version>1.0.0-M2.1</version>
</dependency>
TO
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-cuda-11.6</artifactId>
<version>1.0.0-M2.1</version>
</dependency>
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-cuda-11.6</artifactId>
<version>1.0.0-M2.1</version>
<classifier>linux-x86_64-cudnn</classifier>
</dependency>
of for cuda 11.0:
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-cuda-11.4</artifactId>
<version>1.0.0-M2.1</version>
</dependency>
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-cuda-11.4</artifactId>
<version>1.0.0-M2.1</version>
<classifier>linux-x86_64-cudnn</classifier>
</dependency>
For jetson nano cuda 10.2:
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-cuda-10.2</artifactId>
<version>1.0.0-M2.1</version>
</dependency>
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-cuda-10.2</artifactId>
<version>1.0.0-M2.1</version>
<version>linux-arm64</version>
</dependency>
对于 windows(注意:我们所做的只是将 linux 更改为 windows,相同的 cuda 版本适用于 linux 和 windows):
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-cuda-11.6</artifactId>
<version>1.0.0-M2.1</version>
</dependency>
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-cuda-11.6</artifactId>
<version>1.0.0-M2.1</version>
<classifier>windows-x86_64-cudnn</classifier>
</dependency>
请注意,我们只是添加了一个额外的依赖项。 我们使用附加分类器的原因是引入对基于 cudnn 的例程的可选依赖。
默认不使用 cudnn,而是为 cudnn 中实现的各种操作(如 conv2d 和 lstm)内置独立例程。
对于 nd4j-cuda-11.2-platform 等 -platform 依赖项的用户,仍然需要此分类器。
-platform 依赖项尝试为每个平台设置合理的默认值,但让用户可以选择包含他们想要的任何内容。
如果您需要优化,请熟悉这一点。
参考资料
https://deeplearning4j.konduit.ai/multi-project/explanation/configuration/backends