【问题标题】:tensorflow making an op for gpu usage -- demo app doesn't worktensorflow 为 gpu 使用做一个操作——演示应用程序不起作用
【发布时间】:2016-11-05 20:45:04
【问题描述】:

我正在使用 tensorflow,创建以下文件后出现以下错误。我怀疑我提供了错误的输入类型,但我不知道如何将其更改为正确的表示形式。

dijkstra.py:

    self.maze = tf.Variable(tf.zeros([64], dtype=tf.int32), name="grid")

    print  self.maze
    if True : 
        self.grid_module = tf.load_op_library('d_grid_gpu.so')
        with tf.Session('') as sess:
            sess.run(tf.initialize_all_variables())
            self.output = self.grid_module.grid_gpu(
                    self.maze

                ).eval()

d_grid_gpu.cc:

    #include "tensorflow/core/framework/op.h"
    #include "tensorflow/core/framework/op_kernel.h"

    using namespace tensorflow;

    REGISTER_OP("GridGpu").Input("grid: int32").Output("prev: int32");    

        void run( int * in);

    class DGridGpuOp : public OpKernel {
      public:
      explicit DGridGpuOp(OpKernelConstruction* context) : OpKernel(context) {


      }

      void Compute(OpKernelContext* context) override {


        Tensor* prev_tensor = NULL;

        Tensor grid_tensor = context->input(0);

        auto grid = grid_tensor.flat<int32>();    


        OP_REQUIRES_OK(context, context->allocate_output(
                                     0, 
                                     TensorShape({64}), &prev_tensor));

        auto prev = prev_tensor->template flat<int32>();


        run(grid.data());//


      }

    };

    REGISTER_KERNEL_BUILDER(Name("GridGpu").Device(DEVICE_GPU), DGridGpuOp);

d_grid_gpu.cu.cc:

    #if GOOGLE_CUDA
    #define EIGEN_USE_GPU
    #include "third_party/eigen3/unsupported/Eigen/CXX11/Tensor"

    #include <stdio.h>
    #define SIZE    10

        __global__ void VectorAdd(  int *in,  int n)
        {
            int i = threadIdx.x;

            if (i < n)
                in[i] = in[i] + i;
        }


        void run( int * in){

            VectorAdd<<< 1, SIZE >>>(  in,  SIZE);

            /* 
            //these lines cause the segfault
            //for (int i = 0; i < SIZE; i ++) {
            //    printf("%i, " , in[i]);
            //}
            */
        }


    #endif

构建脚本:

    TF_INC=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())')


    nvcc -std=c++11 -c -o d_grid_gpu.cu.o d_grid_gpu.cu.cc \
    -I $TF_INC -D GOOGLE_CUDA=1 -x cu -Xcompiler -fPIC --expt-relaxed-constexpr

    g++ -std=c++11 -shared -o d_grid_gpu.so d_grid_gpu.cc \
    d_grid_gpu.cu.o -I $TF_INC -fPIC -lcudart -D_GLIBCXX_USE_CXX11_ABI=0 -L /usr/lib/x86_64-linux-gnu/

edit :我删除了旧的输出。

我尝试了“add_one”操作(来自 TF howto 页面),我想我可以让它工作。这让我相信我的安装没问题。这个例子编译。我猜我只是无法正确注册——或者其他什么。欢迎任何帮助。

