Perkembangan

Dokumen tersebut berisi informasi yang diperlukan untuk menyiapkan lingkungan pengembangan dan membangun paket tensorflow-io dari sumber di berbagai platform. Setelah penyiapan selesai, silakan lihat STYLE_GUIDE untuk panduan menambahkan operasi baru.

Pengaturan IDE

Untuk petunjuk tentang cara mengonfigurasi Visual Studio Code untuk mengembangkan TensorFlow I/O, lihat dokumen ini .

serat

Kode TensorFlow I/O sesuai dengan Bazel Buildifier, Clang Format, Black, dan Pyupgrade. Silakan gunakan perintah berikut untuk memeriksa kode sumber dan mengidentifikasi masalah lint:

# 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

Untuk Bazel Buildifier dan Clang Format, perintah berikut akan secara otomatis mengidentifikasi dan memperbaiki kesalahan lint apa pun:

$ bazel run //tools/lint:lint

Alternatifnya, jika Anda hanya ingin melakukan pemeriksaan lint menggunakan linter individual, Anda dapat meneruskan black , pyupgrade , bazel , atau clang secara selektif ke perintah di atas.

Misalnya, pemeriksaan serat tertentu black dapat dilakukan menggunakan:

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

Perbaikan lint menggunakan Bazel Buildifier dan Clang Format dapat dilakukan menggunakan:

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

Pemeriksaan serat menggunakan black dan pyupgrade untuk masing-masing file python dapat dilakukan menggunakan:

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

Lint memperbaiki file python individual dengan warna hitam dan pyupgrade menggunakan:

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

ular piton

macOS

Di macOS Catalina 10.15.7, dimungkinkan untuk membangun tensorflow-io dengan sistem yang disediakan python 3.8.2. tensorflow dan bazel diperlukan untuk melakukannya.

#!/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
Memecahkan masalah

Jika Xcode diinstal, tetapi $ xcodebuild -version tidak menampilkan output yang diharapkan, Anda mungkin perlu mengaktifkan baris perintah Xcode dengan perintah:

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

Terminal restart mungkin diperlukan agar perubahan dapat diterapkan.

Contoh keluaran:

$ xcodebuild -version
Xcode 12.2
Build version 12B45b

Linux

Pengembangan tensorflow-io di Linux mirip dengan macOS. Paket yang diperlukan adalah gcc, g++, git, bazel, dan python 3. Versi gcc atau python yang lebih baru, selain versi default yang diinstal sistem mungkin diperlukan.

Ubuntu 20.04

Ubuntu 20.04 memerlukan gcc/g++, git, dan python 3. Berikut ini akan menginstal dependensi dan membangun perpustakaan bersama di 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

Langkah-langkah membangun perpustakaan bersama untuk CentOS 8 mirip dengan Ubuntu 20.04 di atas kecuali itu

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

seharusnya digunakan untuk menginstal gcc/g++, git, unzip/which (untuk bazel), dan python3.

CentOS7

Pada CentOS 7, versi python dan gcc default terlalu lama untuk membangun perpustakaan bersama Tensorflow-io (.so). Gcc yang disediakan oleh Developer Toolset dan rh-python36 harus digunakan sebagai gantinya. Selain itu, libstdc++ harus ditautkan secara statis untuk menghindari perbedaan libstdc++ yang diinstal pada CentOS vs. versi gcc yang lebih baru oleh devtoolset.

Selain itu, tanda khusus --//tensorflow_io/core:static_build harus diteruskan ke Bazel untuk menghindari duplikasi simbol di pustaka yang tertaut secara statis untuk plugin sistem file.

Berikut ini akan menginstal bazel, devtoolset-9, rh-python36, dan membangun perpustakaan bersama:

#!/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'

Buruh pelabuhan

Untuk pengembangan Python, referensi Dockerfile di sini dapat digunakan untuk membangun paket I/O TensorFlow ( tensorflow-io ) dari sumber. Selain itu, gambar pengembangan yang dibuat sebelumnya juga dapat digunakan:

# 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

File paket dist/tensorflow_io-*.whl akan dibuat setelah build berhasil.

Roda Python

Dimungkinkan untuk membuat roda python setelah pembuatan bazel selesai dengan perintah berikut:

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

File .whl akan tersedia di direktori dist. Perhatikan bahwa direktori biner bazel bazel-bin harus diteruskan dengan --data args agar setup.py dapat menemukan objek berbagi yang diperlukan, karena bazel-bin berada di luar direktori paket tensorflow_io .

Alternatifnya, instalasi sumber dapat dilakukan dengan:

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

dengan TFIO_DATAPATH=bazel-bin diteruskan karena alasan yang sama.

Catatan menginstal dengan -e berbeda dengan yang di atas. Itu

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

tidak akan menginstal objek bersama secara otomatis bahkan dengan TFIO_DATAPATH=bazel-bin . Sebaliknya, TFIO_DATAPATH=bazel-bin harus diteruskan setiap kali program dijalankan setelah instalasi:

$ TFIO_DATAPATH=bazel-bin python

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

Pengujian

Beberapa pengujian memerlukan peluncuran wadah pengujian atau memulai instance lokal dari alat terkait sebelum dijalankan. Misalnya, untuk menjalankan pengujian terkait kafka yang akan memulai instance lokal kafka, zookeeper, dan registrasi skema, gunakan:

# 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

Menguji Datasets yang terkait dengan alat seperti Elasticsearch atau MongoDB memerlukan buruh pelabuhan untuk tersedia di sistem. Dalam skenario seperti itu, gunakan:

# 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

Selain itu, menguji beberapa fitur tensorflow-io tidak mengharuskan Anda menyiapkan alat tambahan apa pun karena datanya telah disediakan di direktori tests itu sendiri. Misalnya, untuk menjalankan pengujian terkait kumpulan data parquet , gunakan:

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

R

Kami menyediakan referensi Dockerfile di sini untuk Anda sehingga Anda dapat menggunakan paket R secara langsung untuk pengujian. Anda dapat membangunnya melalui:

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

Di dalam kontainer, Anda dapat memulai sesi R, membuat instance SequenceFileDataset dari contoh Hadoop SequenceFile string.seq , lalu menggunakan fungsi transformasi apa pun yang disediakan oleh paket tfdatasets pada kumpulan data seperti berikut:

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)
})