توسعه

این سند حاوی اطلاعات لازم برای راه اندازی محیط توسعه و ساخت بسته tensorflow-io از منبع در پلتفرم های مختلف است. پس از تکمیل راه‌اندازی، لطفاً برای دستورالعمل‌های مربوط به افزودن عملیات جدید به STYLE_GUIDE مراجعه کنید.

راه اندازی IDE

برای راهنمایی در مورد نحوه پیکربندی کد ویژوال استودیو برای توسعه TensorFlow I/O، لطفاً به این سند مراجعه کنید.

لینت

کد TensorFlow I/O مطابق با 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 Format، دستور زیر به طور خودکار هر گونه خطای پرز را شناسایی و برطرف می کند:

$ bazel run //tools/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 برای یک فایل پایتون فردی را می توان با استفاده از موارد زیر انجام داد:

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

لینت یک فایل پایتون مجزا را با رنگ سیاه و pyupgrade با استفاده از:

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

پایتون

macOS

در macOS Catalina 10.15.7، امکان ساخت tensorflow-io با پایتون 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 در لینوکس مشابه macOS است. بسته‌های مورد نیاز gcc، g++، git، bazel، و python 3 هستند. ممکن است به نسخه‌های جدیدتر gcc یا python، به غیر از نسخه‌های پیش‌فرض نصب‌شده سیستم، نیاز باشد.

اوبونتو 20.04

Ubuntu 20.04 به gcc/g++، git و python 3 نیاز دارد. موارد زیر وابستگی‌ها را نصب می‌کنند و کتابخانه‌های مشترک را در اوبونتو 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

مراحل ساخت کتابخانه های مشترک برای CentOS 8 مشابه اوبونتو 20.04 در بالا است با این تفاوت که

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

باید به جای آن برای نصب gcc/g++، git، unzip/which (برای bazel) و python3 استفاده شود.

CentOS 7

در CentOS 7، نسخه پیش‌فرض پایتون و gcc برای ساخت کتابخانه‌های مشترک tensorflow-io (.so) بسیار قدیمی است. gcc ارائه شده توسط Developer Toolset و rh-python36 باید به جای آن استفاده شود. همچنین، libstdc++ باید به صورت ایستا مرتبط باشد تا از مغایرت libstdc++ نصب شده در CentOS در مقابل نسخه gcc جدیدتر توسط devtoolset جلوگیری شود.

علاوه بر این، یک پرچم خاص --//tensorflow_io/core:static_build باید به Bazel ارسال شود تا از تکرار نمادها در کتابخانه های پیوندی استاتیک برای پلاگین های سیستم فایل جلوگیری شود.

موارد زیر 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'

داکر

برای توسعه پایتون، یک Dockerfile مرجع در اینجا می تواند برای ساخت بسته I/O 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 setup.py bdist_wheel --data bazel-bin

فایل whl. در فهرست راهنما در دسترس خواهد بود. توجه داشته باشید که دایرکتوری باینری 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
>>> ...

تست کردن

برخی از آزمایش‌ها نیاز به راه‌اندازی یک محفظه آزمایشی یا شروع یک نمونه محلی از ابزار مرتبط قبل از اجرا دارند. به عنوان مثال، برای اجرای تست‌های مرتبط با کافکا که یک نمونه محلی از کافکا، نگهبان باغ وحش و schema-registry را شروع می‌کند، از موارد زیر استفاده کنید:

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