Gelişim

Belge, geliştirme ortamını ayarlamak ve tensorflow-io paketini kaynaktan çeşitli platformlarda oluşturmak için gerekli bilgileri içerir. Kurulum tamamlandıktan sonra lütfen yeni operasyonlar eklemeye ilişkin yönergeler için STYLE_GUIDE'a bakın.

IDE Kurulumu

TensorFlow I/O'yu geliştirmek için Visual Studio Code'un nasıl yapılandırılacağına ilişkin talimatlar için lütfen bu belgeye bakın.

tüysüz

TensorFlow I/O'nun kodu Bazel Buildifier, Clang Format, Black ve Pyupgrade ile uyumludur. Kaynak kodunu kontrol etmek ve tüy bırakmayan sorunları belirlemek için lütfen aşağıdaki komutu kullanın:

# 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 ve Clang Format için aşağıdaki komut, tüy bırakmayan hataları otomatik olarak tanımlayacak ve düzeltecektir:

$ bazel run //tools/lint:lint

Alternatif olarak, yalnızca bireysel linterleri kullanarak lint kontrolü yapmak istiyorsanız, yukarıdaki komutlara seçici olarak black , pyupgrade , bazel veya clang komutunu iletebilirsiniz.

Örneğin, black özel bir tüy bırakma kontrolü aşağıdakiler kullanılarak yapılabilir:

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

Bazel Buildifier ve Clang Format kullanılarak tüy düzeltmesi aşağıdakiler kullanılarak yapılabilir:

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

Bireysel bir python dosyası için black ve pyupgrade kullanarak tüy bırakma kontrolü aşağıdakiler kullanılarak yapılabilir:

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

Lint, aşağıdakileri kullanarak tek bir python dosyasını siyah ve pyupgrade ile düzeltin:

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

Python

macOS

MacOS Catalina 10.15.7'de, sistem tarafından sağlanan python 3.8.2 ile tensorflow-io oluşturmak mümkündür. Bunu yapmak için hem tensorflow hem de bazel gereklidir.

#!/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
Sorun giderme

Xcode yüklüyse ancak $ xcodebuild -version beklenen çıktıyı görüntülemiyorsa, Xcode komut satırını şu komutla etkinleştirmeniz gerekebilir:

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

Değişikliklerin etkili olması için terminalin yeniden başlatılması gerekebilir.

Örnek çıktı:

$ xcodebuild -version
Xcode 12.2
Build version 12B45b

Linux

Tensorflow-io'nun Linux'ta geliştirilmesi macOS'a benzer. Gerekli paketler gcc, g++, git, bazel ve python 3'tür. Varsayılan sistemde kurulu sürümler dışında gcc veya python'un daha yeni sürümleri de gerekli olabilir.

Ubuntu 20.04

Ubuntu 20.04, gcc/g++, git ve python 3 gerektirir. Aşağıdakiler, Ubuntu 20.04'te bağımlılıkları yükleyecek ve paylaşılan kitaplıkları oluşturacaktır:

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

CentOS 8 için paylaşılan kitaplıklar oluşturma adımları yukarıdaki Ubuntu 20.04'e benzer, ancak şu farkla:

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

bunun yerine gcc/g++, git, unzip/thing (bazel için) ve python3'ü yüklemek için kullanılmalıdır.

CentOS 7

CentOS 7'de varsayılan python ve gcc sürümü, tensorflow-io'nun paylaşılan kitaplıklarını (.so) oluşturmak için çok eski. Bunun yerine Geliştirici Araç Seti ve rh-python36 tarafından sağlanan gcc kullanılmalıdır. Ayrıca, CentOS'ta yüklü olan libstdc++ ile devtoolset tarafından daha yeni gcc sürümü arasındaki tutarsızlığı önlemek için libstdc++'ın statik olarak bağlanması gerekir.

Ayrıca, dosya sistemi eklentileri için statik olarak bağlantılı kitaplıklardaki sembollerin kopyalanmasını önlemek amacıyla Bazel'e özel bir --//tensorflow_io/core:static_build bayrağının iletilmesi gerekir.

Aşağıdakiler bazel, devtoolset-9, rh-python36'yı yükleyecek ve paylaşılan kütüphaneleri oluşturacaktır:

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

Liman işçisi

Python geliştirme için, TensorFlow I/O paketini ( tensorflow-io ) kaynaktan oluşturmak için buradaki referans Docker dosyası kullanılabilir. Ayrıca önceden oluşturulmuş geliştirme görüntüleri de kullanılabilir:

# 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

Bir derleme başarılı olduktan sonra dist/tensorflow_io-*.whl paket dosyası oluşturulacaktır.

Piton Tekerlekleri

Bazel yapısı tamamlandıktan sonra aşağıdaki komutla python tekerlekleri oluşturmak mümkündür:

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

.whl dosyası dist dizininde mevcut olacaktır. bazel-bin , tensorflow_io paket dizininin dışında olduğundan setup.py'nin gerekli paylaşım nesnelerini bulması için bazel ikili dizini bazel-bin --data args ile iletilmesi gerektiğine dikkat edin.

Alternatif olarak kaynak kurulumu şu şekilde yapılabilir:

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

TFIO_DATAPATH=bazel-bin ile aynı nedenden dolayı iletildi.

-e ile kurulumun yukarıdakilerden farklı olduğunu unutmayın.

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

TFIO_DATAPATH=bazel-bin ile bile paylaşılan nesneyi otomatik olarak kurmayacaktır. Bunun yerine, kurulumdan sonra program her çalıştırıldığında TFIO_DATAPATH=bazel-bin iletilmesi gerekir:

$ TFIO_DATAPATH=bazel-bin python

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

Test

Bazı testler, çalıştırılmadan önce bir test kapsayıcısının başlatılmasını veya ilgili aracın yerel bir örneğinin başlatılmasını gerektirir. Örneğin, kafka, zookeeper ve şema kaydının yerel bir örneğini başlatacak kafka ile ilgili testleri çalıştırmak için şunu kullanın:

# 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

Elasticsearch veya MongoDB gibi araçlarla ilişkili Datasets test edilmesi, sistemde docker'ın bulunmasını gerektirir. Bu gibi senaryolarda şunu kullanın:

# 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

Ek olarak, tensorflow-io bazı özelliklerini test etmek, veriler tests dizininin kendisinde sağlandığı için herhangi bir ek aracı çalıştırmanızı gerektirmez. Örneğin parquet veri kümesiyle ilgili testleri çalıştırmak için şunu kullanın:

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

R

R paketini doğrudan test amacıyla kullanabilmeniz için burada sizin için bir referans Docker dosyası sağlıyoruz. Bunu şu şekilde oluşturabilirsiniz:

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

Kabın içinde, R oturumunuzu başlatabilir, örnek bir Hadoop SequenceFile string.seq öğesinden bir SequenceFileDataset örneğini oluşturabilir ve ardından aşağıdaki gibi veri kümesinde tfdatasets paketi tarafından sağlanan tüm dönüştürme işlevlerini kullanabilirsiniz:

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