在 Arch Linux 上构建微软 CNTK 时出错:libCntk.Eval-2.0.so 抱怨未定义对 TensorView 的引用

Posted

技术标签:

【中文标题】在 Arch Linux 上构建微软 CNTK 时出错:libCntk.Eval-2.0.so 抱怨未定义对 TensorView 的引用【英文标题】:Error in building Microsoft's CNTK on Arch Linux: libCntk.Eval-2.0.so complains about undefined reference to TensorView 【发布时间】:2017-07-06 12:39:03 【问题描述】:

我正在尝试从Arch Linux 上的源代码构建CNTK

git 命令:

git clone https://github.com/Microsoft/CNTK
cd CNTK
git submodule sync --recursive
git submodule update --init --recursive

配置和制作命令:

./configure --with-mkl=/usr/local/CNTKCustomMKL --1bitsgd=yes --asgd=no
make all

错误:

building ./bin/cppevalclient for Linux with build type release
/usr/bin/mpic++  -rdynamic -L./lib -L/usr/local/CNTKCustomMKL/3/x64/parallel -L/usr/lib -L/usr/lib -L/usr/release/lib -Wl,-rpath,'$ORIGIN/../lib' -Wl,-rpath,/usr/local/CNTKCustomMKL/3/x64/parallel -Wl,-rpath,/usr/lib -Wl,-rpath,/usr/lib -Wl,-rpath,/usr/release/lib -o bin/cppevalclient .build/Source/../Examples/Evaluation/CPPEvalClient/CPPEvalClient.o -lm -lmkl_cntk_p -liomp5 -lpthread -lCntk.Eval-2.0 -lCntk.Math-2.0 -lCntk.PerformanceProfiler-2.0 
./lib/libCntk.Eval-2.0.so: undefined reference to `Microsoft::MSR::CNTK::TensorView<double> const* CNTK::NDArrayView::GetTensorView<double>() const'
./lib/libCntk.Eval-2.0.so: undefined reference to `Microsoft::MSR::CNTK::TensorView<float> const* CNTK::NDArrayView::GetTensorView<float>() const'
collect2: error: ld returned 1 exit status
make: *** [Makefile:628: bin/cppevalclient] Error 1

TensorViewSource/Math 的一部分,所以我期待libCntk.Math-2.0.so。但在错误消息中,libCntk.Eval-2.0.so 抱怨未定义对TensorView 的引用。

谢谢!

编辑 1:

所有三个 .so 文件均已构建且可用:

-rwxr-xr-x 1 a a 252658744 2017-06-21 21:01 libCntk.Eval-2.0.so
-rwxr-xr-x 1 a a 59993400  2017-06-21 21:00 libCntk.Math-2.0.so
-rwxr-xr-x 1 a a 1911472   2017-06-21 21:00 libCntk.PerformanceProfiler-2.0.so

编辑 2:

mpic++ --versiong++ (GCC) 7.1.1

作者建议使用gcc 4.8。但是,我不希望机器上有两个版本的gcc

编辑 3:

根据作者 (https://github.com/Microsoft/CNTK/issues/2025) 的建议,我在 Makefile 中注释掉了 EVAL_CLIENT 目标。但是,错误移动到了Makefile 中的下一个目标:CNTKLIBRARY_CPP_EVAL_EXAMPLES

编辑 4:

似乎该错误与链接器和一些标志有关,例如--as-needed--whole-archive 等。但是,我还不能修复它。

谢谢!

【问题讨论】:

【参考方案1】:

不确定是否是 GCC 7.1.1 引起的。如果你不想在机器上安装两个版本的 gcc,你可以运行 docker 吗? CNTK 也支持 docker 容器。详情请见https://docs.microsoft.com/en-us/cognitive-toolkit/CNTK-Docker-Containers。

【讨论】:

谢谢。我正在使用 CNTK 的 Docker 容器。但是,我使用 Arch Linux 作为基准操作系统,我想找到一个解决方案,用更高版本的 GCC 编译它,以简化在 Arch Linux 上的 CNTK 安装。

以上是关于在 Arch Linux 上构建微软 CNTK 时出错:libCntk.Eval-2.0.so 抱怨未定义对 TensorView 的引用的主要内容,如果未能解决你的问题,请参考以下文章

转载微软Facebook联手发布AI生态系统,CNTK+Caffe2+PyTorch挑战TensorFlow

助力微软语音识别错误率再降至5.1%,秘密武器CNTK与TensorFlow性能孰强?

CNTK 搞深度学习-1

重磅微软Facebook联手发布AI生态系统,CNTK+Caffe2+PyTorch挑战TensorFlow

微软Facebook联手发布AI生态系统,CNTK+Caffe2+PyTorch挑战TensorFlow

微软的深度学习框架cntk ,我目前见过 安装方式最简单的一个框架,2.0之后开始支持C# 咯