Ubuntu为julia安装深度学习框架MXNet(支持CUDA和OPenCV编译)

8 篇文章 4 订阅
1 篇文章 0 订阅

Ubuntu为julia安装深度学习框架MXNet(支持CUDA和OPenCV编译)

环境介绍与注意事项

  1. Ubuntu18.04
  2. julia 1.5.3
  3. CUDA 10.1(为了GPU支持,需要安装CUDA和cudnn,可以参考博客,若CUDA版本不同,参考此网站下载合适的MXNet版本)

安装MXNet的julia绑定,经过多次测试,并不能简单的通过Pkg.add("MXNet")进行安装。
会报此错误

error building `mxnet`:[ info: found nvcc: /usr/local/cuda-10.1/bin/nvcc │
ERROR: MethodError: no method matching replace(::String, ::Pair{String,String}, ::Pair{String,String})
...

经过查看源代码,问题出在下载编译时,~/.julia/packages/MXNet/XoVcx/deps/build.jl(默认软件包安装位置)文件中replace语法问题:

if Sys.isunix()
  nvcc_path = Sys.which("nvcc")
  if nvcc_path ≢ nothing
    @info "Found nvcc: $nvcc_path"
    push!(CUDAPATHS, replace(nvcc_path, "bin/nvcc", "lib64"))
  end
end

此处replace方法语法出现问题(此问题同样出现在采用某些版本的官方安装教程中,在那些教程中,采用了将编译后的动态链接文件用于预编译,然后使用Pkg安装,但是同样会有此问题),在正常安装的版本中,此处应为:

if Sys.isunix()
  nvcc_path = Sys.which("nvcc")
  if nvcc_path ≢ nothing
    @info "Found nvcc: $nvcc_path"
    push!(CUDAPATHS, replace(nvcc_path, "bin/nvcc" => "lib64"))
  end
end

因此,采用Pkg安装并不能通过编译,只能采用手动编译的方式。
我的julia安装目录,~/julia/julia-1.5.3中。

下载源文件

在官方网站下载MXNet1.6安装包
安装过程主要参考此官方文档
安装过程虽然参考MXNet1.7,但是若实际安装MXNet1.7,编译并不能通过,可能和CUDA版本相关。

安装依赖

$ sudo apt-get update
$ sudo apt-get install -y build-essential git ninja-build ccache libopenblas-dev libopencv-dev cmake

libopencv-dev是可选的,为了安装OpenCV支持。

编译

  1. 解压并更名
$ tar -xzvf apache-mxnet-src-1.6.0-incubating.tar.gz
$ mv apache-mxnet-src-1.6.0-incubating incubatormxnet
  1. 移动压缩后文件,并进入解压文件夹
$ mv incubatormxnet ~/julia/incubatormxnet
$ cd ~/julia/incubatormxnet
  1. 创建编译文件夹build
$ rm -rf build
$ mkdir build && cd build

若不需要安装GPU支持,或OpenCV支持,则在在编译配置文件中(~/julia/incubatormxnet/CMakeLists.txt),将USE_CUDA以及USE_OPENCV设为OFF(默认为ON)。

#默认为ON
option(USE_CUDA "Build with CUDA support"   ON)
...
option(USE_OPENCV "Build with OpenCV support" ON)
  1. 编译
$ cmake ..

NOTE:cmake时可能出现CMake 3.13 or higher is required. You are running version 3.10.2,此时需要升级CMake版本

$ pip3 install --user --upgrade "cmake>=3.13.2"

若未安装pip,运行以下命令进行安装:

$ sudo apt-get install -y python3-pip

安装后重新执行:

$ cmake ..
#或者执行
$ ~/.local/bin/cmake ..
  1. make
#根据核心数,增加执行速度
$ make -j8

NOTE:编译过程中可能出现此错误:

FAILED: CMakeFiles/cuda_compile_1.dir/src/operator/contrib/cuda_compile_1_generated_bounding_box.cu.o
cd ~/julia/incubatormxnet/build/CMakeFiles/cuda_compile_1.dir/src/operator/contrib && /usr/local/bin/cmake -E make_directory ~/julia/incubatormxnet/build/CMakeFiles/cuda_compile_1.dir/src/operator/contrib/. && /usr/local/bin/cmake -D verbose:BOOL=OFF -D build_configuration:STRING=Debug -D generated_file:STRING=~/julia/incubatormxnet/build/CMakeFiles/cuda_compile_1.dir/src/operator/contrib/./cuda_compile_1_generated_bounding_box.cu.o -D generated_cubin_file:STRING=~/julia/incubatormxnet/build/CMakeFiles/cuda_compile_1.dir/src/operator/contrib/./cuda_compile_1_generated_bounding_box.cu.o.cubin.txt -P ~/julia/incubatormxnet/build/CMakeFiles/cuda_compile_1.dir/src/operator/contrib/cuda_compile_1_generated_bounding_box.cu.o.Debug.cmake
~/julia/incubatormxnet/include/dmlc/./thread_local.h: In instantiation of ‘static T* dmlc::ThreadLocalStore<T>::Get() [with T = std::unordered_set<std::__cxx11::basic_string<char> >]’:
~/julia/incubatormxnet/src/operator/contrib/./../../common/utils.h:461:28:   required from here
~/julia/incubatormxnet/include/dmlc/./thread_local.h:46:15: error: cannot call member function ‘void dmlc::ThreadLocalStore<T>::RegisterDelete(T*) [with T = std::unordered_set<std::__cxx11::basic_string<char> >]’ without object
       Singleton()->RegisterDelete(ptr);
       ~~~~~~~~^~~~~
CMake Error at cuda_compile_1_generated_bounding_box.cu.o.Debug.cmake:279 (message):
  Error generating file
  ~/julia/incubatormxnet/build/CMakeFiles/cuda_compile_1.dir/src/operator/contrib/./cuda_compile_1_generated_bounding_box.cu.o

此时同样需要修改源文件~/julia/incubatormxnet/include/dmlc/thread_local.h

      Singleton()->RegisterDelete(ptr);

修改为

      (*Singleton()).RegisterDelete(ptr);

修改完成后,重新构建build文件夹,并进行编译。

$ cd ..
$ rm -rf build
$ mkdir build && cd build
...
  1. 将编译完成后文件复制到可被MXNET定位的文件夹

libmxnet安装的路径应为libmxnet的根目录。 换句话说,应该可以在$MXNET_HOME/lib下找到编译后的libmxnet.so文件。 如libmxnet的根目录是 ~/julia/incubatormxnet,则应运行以下命令:

$ cd ~/julia/incubatormxnet
$ cp -r build lib

环境配置

编译完成后,修改配置文件。

#创建安装目录
$ mkdir ~/julia/julia-1.5.3/julia-depot
$ vim ~/.bashrc

NOTE,此处需要创建安装目录的原因是:使用默认安装位置~/.julia可能导致Permission denied错误.
在文件~/.bashrc后添加如下行

export MXNET_HOME="$HOME/Program/julia/incubatormxnet"
export LD_LIBRARY_PATH="$HOME/julia/incubatormxnet/lib:$LD_LIBRARY_PATH"
export JULIA_DEPOT_PATH="$HOME/julia/julia-1.5.3/julia-depot"

使用软链接将julia添加进系统执行路径

$ sudo ln -s ~/julia/julia-1.5.3/julia/bin/julia /usr/bin/julia

安装MXNet

julia --color=yes --project=./ -e \
      'using Pkg; \
       Pkg.develop(PackageSpec(name="MXNet", path = joinpath(ENV["MXNET_HOME"], "julia")))'

为了使安装包在系统路径中进行注册,需要在路径~/julia/julia1.5.3/julia-depot/environments/v1.5中再次执行上述命令:

$ cd ~/julia/julia1.5.3/julia-depot/environments/v1.5
$ julia --color=yes --project=./ -e \
      'using Pkg; \
       Pkg.develop(PackageSpec(name="MXNet", path = joinpath(ENV["MXNET_HOME"], "julia")))'

此时查看~/julia/julia1.5.3/julia-depot/environments/v1.5/Manifest.toml可以看到MXNet被正确定位:

[[MXNet]]
deps = ["BinDeps", "Formatting", "JSON", "Libdl", "LinearAlgebra", "MacroTools", "Markdown", "Printf", "Random", "Reexport", "Statistics"]
path = "/home/brainiac/julia/incubatormxnet/julia"
uuid = "a7949054-b901-59c6-b8e3-7238c29bf7f0"
version = "1.6.0"

如果上述过程没有问题,就安装成功了,但是可能出现仍找不到MNXet的情况,这种情况下首先检查各个文件夹的对应情况,然后检查~/julia/incubatormxnet/julia/src/base.jl
查看动态库加载是是否正常

const MXNET_LIB = Libdl.find_library(["libmxnet.$(Libdl.dlext)", "libmxnet.so"],  # see build.jl
                                    [joinpath(get(ENV, "MXNET_HOME", ""), "lib"),
                                      get(ENV, "MXNET_HOME", ""),
                                      joinpath(@__DIR__, "..",
                                               "deps", "usr", "lib")])
#添加如下行后重新执行
print(Libdl.find_library("~/julia/incubatormxnet/lib/libmxnet.so"))

$ julia
julia> using Libdl
julia> Libdl.find_library("~/julia/incubatormxnet/lib/libmxnet.so")

若无法打印,可能是编译过程出现问题,重新编译执行,可以解决。

测试

$ julia
julia> using MXNet
julia> mx.gpu()
GPU0

后记

这个安装真的是费劲,enjoy coding.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MXNet是一个旨在提高效率和灵活性的深度学习框架。它是亚马逊选择的深度学习库之一,也被认为是最优秀的库之一。MXNet拥有类似于Theano和TensorFlow的数据流图,可以在多个GPU上进行配置,并提供了类似于Lasagne和Blocks的高级模型构建块。此外,MXNet还提供了对多种编程语言的支持,包括Python、R、Julia、C++、Scala、Matlab和Javascript。MXNet的目标是加速大规模深度神经网络的开发和部署,它提供了设备放置、多GPU训练、自动区分和优化的预定义图层等功能,以帮助开发人员充分利用GPU和云计算的能力。MXNet还具有计算和内存效率高的特点,可以在各种异构系统上运行,从移动设备到分布式GPU集群。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [DL框架MXNet深度学习框架MXNet 的简介、安装、使用方法、应用案例之详细攻略](https://blog.csdn.net/qq_41185868/article/details/79153500)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [深度学习框架MxNet】的安装](https://blog.csdn.net/ctu_sue/article/details/127426528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼小辉丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值