编辑:我重新安装了 tensorflow,现在错误有点不同了

    I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally
    I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcudnn.so locally
    I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally
    I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally
    I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally
    simple dijkstra for tensorflow
    <tensorflow.python.ops.variables.Variable object at 0x7fdec57c1b50>
    I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
    I tensorflow/core/common_runtime/gpu/gpu_device.cc:951] Found device 0 with properties: 
    name: GeForce GTX 850M
    major: 5 minor: 0 memoryClockRate (GHz) 0.9015
    pciBusID 0000:0a:00.0
    Total memory: 3.95GiB
    Free memory: 3.64GiB
    I tensorflow/core/common_runtime/gpu/gpu_device.cc:972] DMA: 0 
    I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 0:   Y 
    I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 850M, pci bus id: 0000:0a:00.0)
    Traceback (most recent call last):
      File "test_op.py", line 45, in <module>
        d.eval()
      File "/home/dave/workspace/awesome-tf/test_gpu/dijkstra.py", line 57, in eval
        self.maze
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 559, in eval
        return _eval_using_default_session(self, feed_dict, self.graph, session)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 3761, in _eval_using_default_session
        return session.run(tensors, feed_dict)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 717, in run
        run_metadata_ptr)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 915, in _run
        feed_dict_string, options, run_metadata)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 965, in _do_run
        target_list, options, run_metadata)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 985, in _do_call
        raise type(e)(node_def, op, message)
    tensorflow.python.framework.errors.FailedPreconditionError: Attempting to use uninitialized value grid
         [[Node: grid/read = Identity[T=DT_INT32, _class=["loc:@grid"], _device="/job:localhost/replica:0/task:0/cpu:0"](grid)]]

    Caused by op u'grid/read', defined at:
      File "test_op.py", line 45, in <module>
        d.eval()
      File "/home/dave/workspace/awesome-tf/test_gpu/dijkstra.py", line 50, in eval
        self.maze = tf.Variable(tf.zeros([64], dtype=tf.int32), name="grid")
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/variables.py", line 215, in __init__
        dtype=dtype)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/variables.py", line 327, in _init_from_args
        self._snapshot = array_ops.identity(self._variable, name="read")
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_array_ops.py", line 1128, in identity
        result = _op_def_lib.apply_op("Identity", input=input, name=name)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 749, in apply_op
        op_def=op_def)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2380, in create_op
        original_op=self._default_original_op, op_def=op_def)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1298, in __init__
        self._traceback = _extract_stack()

    FailedPreconditionError (see above for traceback): Attempting to use uninitialized value grid
         [[Node: grid/read = Identity[T=DT_INT32, _class=["loc:@grid"], _device="/job:localhost/replica:0/task:0/cpu:0"](grid)]]

有时这是我的输出:

    I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally
    I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcudnn.so locally
    I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally
    I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally
    I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally
    simple dijkstra for tensorflow
    <tensorflow.python.ops.variables.Variable object at 0x7fba5d0dafd0>
    I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
    I tensorflow/core/common_runtime/gpu/gpu_device.cc:951] Found device 0 with properties: 
    name: GeForce GTX 850M
    major: 5 minor: 0 memoryClockRate (GHz) 0.9015
    pciBusID 0000:0a:00.0
    Total memory: 3.95GiB
    Free memory: 3.67GiB
    I tensorflow/core/common_runtime/gpu/gpu_device.cc:972] DMA: 0 
    I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 0:   Y 
    I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 850M, pci bus id: 0000:0a:00.0)
    Segmentation fault (core dumped)

这是我使用initialize_all_variables()时的情况

【问题讨论】:

标签: python tensorflow gpu


【解决方案1】:

您可能想使用tf.initialize_all_variables 进行初始化,例如: with tf.Session() as sess: sess.run(tf.initialize_all_variables())

【讨论】:

  • 我会把它放在哪里?因为我把它放在tf.Variable(...) 行之后,它什么也没做。大多数情况下我都会遇到同样的错误。
  • 更新了答案。在会话中运行其他任何内容之前,您必须先运行它。
  • 现在我遇到了分段错误。这与我使用[0,1,2,3,4,5,6,7,8,9,10] 作为self.maze 的值的输出相同。我对问题进行了一些编辑,并包含了段错误的输出。
  • 这很重要。对我来说最重要的部分是段错误不是来自 cuda 代码,而是 run() 方法中的 c 代码
  • 好,你进步了! gdb 告诉你什么? (你可能想用-c dbg 构建)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2018-03-14
  • 1970-01-01
  • 2012-06-04
  • 2022-11-10
  • 2014-05-15
相关资源
最近更新 更多