개발
본 문서는 개발 환경을 설정하고 여러 플랫폼의 소스에서 tensorflow-io
패키지를 구축하는 데 필요한 정보를 포함합니다. 설정이 완료되면 새로운 ops 추가에 대한 지침으로 STYLE_GUIDE를 참조합니다.
IDE 설정
TensorFlow I/O 개발을 위한 Visual Studio Code 구성 방법에 대한 지침은 이 문서를 참조합니다.
Lint
TensorFlow I/O의 코드는 Bazel Buildifier, Clang Format, Black 및 Pyupgrade에 따릅니다. 다음 명령을 사용하여 소스 코드를 검사하고 lint 문제를 식별합니다.
Bazel Buildifier 및 Clang Format의 경우, 다음 명령이 lint 오류를 자동으로 식별하고 수정합니다.
개별 linter를 사용하여 lint 검사만 하려는 경우, black
, pyupgrade
, bazel
또는 clang
을 선별적으로 위의 명령에 전달할 수 있습니다.
예를 들어, 다음을 사용하여 black
특정 lint를 검사할 수 있습니다.
Bazel Buildifier 및 Clang Format을 사용한 Lint 수정은 다음을 사용하여 수행할 수 있습니다.
black
및 pyupgrade
를 사용하여 개별 python 파일에 대해 lint 검사를 수행하려는 경우 다음을 사용할 수 있습니다.
Lint는 다음을 사용하여 개별 python 파일을 black 및 pyupgrade로 수정합니다.
Python
macOS
macOS Catalina 10.15.7에서, 시스템 제공 python 3.8.2로 tensorflow-io를 구축하는 것이 가능합니다. 이 작업을 수행하려면 tensorflow
및 bazel
이 모두 필요합니다.
참고: macOS 10.15.7의 시스템 기본 python 3.8.2는 -arch arm64 -arch x86_64
의 컴플라이어 옵션으로 발생한regex
설치 오류를 유발합니다(https://github.com/giampaolo/psutil/issues/1832에 언급된 문제와 유사함). 이 문제를 해결하려면 ARCHFLAGS="-arch x86_64"를 내보내기
하여 arm64 빌드 옵션을 제거해야 합니다.
참고: pytest를 실행할 때 python이 빌드 프로세스 후에 생성된 공유 라이브러리를 활용할 수 있도록 TFIO_DATAPATH=bazel-bin
을 전달해야 합니다.
트러블슈팅
Xcode가 설치되었지만 $ xcodebuild -version
이 예상 출력에 나타나지 않았다면, 다음과 같은 명령으로 Xcode 명령줄을 사용 가능하게 해야 합니다.
$ xcode-select -s /Applications/Xcode.app/Contents/Developer
.
변경 내용이 반영되려면 단말기 재시작이 필요할 수 있습니다.
샘플 출력:
Linux
Linux에서의 tensorflow-io 개발은 macOS와 유사합니다. 필요한 패키지는 gcc, g++, git, bazel, 및 python 3입니다. 그러나 기본 시스템 설치 버전이 아닌 새로운 버전의 gcc 또는 python이 필요할 수 있습니다.
Ubuntu 20.04
Ubuntu 20.04는 gcc/g++, git 및 python 3이 필요합니다. 다음은 Ubuntu 20.04에 종속성을 설치하고 공유 라이브러리를 구축합니다.
CentOS 8
CentOS 8용 공유 라이브러리 구축 단계는 다음을 제외하고 위의 Ubuntu 20.04와 유사합니다.
대신 이는 gcc/g++, git, unzip/which(bazel의 경우) 및 python3을 설치하는 데 사용되어야 합니다.
CentOS 7
CentOS 7에서, 기본 python과 gcc 버전은 너무 오래되어 tensorflow-io 공유 라이브러리(.so)를 구축할 수 없습니다. Developer Toolset으로 제공된 gcc 및 rh-python36을 대신 사용해야 합니다. 또한 libstdc++는 CentOS vs. devtoolset별 새로운 gcc 버전에 설치된 libstdc++의 불일치를 피하기 위해 정적으로 링크되어야 합니다.
또한 파일 시스템 플러그인에 대한 정적 링크 라이브러리의 기호 중복을 피하기 위해 특수 플래그 --//tensorflow_io/core:static_build
를 Bazel에 전달해야 합니다.
다음은 bazel, devtoolset-9, rh-python36을 설치하고 공유 라이브러리를 구축합니다.
Docker
Python 개발의 경우, 여기에서 참조 Dockerfile을 사용하여 소스에서 TensorFlow I/O 패키지 (tensorflow-io
)를 구축할 수 있습니다. 또한, 사전 구축된 개발 이미지도 다음과 같이 사용할 수 있습니다.
구축에 성공하면 패키지 파일 dist/tensorflow_io-*.whl
이 생성됩니다.
참고: Python 개발 컨테이너에서 작업하는 경우, 환경 변수 TFIO_DATAPATH
는pytest
를 실행하고 bdist_wheel
를 구축하기 위해 Bazel이 설치한 공유 C++ 라이브러리로
tensorflow-io를 지정하도록 자동으로 설정합니다. Python setup.py
은 --data [path]
를 인수로 받아들일 수 있습니다. (예: python setup.py --data bazel-bin bdist_wheel
)
참고: tfio-dev 컨테이너는 개발자들에게 작업하기 쉬운 환경을 제공해 주지만, 출시된 whl 패키지는 manylinux2010 요건으로 인해 다르게 구축되었습니다. 출시된 whl 패키지 생성 방법에 대한 자세한 내용은 [상태 및 CI 구축] 섹션을 참조합니다.
Python Wheels
다음과 같은 명령으로 bazel 구축이 완료되면 python wheel을 구축할 수 있습니다.
.whl 파일은 dist 디렉터리에서 사용할 수 있습니다. bazel-bin
이 tensorflow_io
패키지 디렉터리의 외부에 있으므로 setup.py가 필요한 공유 객체를 찾으려면 --data
변수로 bazel 바이너리 디렉터리 bazel-bin
을 전달해야 합니다.
또는 다음을 사용하여 소스 설치를 수행할 수 있습니다.
같은 이유로 TFIO_DATAPATH=bazel-bin
를 전달합니다.
-e
를 사용하여 설치하는 것은 위와 다릅니다.
이는 TFIO_DATAPATH=bazel-bin
을 사용하여도 공유 객체를 자동으로 설치되지 않습니다. 대신, 설치 후 프로그램을 실행할 때마다 다음과 같은 TFIO_DATAPATH=bazel-bin
을 전달해야 합니다.
테스트
몇몇 테스트는 테스트 컨테이너를 시작하거나 실행하기 전 관련 도구의 로컬 인스턴트를 실행해야 합니다. 예를 들어, kafka, zookeeper 및 schema-registry의 로컬 인스턴스를 시작하는 kafra 연관 테스트를 실행하려면 다음을 사용합니다.
Elasticsearch
또는 MongoDB
과 같은 도구와 연관된 Datasets
를 테스트하려면 시스템에서 도커를 사용할 수 있어야 합니다. 이런 시나리오의 경우, 다음을 사용합니다.
또한 tensorflow-io
의 몇몇 기능을 테스트하려면 데이터가 tests
디렉터리 자체에 제공되었기 때문에 추가 도구를 스핀 업할 필요가 없습니다. 예를 들어, parquet
데이터세트와 연관된 테스트를 실행하려면, 다음을 사용합니다.
R
여기에 제공된 참조 Dockerfile을 사용하여 R 패키지를 바로 테스트에 사용할 수 있습니다.
컨테이너 내에서 R 세션을 시작하고, 예시 Hadoop SequenceFile string.seq에서 SequenceFileDataset
을 인스턴스화한 다음 데이터세트의 tfdatasets 패키지가 제공하는 변환 함수를 다음과 같이 사용할 수 있습니다.