Troubleshooting

这里是Linux故障排除说明。有一个特定的MacOS部分。

Why do I get a network error when I install Theano

如果你在代理后面,你必须在开始安装之前做一些额外的配置步骤。您必须将环境变量http_proxy设置为代理地址。使用bash可以使用命令export http_proxy =“http:// user:pass@my.site:port /”还提供了--proxy=[user:pass@]url:port参数。[user:pass@]部分是可选的。

How to solve TypeError: object of type ‘TensorVariable’ has no len()

如果你收到以下错误,那是因为Python函数__ len __不能在Theano变量上实现:

TypeError: object of type 'TensorVariable' has no len()

Python要求__ len __返回一个整数,但它不能做,因为Theano的变量是符号的。但是,var.shape [0]可以用作解决方法。

此错误消息不能更加明确,因为Python内部的相关方面无法修改。

How to solve Out of memory Error

偶尔,当有足够的报告时,Theano可能无法分配内存:

分配X字节的设备存储器(内存不足)时出错。驱动程序报告Y字节空闲和Z总。

其中X远小于Y和Z(即X

当操作需要分配大的连续内存块但没有足够大小的块可用时,会出现这种情况。

GPU没有虚拟内存,因此所有分配必须分配给连续的内存区域。CPU没有这个限制,因为或者他们支持虚拟内存。GPU上的多个分配可导致存储器碎片化,这可使得在随后的存储器分配期间找到足够大小的存储器的连续区域更加困难。

一个已知的例子与将数据写入共享变量有关。更新共享变量时如果数据大小与已分配给变量的空间大小不匹配,Theano将分配新空间。这可能导致存储器碎片,这意味着即使空闲存储器总体足够大,具有足够容量的连续存储器块也可能不可用。

theano.function returns a float64 when the inputs are float32 and int{32, 64}

应该注意,在函数内部使用float32和int {32,64}将提供float64作为输出。

由于GPU不能计算这种输出,因此最好不要一起使用这些类型。

为了帮助你找到float64在哪里创建,请参阅warn_float64 Theano标志。

How to test that Theano works properly

检查可能出错的简单方法是确保THEANO_FLAGS具有所需的值以及~/.theanorc

另外,请检查以下输出:

ipython
import theano
theano.__file__
theano.__version__

一旦你安装了Theano,你应该运行测试套件。

python -c "import numpy; numpy.test()"
python -c "import scipy; scipy.test()"
THEANO_FLAGS=''; python -c "import theano; theano.test()"

所有的Theano测试应该通过(跳过的测试和已知的故障是正常的)。如果您机器上的某些测试失败,您可以告诉我们theano-users@googlegroups.com邮件列表出了什么问题。

警告

Theano的测试应该device=cudadevice=gpu运行NOT,否则它们将失败。如果需要,测试自动使用gpu。如果你不想让Theano在运行测试时使用gpu,你可以将config.device设置为cpuconfig.force_device True

Why is my code so slow/uses so much memory

有一些事情,你可以轻松地做,以改变速度和内存使用之间的权衡。没什么说的,这影响CPU和GPU内存使用。

可以加速和降低内存使用:

  • cuDNN默认cuDNN卷积使用较少
    内存然后Theano版本。但是一些标志允许它使用更多的内存。仅GPU。
  • 短期内,多GPU。

可能会提高内存使用,但加快计算:

  • config.gpuarray.preallocate = 1#为新后端(GpuArray Backend)预分配GPU内存,然后以智能方式管理它。不会提高很多内存使用,但如果你在GPU内存的限制你可能需要指定一个较低的值。仅GPU。
  • config.lib.cnmem = 1#在旧后端等效(CUDA backend)。仅GPU。
  • config.allow_gc = False
  • config.optimizer_excluding = low_memory,GPU目前只有。

可以降低内存使用,但提高计算时间:

  • config.scan.allow_gc = True#如果使用config.lib.cnmem,可能不会显着减慢。
  • config.scan.allow_output_prealloc = False
  • 使用batch_normalization()它使用更少的内存,然后构建相应的Theano图。
  • 停用一个或扫描更多优化:
    • optimizer_excluding=scanOp_pushout_seqs_ops
    • optimizer_excluding=scan_pushout_dot1
    • optimizer_excluding=scanOp_pushout_output
  • 禁用所有标记为提高内存使用率的优化:optimizer_excluding=more_mem(目前只有上述3个扫描优化)
  • float16

如果你想在计算期间分析内存使用情况,最简单的是让内存错误在Theano执行期间发生,并使用Theano标志exception_verbosity=high

How do I configure/test my BLAS library

有许多方法配置BLAS为Theano。这是通过Theano标志blas.ldflagsconfig – Theano Configuration)完成的。默认是使用NumPy中的BLAS安装信息,可通过numpy.distutils.__config__.show()访问。你可以告诉theano使用不同版本的BLAS,如果你没有用快速BLAS编译NumPy,或者如果NumPy是用BLAS的静态库编译的(后者在Theano不支持)。

The short way to configure the Theano flags blas.ldflags is by setting the environment variable THEANO_FLAGS to blas.ldflags=XXX (in bash export THEANO_FLAGS=blas.ldflags=XXX)

${HOME}/.theanorc文件是设置像这样的相对永久选项的最简单的方法。使用ldflags条目添加[blas]部分,如下所示:

