Как добавить внешние заголовочные файлы во время сборки bazel/tenorflow

Я пытаюсь добавить внешний файл заголовка (например, файл заголовка OpenCL) для экспериментов с тензорным потоком. Я попытался добавить это в файл BUILD в файле tenorflow/core/BUILD:

# This includes implementations of all kernels built into TensorFlow.
cc_library(
    name = "all_kernels",
    visibility = ["//visibility:public"],
    copts = tf_copts() + ["-Ithird_party/include"],    <==== this is the line I added

Я также создал в этом каталоге программную ссылку на расположение этих файлов заголовков из драйвера OpenCL (в тензорном потоке /third_party) (например, ln -s /opt/opencl/), но он по-прежнему жалуется, что не нашел этот файл заголовков.

Если я добавляю файл внешнего заголовка напрямую (например, /opt/opencl/CL/), он жалуется, что внешние файлы не могут быть включены (или что-то подобное).

У меня нет пароля root для копирования этих файлов заголовков в / usr / include /.

Может кто-нибудь объяснить, как именно сделать внешние заголовочные файлы в tenorflow для сборки?

Спасибо за любую быструю помощь.

3 ответа

Я столкнулся с подобной проблемой, когда создавал TensorFlow с Intel MKL и мне пришлось добавить заголовки MKL. Мое решение заключается в следующем:

  1. Создайте символическую ссылку на ваши заголовки в папке third_party, например:

    <your tensorflow folder>/third_party/opencl/include -> /opt/OpenCL/include
    

    с командой:

    ln -s /opt/OpenCL/include <your tensorflow folder>/third_party/opencl
    
  2. Создать простой файл BUILD в <your tensorflow folder>/third_party/opencl папка:

    cc_library(
        name = "opencl",
        hdrs = glob(["include/CL/*.h"]),
        visibility = ["//visibility:public"],
    )
    
  3. Добавьте deps в целевую библиотеку:

    cc_library(
        name = "all_kernels",
        visibility = ["//visibility:public"],
        copts = tf_copts() + ["-Ithird_party/opencl/include"],
        deps = [
            "//third_party/opencl", 
            ...
        ],
    )
    
  4. Не забудьте добавить опции компилятора в целевую библиотеку, как показано выше, или просто в качестве флага для bazel:

     bazel build --copt="-Ithird_party/opencl/include" ...
    

Вы должны добавить файлы как зависимость этого правила.

IIUC, у вас есть следующая структура:

tensorflow/
  BUILD
  WORKSPACE
  tensorflow/
    core/
      BUILD
  third_party/
    include -> /opt/opencl/CL # or something like that

Вы хотите показать файлы.h так, чтобы Bazel мог понять / зависеть от них, поэтому откройте tensorflow/BUILD файл и добавьте следующее:

cc_library(
    name = "opencl",
    hdrs = glob(["third_party/include/*.h"]),
    visibility = ["//visibility:public"],
)

Это создает библиотеку C++ из файлов.h в файле third_party/include, от которой можно зависеть из любого места в исходном дереве.

Теперь иди в свой tensorflow/core/BUILD файл и добавьте зависимость к cc_library там:

cc_library(
    name = "all_kernels",
    visibility = ["//visibility:public"],
    copts = tf_copts() + ["-Ithird_party/include"],
    deps = [
        "//:opencl", 
        # plus any other deps
    ],
)

Установка copts просто меняет флаги при запуске gcc. Добавление //:opencl к зависимостям говорит Bazel сделать эти файлы доступными при запуске gcc.

Bazel старается быть очень строгим, чтобы убедиться, что его сборки включают только те файлы, о которых он знает, чтобы убедиться, что они воспроизводимы. К сожалению, это может затруднить эксперименты. Правильный способ решения проблемы - создать файл BUILD и правило для заголовков, которые вы хотите включить. Вы можете взломать что-нибудь, возиться с папками, сгенерированными bazel-*, но я не рекомендую это делать.

Другие вопросы по тегам