我通过命令安装了 TensorFlow nightly build 版本
pip install tf-nightly-gpu --prefix=/tf/install/path
当我尝试运行任何 XLA 示例时,TensorFlow 出现错误“无法找到 libdevice dir。使用‘.’” 无法将 ptx 编译到 cubin。将尝试让 GPU 驱动程序编译 ptx。未找到:/usr/local/cuda-10.0/bin/ptxas 未找到”。
所以显然 TensorFlow 找不到我的 CUDA 路径。在我的系统中,CUDA安装在/cm/shared/apps/cuda/toolkit/10.0.130中。由于我没有从源代码构建 TensorFlow,因此默认情况下 XLA 搜索文件夹 /user/local/cuda-*。但由于我没有这个文件夹,所以会出现错误。
目前我的解决方法是创建一个符号链接。我检查了tensorflow/compiler/xla/service/gpu/nvptx_compiler.cc中的TensorFlow源代码。文件中有一条注释“//用户通过--xla_gpu_cuda_data_dir显式指定的CUDA位置具有最高优先级”。那么如何将值传递给这个标志呢?我尝试了以下两个环境变量,但都不起作用:
export XLA_FLAGS="--xla_gpu_cuda_data_dir=/cm/shared/apps/cuda10.0/toolkit/10.0.130/"
export TF_XLA_FLAGS="--xla_gpu_cuda_data_dir=/cm/shared/apps/cuda10.0/toolkit/10.0.130/"
Run Code Online (Sandbox Code Playgroud)
那么如何使用标志“--xla_gpu_cuda_data_dir”呢?谢谢。
我正在阅读TensorFlow 基准测试报告中的代码.以下代码是从TFRecord文件创建TensorFlow数据集的部分:
ds = tf.data.TFRecordDataset.list_files(tfrecord_file_names)
ds = ds.apply(interleave_ops.parallel_interleave(tf.data.TFRecordDataset, cycle_length=10))
Run Code Online (Sandbox Code Playgroud)
我试图更改此代码以直接从JPEG图像文件创建数据集:
ds = tf.data.Dataset.from_tensor_slices(jpeg_file_names)
ds = ds.apply(interleave_ops.parallel_interleave(?, cycle_length=10))
Run Code Online (Sandbox Code Playgroud)
我不知道写什么?地点.parallel_interleave()中的map_func是TF_cord文件的tf.data.TFRecordDataset类的__init __(),但我不知道要为JPEG文件写什么.
我们不需要在这里进行任何转换.因为我们将压缩两个数据集,然后再进行转换.代码如下:
counter = tf.data.Dataset.range(batch_size)
ds = tf.data.Dataset.zip((ds, counter))
ds = ds.apply( \
batching.map_and_batch( \
map_func=preprocess_fn, \
batch_size=batch_size, \
num_parallel_batches=num_splits))
Run Code Online (Sandbox Code Playgroud)
因为我们不需要改造吗?我尝试使用空的map_func,但是有错误"map_func must return aDataset` object".我也尝试使用tf.data.Dataset,但是输出说Dataset是一个不允许放在那里的抽象类.
任何人都可以帮忙吗?非常感谢.
在CUDA分析器中,有两个名为dram_read_transactions和gld_transactions的度量标准.cuda profiler用户指南说"gld_transactions"表示全局内存加载事务的数量,而"dram_read_transactions"表示设备内存读取事务.我无法区分这些描述,因为读取数据意味着加载数据和全局内存很大.但这两个指标的分析结果是不同的.我用一个内核测试过.对于具有不同线程设置的相同内核,gld_transactions始终是相同的值33554432.此值是稳定的.但是对于dram_read_transactions,两个不同的线程设置导致不同的值,它们大致为4486636和4197096.对于"粗略"这个词,我的意思是这些值不稳定,因为它们从一个执行稍微改变到另一个执行.我们还可以看到dram_transactions远小于gld_transactions.所以我的问题可以在这里总结:
我想一旦我们知道问题(1)的答案,那么可以很容易地解释问题(2)和(3).所以有人能解释一下吗?提前致谢.
我正在尝试优化称为LAMMPS的MPI + CUDA基准测试的性能(https://github.com/lammps/lammps).现在我运行两个MPI进程和两个GPU.我的系统有两个插座,每个插座连接到2个K80.由于每个K80内部包含2个GPU,因此每个插槽实际连接到4个GPU.但我只使用一个插槽中的2个内核和连接到该插槽的2个GPU(1个K80).MPI编译器是MVAPICH2 2.2rc1,CUDA编译器版本是7.5.
那是背景.我分析了应用程序,发现通信是性能瓶颈.我怀疑是因为没有应用GPUDirect技术.所以我切换到MVAPICH2-GDR 2.2rc1并安装了所有其他必需的库和工具.但MVAPICH2-GDR需要的Infiniband接口卡,不可用我的系统上,所以我必须运行时错误"通道初始化失败.在系统上未找到有效的HCAs".根据我的理解,Infiniband的卡则不需要,如果我们只是想在一个节点上使用1 K80内的GPU,因为K80具有这两个GPU的内部PCIe交换机.这些都是我的疑惑.为了清楚地说明问题,我将其列出如下:
在我的系统中,一个插座连接到两个K80.如果一个K80中的两个GPU需要与另一个K80中的GPU通信,那么如果我们想使用GPUDirect,我们必须拥有IB卡,是吗?
如果我们只需要在1 K80内使用两个GPU,那么这两个GPU之间的通信不需要IB卡,对吗?但是,MVAPICH2-GDR至少需要一张IB卡.那么有什么解决方法可以解决这个问题吗?或者我必须在系统上插入IB卡?