# other stuff can go here
[blas]
ldflags = -lf77blas -latlas -lgfortran #put your flags here

# other stuff can go here

有关~/.theanorc格式化以及您可以在其中放置的配置选项的详细信息,请参阅config – Theano Configuration

这里有一些不同的方式配置BLAS:

0)不做任何事情,并使用默认配置,即链接到构建NumPy的同一BLAS。这在NumPy用静态库编译的情况下不起作用(例如,ATLAS被默认地编译为静态库)。

1)禁用BLAS的使用,并退回NumPy的点产品。为此,将blas.ldflags的值设置为空字符串(例如:export THEANO_FLAGS = blas.ldflags = / t2>)。根据你的Theano代码执行的矩阵操作的类型,这可能会减慢一些事情(直接与BLAS链接)。

2)如果NumPy版本(与Theano链接相对)不起作用,您可以安装BLAS的默认(参考)版本。If you have root or sudo access in fedora you can do sudo yum install blas blas-devel. 在Ubuntu / Debian sudo apt-get 安装 libblas-dev 然后使用Theano标志blas.ldflags=-lblas请注意,blas的默认版本未优化。使用优化版本可以在我们使用的BLAS函数中提高10倍速的加速。

3)安装ATLAS库。ATLAS是BLAS的开源优化版本。你可以在大多数操作系统上安装一个预编译的版本,但如果你愿意投入时间,你可以编译它有一个更快的版本(我们已经看到加速高达3倍,特别是在最近的电脑,预编译)。在Fedora上,sudo yum 安装 atlas-devel在Ubuntu下,sudo apt-get install libatlas-base-dev libatlas- libatlas3gf-sse2,如果您的CPU支持SSE2指令。然后将Theano标记blas.ldflags设置为-lf77blas -latlas -lgfortran注意,这些标志有时与OS相关。

4)使用更快的版本,如MKL,GOTO,...你在你自己安装它。请参阅该软件的文档并正确设置Theano标志blas.ldflags(例如,对于MKL,可能是-lmkl -lguide -lpthread-lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core lguide -liomp5 -lmkl_mc -lpthread)。

注意

确保你的BLAS库可用作动态可加载库。ATLAS通常仅作为静态库安装。Theano不能使用这个静态库。你的ATLAS安装可能需要修改,以提供动态可加载的库。(在Linux上,这通常意味着名称以.so结尾的库。在Windows上,这将是一个.dll,在OS-X它可能是一个.dylib或一个.so。)。

这可能只是一个问题的方式Theano传递编译参数到g ++,但问题还没有解决。

注意

如果您在与MKL连接时遇到问题,Intel Line AdvisorMKL用户指南可以帮助您找到正确的标志。

注意

如果你有错误,其中包含“gfortran”,就像这一个:

ImportError:('/home/Nick/.theano/compiledir_Linux-2.6.35-31-generic-x86_64-with-Ubuntu-10.10-maverick-2.6.6/tmpIhWJaI/0c99c52c82f7ddc775109a06ca04b360.so:undefined symbol:_gfortran_st_write_done'

问题可能是NumPy与不同的blas,然后一个当前可用(可能是ATLAS)链接。有2个可能的修复:

  1. 卸载ATLAS并安装OpenBLAS。
  2. 使用Theano标志“blas.ldflags = -lblas -lgfortran”

1)是更好的OpenBLAS更快,那么ATLAS和NumPy可能已经链接到它。所以你不需要任何其他变化的Theano文件或Theano配置。

Testing BLAS

建议测试你的Theano / BLAS集成。有许多版本的BLAS存在,它们之间可以有高达10倍的速度差异。此外,使Theano直接针对BLAS而不是使用NumPy / SciPy作为中间层来减少计算开销。这对于BLAS调用gergemv和小gemm操作很重要(当你使用dot()运行Theano / BLAS速度测试:

python `python -c "import os, theano; print os.path.dirname(theano.__file__)"`/misc/check_blas.py

这将在多个CPU和GPU上打印具有不同版本的BLAS /线程数的表。它还将打印一些Theano / NumPy配置信息。然后,它将打印相同基准的运行时间为您的安装。尝试找到一个类似于您的表中的CPU,并检查单线程定时大致相同。

Theano应链接到Blas的并行版本,并尽可能使用所有内核。默认情况下,它应该使用所有内核。设置环境变量“OMP_NUM_THREADS = N”以指定使用N个线程。

Mac OS

虽然上述步骤应该足够,在Mac上运行Theano有时可能会导致意外崩溃,通常是由于多个版本的Python或其他系统库。如果你遇到这样的问题,你可以尝试以下。

  • 您可以确保MacPorts共享库在运行时优先使用导出 LD_LIBRARY_PATH = / opt / local / lib:$ LD_LIBRARY_PATH为了在编译时做同样的事情,你可以添加到你的~/.theanorc

    [gcc]
    cxxflags = -L/opt/local/lib
    
  • 更一般地,为了调查库问题,您可以使用.so文件下的otool -L 你的~/.theano目录。这将列出共享库依赖项,并可能有助于识别不兼容性。

如果你有麻烦安装和运行Theano在你的Mac上,请通知我们。我们特别感兴趣的是我们错过列表,备用安装步骤,GPU指令以及在您的平台上失败的测试的依赖项(使用theano-users@googlegroups.com邮件列表,但是注意你必须首先注册它,通过去theano-users)。