Desarrollo
El documento contiene la información necesaria para configurar el entorno de desarrollo y construcción de la tensorflow-io
paquete de la fuente en varias plataformas. Una vez completada la instalación, consulte el STYLE_GUIDE para las instrucciones sobre la adición de nuevas operaciones.
Configuración de IDE
Para obtener instrucciones sobre cómo configurar el código de Visual Studio para el desarrollo de TensorFlow de E / S, consulte este documento .
Hilas
El código de TensorFlow I/O se ajusta a Bazel Buildifier, Clang Format, Black y Pyupgrade. Utilice el siguiente comando para verificar el código fuente e identificar problemas de pelusa:
# 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
Para Bazel Buildifier y Clang Format, el siguiente comando identificará y corregirá automáticamente cualquier error de pelusa:
$ bazel run //tools/lint:lint
Alternativamente, si sólo desea realizar la comprobación de las pelusas con borra de individuales, entonces puede pasar selectivamente black
, pyupgrade
, bazel
o clang
a los comandos anteriores.
Por ejemplo, un black
de verificación de pelusa específica puede hacerse utilizando:
$ bazel run //tools/lint:check -- black
La corrección de pelusa usando Bazel Buildifier y Clang Format se puede hacer usando:
$ bazel run //tools/lint:lint -- bazel clang
Pelusa comprobar usando black
y pyupgrade
para un archivo de Python individuo se puede hacer usando:
$ bazel run //tools/lint:check -- black pyupgrade -- tensorflow_io/python/ops/version_ops.py
Lint arregla un archivo python individual con negro y pyupgrade usando:
$ bazel run //tools/lint:lint -- black pyupgrade -- tensorflow_io/python/ops/version_ops.py
Pitón
Mac OS
En macOS Catalina 10.15.7, es posible compilar tensorflow-io con Python 3.8.2 proporcionado por el sistema. Tanto tensorflow
y bazel
son necesarios para hacerlo.
#!/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
Solucionar problemas
Si se ha instalado Xcode, pero $ xcodebuild -version
no muestra el resultado esperado, es posible que tenga que habilitar la línea de comandos Xcode con el comando:
$ xcode-select -s /Applications/Xcode.app/Contents/Developer
.
Es posible que sea necesario reiniciar el terminal para que los cambios surtan efecto.
Salida de muestra:
$ xcodebuild -version
Xcode 12.2
Build version 12B45b
linux
El desarrollo de tensorflow-io en Linux es similar al de macOS. Los paquetes requeridos son gcc, g ++, git, bazel y python 3. Sin embargo, es posible que se requieran versiones más nuevas de gcc o python, distintas de las versiones instaladas por defecto del sistema.
Ubuntu 20.04
Ubuntu 20.04 requiere gcc / g ++, git y python 3. Lo siguiente instalará las dependencias y creará las bibliotecas compartidas en 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
CentOS 8
Los pasos para crear bibliotecas compartidas para CentOS 8 son similares a los de Ubuntu 20.04 anterior, excepto que
sudo yum install -y python3 python3-devel gcc gcc-c++ git unzip which make
debe usarse en su lugar para instalar gcc/g++, git, unzip/which (para bazel) y python3.
CentOS 7
En CentOS 7, la versión predeterminada de python y gcc son demasiado antiguas para crear las bibliotecas compartidas de tensorflow-io (.so). En su lugar, debe usarse el gcc proporcionado por Developer Toolset y rh-python36. Además, libstdc ++ tiene que estar vinculado estáticamente para evitar la discrepancia de libstdc ++ instalado en CentOS frente a la versión más reciente de gcc por devtoolset.
Además, una bandera especial --//tensorflow_io/core:static_build
tiene que ser pasado a Bazel con el fin de evitar la duplicación de símbolos en las bibliotecas vinculados estáticamente para plugins del sistema de archivos.
Lo siguiente instalará bazel, devtoolset-9, rh-python36 y compilará las bibliotecas compartidas:
#!/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'
Estibador
Para el desarrollo de Python, una referencia Dockerfile aquí puede ser usado para construir el paquete TensorFlow de E / S ( tensorflow-io
) de la fuente. Además, las imágenes de desarrollo preconstruidas también se pueden usar:
# 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
Un archivo de paquete dist/tensorflow_io-*.whl
Se genera después de una acumulación tiene éxito.
Ruedas de pitón
Es posible construir ruedas de Python después de completar la compilación de bazel con el siguiente comando:
$ python setup.py bdist_wheel --data bazel-bin
El archivo .whl estará disponible en el directorio dist. Tenga en cuenta el bazel binaria directorio bazel-bin
tiene que pasar con --data
args con el fin de setup.py para localizar los objetos comparten necesarias, como bazel-bin
se encuentra fuera de la tensorflow_io
directorio del paquete.
Alternativamente, la instalación de origen se puede hacer con:
$ TFIO_DATAPATH=bazel-bin python -m pip install .
con TFIO_DATAPATH=bazel-bin
pasado por la misma razón.
Nota instalar con -e
es diferente de la anterior. El
$ TFIO_DATAPATH=bazel-bin python -m pip install -e .
no instalará compartida objeto automáticamente incluso con TFIO_DATAPATH=bazel-bin
. En su lugar, TFIO_DATAPATH=bazel-bin
tiene que pasar cada vez que el programa se ejecuta después de la instalación:
$ TFIO_DATAPATH=bazel-bin python
>>> import tensorflow_io as tfio
>>> ...
Pruebas
Algunas pruebas requieren iniciar un contenedor de prueba o iniciar una instancia local de la herramienta asociada antes de ejecutarse. Por ejemplo, para ejecutar pruebas relacionadas con kafka que iniciarán una instancia local de kafka, zookeeper y schema-registry, use:
# 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
Pruebas de Datasets
asociados con herramientas como Elasticsearch
o MongoDB
requieren ventana acoplable a estar disponible en el sistema. En tales escenarios, utilice:
# 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
Además, las pruebas de algunas de las características de tensorflow-io
no le obliga a girar ninguna herramienta adicional que los datos se hayan proporcionado en el tests
propio directorio. Por ejemplo, para ejecutar las pruebas relacionadas con el parquet
del conjunto de datos, utilice:
# Just run the test
$ TFIO_DATAPATH=bazel-bin pytest -s -vv tests/test_parquet.py
R
Proporcionamos una referencia Dockerfile aquí para usted para que pueda utilizar el paquete R directamente para la prueba. Puedes construirlo a través de:
$ docker build -t tfio-r-dev -f R-package/scripts/Dockerfile .
En el interior del contenedor, puede iniciar la sesión de R, una instancia de un SequenceFileDataset
de un ejemplo de Hadoop SequenceFile string.seq , y luego usar cualquier funciones de transformación proporcionados por paquete tfdatasets en el conjunto de datos como la siguiente:
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)
})