Разработка

Документ содержит необходимую информацию для настройки среды разработки и сборки пакета tensorflow-io из исходников на различных платформах. После завершения настройки обратитесь к STYLE_GUIDE за инструкциями по добавлению новых операций.

Настройка IDE

Инструкции по настройке кода Visual Studio для разработки ввода-вывода TensorFlow см. в этом документе .

Ворс

Код ввода-вывода TensorFlow соответствует Bazel Buildifier, Clang Format, Black и Pyupgrade. Используйте следующую команду, чтобы проверить исходный код и выявить проблемы с ворсом:

# Install Bazel version specified in .bazelversion
$ curl -OL https://github.com/bazelbuild/bazel/releases/download/$(cat .bazelversion)/bazel-$(cat .bazelversion)-installer-darwin-x86_64.sh
$ sudo bash -x -e bazel-$(cat .bazelversion)-installer-darwin-x86_64.sh
$ bazel run //tools/lint:check

Для формата Bazel Buildifier и Clang следующая команда автоматически выявит и исправит любые ошибки ворса:

$ bazel run //tools/lint:lint

В качестве альтернативы, если вы хотите выполнить проверку lint только с использованием отдельных линтеров, вы можете выборочно передать black , pyupgrade , bazel или clang вышеуказанным командам.

Например, проверку black ворса можно выполнить с помощью:

$ bazel run //tools/lint:check -- black

Исправление ворса с использованием Bazel Buildifier и Clang Format можно выполнить с помощью:

$ bazel run //tools/lint:lint -- bazel clang

Проверка ворса с использованием black и pyupgrade для отдельного файла Python может быть выполнена с помощью:

$ bazel run //tools/lint:check -- black pyupgrade -- tensorflow_io/python/ops/version_ops.py

Lint исправляет отдельный файл Python с помощью black и pyupgrade, используя:

$ bazel run //tools/lint:lint -- black pyupgrade --  tensorflow_io/python/ops/version_ops.py

Питон

macOS

В macOS Catalina 10.15.7 можно собрать tensorflow-io с помощью системы Python 3.8.2. Для этого необходимы как tensorflow , так и bazel .

#!/usr/bin/env bash

# Disable arm64 build by specifying only x86_64 arch.
# Only needed for macOS's system default python 3.8.2 on macOS 10.15.7
export ARCHFLAGS="-arch x86_64"

# Use following command to check if Xcode is correctly installed:
xcodebuild -version

# Show macOS's default python3
python3 --version

# Install Bazel version specified in .bazelversion
curl -OL https://github.com/bazelbuild/bazel/releases/download/$(cat .bazelversion)/bazel-$(cat .bazelversion)-installer-darwin-x86_64.sh
sudo bash -x -e bazel-$(cat .bazelversion)-installer-darwin-x86_64.sh

# Install tensorflow and configure bazel
sudo ./configure.sh

# Add any optimization on bazel command, e.g., --compilation_mode=opt,
#   --copt=-msse4.2, --remote_cache=, etc.
# export BAZEL_OPTIMIZATION=

# Build shared libraries
bazel build -s --verbose_failures $BAZEL_OPTIMIZATION //tensorflow_io/... //tensorflow_io_gcs_filesystem/...

# Once build is complete, shared libraries will be available in
# `bazel-bin/tensorflow_io/core`, `bazel-bin/tensorflow_io/python/ops` and
# it is possible to run tests with `pytest`, e.g.:
sudo python3 -m pip install pytest
TFIO_DATAPATH=bazel-bin python3 -m pytest -s -v tests/test_serialization.py
Устранение неполадок

Если Xcode установлен, но $ xcodebuild -version не отображает ожидаемый результат, вам может потребоваться включить командную строку Xcode с помощью команды:

$ xcode-select -s /Applications/Xcode.app/Contents/Developer .

Чтобы изменения вступили в силу, может потребоваться перезагрузка терминала.

Пример вывода:

$ xcodebuild -version
Xcode 12.2
Build version 12B45b

Линукс

Разработка tensorflow-io в Linux аналогична разработке macOS. Требуемые пакеты: gcc, g++, git, bazel и python 3. Однако могут потребоваться более новые версии gcc или python, отличные от версий, установленных в системе по умолчанию.

Убунту 20.04

Для Ubuntu 20.04 требуются gcc/g++, git и python 3. Следующие действия позволят установить зависимости и собрать общие библиотеки в Ubuntu 20.04:

#!/usr/bin/env bash

# Install gcc/g++, git, unzip/curl (for bazel), and python3
sudo apt-get -y -qq update
sudo apt-get -y -qq install gcc g++ git unzip curl python3-pip

