环境:Windows 10,CUDA 8 & 9,CuDnn 5 & 6 & 7,Visual Studio 2017,Windows 10 SDK 15063 & 16299,VS平台工具集v140 & v141,Anaconda 4.4(x64)
在Bash on Windows 10上面按照官方教程编译Tensorflow的Linux版本一次成功,编译原因是pip包没有SSE指令集支持。编译出来后可以正常运行。
Windows下pip安装的包不支持Cuda9,于是编译安装。事实证明Tensorflow 1.3确实不支持Cuda 9(Caffe 支持),今天看了下Tensorflow 1.4已经有支持Cuda 9的whl包了,没必要再花这么大力气了。通过修改环境变量的方式切换到Cuda 8,编译成功。
本来想把Tensorflow弄Android上跑,但官方资料极少,确实有Apk demo 和 Native Library,但我的手机上只有demo能跑,不知是不是个例。于是想到了微软家的跨平台神器 Xamarin,但Tensorflow的dll太多了,于是想到微软某个儿子CNTK。
根据原来的Xamarin经验,可以直接在C#终引用某个DLL,然后编译出来在Android上就能跑,于是先下了NuGet包。因为目标版本的问题,CNTKCpuOnly和Uwp.CNTKCpuOnly都不能安装上,只好手动添加。编译成功,有警告,因为CNTK的目标架构是AMD64而不是IL,即很可能无法在Mono下跑。运行后果不其然无法识别CPU。与是git clone下源码后准备将已有的DLL换为编译前的项目文件(有若干Windows库被我用这种方法弄到Android上执行),解决了opencv、boost等库的依赖,还手动添加#undef MPI等不正规手法,最后在Math项目上卡壳。Math项目默认是以来MKL的,根据Intel 官方说法,MKL支持的CPU只有I家那些,Arm下没有找到相关资料。另一个BLAS还没去踩坑,先写到这里,跨平台计划基本上是失败了。
所以失败原因是路线错误,Tensorflow Lite已经发布,可以部署到移动端运行,据说效果还挺好。Xamarin虽然强大却在底层上不能完美欺骗第三方库(话说Unity不也和Xamarin一样是Mono吗,为什么很多DLL能跑在Xamarin上缺不能跑在Unity上)。