تطوير
يحتوي المستند على المعلومات اللازمة لإعداد بيئة التطوير وبناء حزمة 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)
})