# Install Bazel version specified in .bazelversion
curl -sSOL <a href="https://github.com/bazelbuild/bazel/releases/download/">https://github.com/bazelbuild/bazel/releases/download/</a>\\((cat .bazelversion)/bazel-\\)(cat .bazelversion)-installer-linux-x86_64.sh
sudo bash -x -e bazel-$(cat .bazelversion)-installer-linux-x86_64.sh

# Upgrade pip
sudo python3 -m pip install -U pip

# Install tensorflow and configure bazel
sudo ./configure.sh

# Alias python3 to python, needed by bazel
sudo ln -s /usr/bin/python3 /usr/bin/python

# Add any optimization on bazel command, e.g., --compilation_mode=opt,
#   --copt=-msse4.2, --remote_cache=, etc.
# export BAZEL_OPTIMIZATION=

# Build shared libraries
bazel build -s --verbose_failures $BAZEL_OPTIMIZATION //tensorflow_io/... //tensorflow_io_gcs_filesystem/...

# Once build is complete, shared libraries will be available in
# `bazel-bin/tensorflow_io/core`, `bazel-bin/tensorflow_io/python/ops` and
# it is possible to run tests with `pytest`, e.g.:
sudo python3 -m pip install pytest
TFIO_DATAPATH=bazel-bin python3 -m pytest -s -v tests/test_serialization.py
ЦентОС 8

Шаги по созданию общих библиотек для CentOS 8 аналогичны описанным выше шагам для Ubuntu 20.04, за исключением того, что

sudo yum install -y python3 python3-devel gcc gcc-c++ git unzip which make

вместо этого следует использовать для установки gcc/g++, git, unzip/который (для bazel) и python3.

ЦентОС 7

В CentOS 7 версии Python и gcc по умолчанию слишком старые для создания общих библиотек tensorflow-io (.so). Вместо этого следует использовать gcc, предоставленный набором инструментов разработчика, и rh-python36. Кроме того, libstdc++ должен быть связан статически, чтобы избежать несоответствия libstdc++, установленного в CentOS, и более новой версии gcc от devtoolset.

Кроме того, в Bazel необходимо передать специальный флаг --//tensorflow_io/core:static_build чтобы избежать дублирования символов в статически связанных библиотеках для плагинов файловой системы.

Следующие команды установят bazel, devtoolset-9, rh-python36 и соберут общие библиотеки:

#!/usr/bin/env bash

# Install centos-release-scl, then install gcc/g++ (devtoolset), git, and python 3
sudo yum install -y centos-release-scl
sudo yum install -y devtoolset-9 git rh-python36 make

# Install Bazel version specified in .bazelversion
curl -sSOL <a href="https://github.com/bazelbuild/bazel/releases/download/">https://github.com/bazelbuild/bazel/releases/download/</a>\\((cat .bazelversion)/bazel-\\)(cat .bazelversion)-installer-linux-x86_64.sh
sudo bash -x -e bazel-$(cat .bazelversion)-installer-linux-x86_64.sh

# Upgrade pip
scl enable rh-python36 devtoolset-9 \
    'python3 -m pip install -U pip'

# Install tensorflow and configure bazel with rh-python36
scl enable rh-python36 devtoolset-9 \
    './configure.sh'

# Add any optimization on bazel command, e.g., --compilation_mode=opt,
#   --copt=-msse4.2, --remote_cache=, etc.
# export BAZEL_OPTIMIZATION=

# Build shared libraries, notice the passing of --//tensorflow_io/core:static_build
BAZEL_LINKOPTS="-static-libstdc++ -static-libgcc" BAZEL_LINKLIBS="-lm -l%:libstdc++.a" \
  scl enable rh-python36 devtoolset-9 \
    'bazel build -s --verbose_failures $BAZEL_OPTIMIZATION --//tensorflow_io/core:static_build //tensorflow_io/...'

# Once build is complete, shared libraries will be available in
# `bazel-bin/tensorflow_io/core`, `bazel-bin/tensorflow_io/python/ops` and
# it is possible to run tests with `pytest`, e.g.:
scl enable rh-python36 devtoolset-9 \
    'python3 -m pip install pytest'

TFIO_DATAPATH=bazel-bin \
  scl enable rh-python36 devtoolset-9 \
    'python3 -m pytest -s -v tests/test_serialization.py'

Докер

При разработке на Python можно использовать справочный файл Dockerfile для сборки пакета ввода-вывода TensorFlow ( tensorflow-io ) из исходного кода. Кроме того, также можно использовать готовые образы разработки:

# Pull (if necessary) and start the devel container
\\( docker run -it --rm --name tfio-dev --net=host -v \\){PWD}:/v -w /v tfsigio/tfio:latest-devel bash

