تطوير

يحتوي المستند على المعلومات اللازمة لإعداد بيئة التطوير وبناء حزمة tensorflow-io من المصدر على منصات مختلفة. بمجرد اكتمال الإعداد، يرجى الرجوع إلى STYLE_GUIDE للحصول على إرشادات حول إضافة عمليات جديدة.

إعداد إيد

للحصول على إرشادات حول كيفية تكوين Visual Studio Code لتطوير 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 لملف python فردي باستخدام:

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

يقوم Lint بإصلاح ملف python فردي باللون الأسود وpyupgrade باستخدام:

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

بايثون

ماك

في نظام التشغيل 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/who (لـ bazel) وpython3.

سينت أو إس 7

في CentOS 7، يعد إصدار python و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'

عامل ميناء

بالنسبة لتطوير Python، يمكن استخدام ملف Dockerfile المرجعي هنا لإنشاء حزمة TensorFlow I/O ( 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 متاحًا في دليل dist. لاحظ أنه يجب تمرير دليل bazel الثنائي bazel-bin باستخدام وسيطات --data حتى يتمكن 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 و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)
})