Python — Добавление графического процессора в Tensorflow

Я пытаюсь добавить новый оп в TensorFlow свободно после этот документ. Разница в том, что я пытаюсь реализовать операционную систему на основе графического процессора. Операция, которую я пытаюсь добавить, является операцией cuda от Вот (cuda_op.py, cuda_op_kernel.cc, cuda_op_kernel.cu.cc). Я пытаюсь скомпилировать их вне тензор потока и использования tf.load_op_library чтобы вытащить их. Я сделал некоторые изменения, так что вот мои файлы:

cuda_op_kernel.cc

#include "tensorflow/core/framework/op.h"#include "tensorflow/core/framework/shape_inference.h"#include "tensorflow/core/framework/op_kernel.h"
using namespace tensorflow;  // NOLINT(build/namespaces)

REGISTER_OP("AddOne")
.Input("input: int32")
.Output("output: int32")
.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) {
c->set_output(0, c->input(0));
return Status::OK();
});

void AddOneKernelLauncher(const int* in, const int N, int* out);

class AddOneOp : public OpKernel {
public:
explicit AddOneOp(OpKernelConstruction* context) : OpKernel(context) {}

void Compute(OpKernelContext* context) override {
// Grab the input tensor
const Tensor& input_tensor = context->input(0);
auto input = input_tensor.flat<int32>();

// Create an output tensor
Tensor* output_tensor = NULL;
OP_REQUIRES_OK(context, context->allocate_output(0, input_tensor.shape(),
&output_tensor));
auto output = output_tensor->template flat<int32>();

// Set all but the first element of the output tensor to 0.
const int N = input.size();
// Call the cuda kernel launcher
AddOneKernelLauncher(input.data(), N, output.data());

}
};

REGISTER_KERNEL_BUILDER(Name("AddOne").Device(DEVICE_GPU), AddOneOp);

cuda_op_kernel.cu

#define EIGEN_USE_GPU
#include <cuda.h>
#include <stdio.h>

__global__ void AddOneKernel(const int* in, const int N, int* out) {
for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < N;
i += blockDim.x * gridDim.x) {
out[i] = in[i] + 1;
}
}

void AddOneKernelLauncher(const int* in, const int N, int* out) {
AddOneKernel<<<32, 256>>>(in, N, out);

cudaError_t cudaerr = cudaDeviceSynchronize();
if (cudaerr != cudaSuccess)
printf("kernel launch failed with error \"%s\".\n", cudaGetErrorString(cudaerr));
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

#found from running python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())'
include_directories(/usr/local/lib/python3.5/dist-packages/tensorflow/include)

find_package(CUDA)

#set flags based on tutorial
set (CMAKE_CXX_FLAGS "--std=c++11 -fPIC -O2 -D_GLIBCXX_USE_CXX11_ABI=0")

#pass flags to c++ compiler
SET(CUDA_PROPAGATE_HOST_FLAGS ON)

#create library
cuda_add_library(
cuda_op SHARED
src/cuda_op_kernel.cu
src/cuda_op_kernel.cc
OPTIONS -gencode=arch=compute_20,code=sm_20)

#copy test file to build folder
configure_file(src/test.py test.py COPYONLY)

test.py

import tensorflow as tf
mod = tf.load_op_library('./libcuda_op.so')
with tf.Session() as sess:
start = [5,4,3,2,1]
print(start)
print(mod.add_one(start).eval())

Я могу скомпилировать и запустить test.py успешно, но вывод всегда [0 0 0 0 0], Если я заменю AddOneKernel<<<32, 256>>>(in, N, out); с for (int i = 0; i < N; i++) out[i] = in[i] + 1; а также DEVICE_GPU с DEVICE_CPUОператор выводит правильные значения [6 5 4 3 2] (с точно такой же CMakeList.txt).

Любая идея, как получить правильные значения, которые будут возвращены?

4

Решение

Я не до конца помню, где я нашел cmake для CUDA, но варианты как-то испортили компиляцию. Замена cuda_add_library в CMakeLists.txt Следующее исправило проблему.

#no options needed
cuda_add_library(
cuda_op SHARED
src/cuda_op_kernel.cu
src/cuda_op_kernel.cc)
2

Другие решения

ubuntu @ cubuntu: ~ / Рабочий стол / src / src / build $ cmake ..

— Конфигурирование сделано

— Генерация завершена

— Файлы сборки были записаны в: / home / ubuntu / Desktop / src / src / build

ubuntu @ cubuntu: ~ / Рабочий стол / src / src / build $ make

[33%] Создание объекта NVCC (устройства) CMakeFiles / cuda_op.d / cuda_op_generated_cuda_op_kernel.cu.o

Предупреждение nvcc: Архитектуры ‘compute_20’, ‘sm_20’ и ‘sm_21’ устарели и могут быть удалены в следующем выпуске (используйте -Wno-deprecated-gpu-target для подавления предупреждения).

Предупреждение nvcc: Архитектуры ‘compute_20’, ‘sm_20’ и ‘sm_21’ устарели и могут быть удалены в следующем выпуске (используйте -Wno-deprecated-gpu-target для подавления предупреждения).

Сканирование зависимостей цели cuda_op

[66%] Создание объекта CXX CMakeFiles / cuda_op.dir / cuda_op_kernel.cc.o
/home/ubuntu/Desktop/src/src/cuda_op_kernel.cc:1:17: ошибка: «tenorflow» не является именем пространства имен
использование тензорного потока пространства имен; // NOLINT (сборка / пространства имен)

0

Проверьте текущие официальные инструкции по сборке графического процессора на Tensorflow добавляет поддержку графического процессора

nvcc -std=c++11 -c -o cuda_op_kernel.cu.o cuda_op_kernel.cu.cc \
${TF_CFLAGS[@]} -D GOOGLE_CUDA=1 -x cu -Xcompiler -fPIC

g++ -std=c++11 -shared -o cuda_op_kernel.so cuda_op_kernel.cc \
cuda_op_kernel.cu.o ${TF_CFLAGS[@]} -fPIC -lcudart ${TF_LFLAGS[@]}

Как говорится, обратите внимание, что если ваши библиотеки CUDA не установлены в /usr/local/lib64вам нужно будет явно указать путь во второй (g ++) команде выше. Например, добавить -L /usr/local/cuda-8.0/lib64/ если ваша CUDA установлена ​​в /usr/local/cuda-8.0,

Кроме того, обратите внимание, что в некоторых настройках Linux необходимы дополнительные параметры для этапа компиляции nvcc. добавлять -D_MWAITXINTRIN_H_INCLUDED в командной строке nvcc, чтобы избежать ошибок от mwaitxintrin.h,

0
По вопросам рекламы [email protected]