# Inside the docker container, ./configure.sh will install TensorFlow or use existing install
(tfio-dev) root@docker-desktop:/v$ ./configure.sh

# Clean up exisiting bazel build's (if any)
(tfio-dev) root@docker-desktop:/v$ rm -rf bazel-*

# Build TensorFlow I/O C++. For compilation optimization flags, the default (-march=native)
# optimizes the generated code for your machine's CPU type.
# Reference: <a href="https://www.tensorflow.orginstall/source#configuration_options">https://www.tensorflow.orginstall/source#configuration_options</a>).

# NOTE: Based on the available resources, please change the number of job workers to:
# -j 4/8/16 to prevent bazel server terminations and resource oriented build errors.

(tfio-dev) root@docker-desktop:/v$ bazel build -j 8 --copt=-msse4.2 --copt=-mavx --compilation_mode=opt --verbose_failures --test_output=errors --crosstool_top=//third_party/toolchains/gcc7_manylinux2010:toolchain //tensorflow_io/... //tensorflow_io_gcs_filesystem/...


# Run tests with PyTest, note: some tests require launching additional containers to run (see below)
(tfio-dev) root@docker-desktop:/v$ pytest -s -v tests/
# Build the TensorFlow I/O package
(tfio-dev) root@docker-desktop:/v$ python setup.py bdist_wheel

Файл пакета dist/tensorflow_io-*.whl будет создан после успешной сборки.

Колеса Питона

После завершения сборки bazel можно собрать колеса Python с помощью следующей команды:

$ python setup.py bdist_wheel --data bazel-bin

Файл .whl будет доступен в каталоге dist. Обратите внимание, что двоичный каталог bazel bazel-bin должен быть передан с --data args, чтобы файл setup.py мог найти необходимые общие объекты, поскольку bazel-bin находится за пределами каталога пакета tensorflow_io .

Альтернативно, установку исходного кода можно выполнить с помощью:

$ TFIO_DATAPATH=bazel-bin python -m pip install .

с TFIO_DATAPATH=bazel-bin пройдено по той же причине.

Обратите внимание, что установка с -e отличается от описанной выше.

$ TFIO_DATAPATH=bazel-bin python -m pip install -e .

не будет устанавливать общий объект автоматически даже с TFIO_DATAPATH=bazel-bin . Вместо этого TFIO_DATAPATH=bazel-bin необходимо передавать каждый раз при запуске программы после установки:

$ TFIO_DATAPATH=bazel-bin python

>>> import tensorflow_io as tfio
>>> ...

Тестирование

Для некоторых тестов перед запуском требуется запустить тестовый контейнер или запустить локальный экземпляр соответствующего инструмента. Например, чтобы запустить тесты, связанные с kafka, которые запустят локальный экземпляр kafka, Zookeeper и реестр схемы, используйте:

# Start the local instances of kafka, zookeeper and schema-registry
$ bash -x -e tests/test_kafka/kafka_test.sh

# Run the tests
$ TFIO_DATAPATH=bazel-bin pytest -s -vv tests/test_kafka.py

Для тестирования Datasets , связанных с такими инструментами, как Elasticsearch или MongoDB в системе должен быть доступен докер. В таких сценариях используйте:

# Start elasticsearch within docker container
$ bash tests/test_elasticsearch/elasticsearch_test.sh start

# Run the tests
$ TFIO_DATAPATH=bazel-bin pytest -s -vv tests/test_elasticsearch.py

# Stop and remove the container
$ bash tests/test_elasticsearch/elasticsearch_test.sh stop

Кроме того, тестирование некоторых функций tensorflow-io не требует запуска каких-либо дополнительных инструментов, поскольку данные предоставляются в самом каталоге tests . Например, чтобы запустить тесты, связанные с набором данных parquet , используйте:

# Just run the test
$ TFIO_DATAPATH=bazel-bin pytest -s -vv tests/test_parquet.py

р

Здесь мы предоставляем вам справочный файл Dockerfile, чтобы вы могли использовать пакет R непосредственно для тестирования. Вы можете построить его через:

$ docker build -t tfio-r-dev -f R-package/scripts/Dockerfile .

Внутри контейнера вы можете запустить сеанс R, создать экземпляр SequenceFileDataset из примера Hadoop SequenceFile string.seq , а затем использовать любые функции преобразования, предоставляемые пакетом tfdatasets, для набора данных, как показано ниже:

library(tfio)
dataset <- sequence_file_dataset("R-package/tests/testthat/testdata/string.seq") %>%
    dataset_repeat(2)

sess <- tf$Session()
iterator <- make_iterator_one_shot(dataset)
next_batch <- iterator_get_next(iterator)

until_out_of_range({
  batch <- sess$run(next_batch)
  print(batch)
})