現在,TensorFlow 2.2以降のGolang用のTensorFlowライブラリはビルドできない状態になっています. ビルドできないと困るのでビルドできる方法を紹介します. 今回はTensorFlow 2.5用の解決方法を紹介しますが,他のバージョンでもできると思います(たぶん).
問題
go get -d github.com/tensorflow/tensorflow/tensorflow/go
TensorFlowを追加しようとするとエラーになります
package github.com/tensorflow/tensorflow/tensorflow/go/core/core_protos_go_proto:
cannot find package "github.com/tensorflow/tensorflow/tensorflow/go/core/core_protos_go_proto"
in any of: /usr/local/go/src/github.com/tensorflow/tensorflow/tensorflow/go/core/core_protos_go_proto (from $GOROOT)
/go/src/github.com/tensorflow/tensorflow/tensorflow/go/core/core_protos_go_proto (from $GOPATH)
解決方法
解決方法をDockerfileで示します.
流れとしてはTensorFlowを失敗を無視してgo get
して,TensorFlowのソースコードをビルドします.
数時間ほどで出来上がったTensorFlowを/usr/local/lib/にコピーして,生成されたコードをコピーします.
すると,テストが通るようになります.
go mod
を使っている場合はinit
して,アプリケーション側でローカルのTensorFlowを見るようにします.
FROM ubuntu:focal
ENV DEBIAN_FRONTEND=noninteractive
SHELL ["/bin/bash", "-c"]
# App
# Goは1.16からモジュール強制になりTensorFlowを使えなくなるので1.15を使う
RUN apt-get update \
&& apt-get install -y apt-utils \
&& apt-get upgrade -y \
&& apt-get install -y \
gcc \
software-properties-common \
git \
wget \
curl \
swig \
python3-numpy \
python3-distutils \
gnupg \
protobuf-compiler \
&& wget https://golang.org/dl/go1.15.14.linux-amd64.tar.gz -P /tmp/ \
&& tar -C /usr/local -xzf /tmp/go1.15.14.linux-amd64.tar.gz \
&& apt-get clean -y \
&& apt-get autoremove -y \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /tmp/*
ENV PATH=$PATH:/usr/local/go/bin
ENV LIBRARY_PATH=/usr/local/lib${LIBRARY_PATH:+:$LIBRARY_PATH}
ENV LD_LIBRARY_PATH=/usr/local/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
ENV PYTHON_BIN_PATH=/usr/bin/python3
ENV PYTHON_LIB_PATH=/usr/lib/python3/dist-packages
ENV TF_NEED_ROCM=0
ENV TF_NEED_CUDA=0
ENV TF_DOWNLOAD_CLANG=0
ENV CC_OPT_FLAGS=-Wno-sign-compare
ENV TF_SET_ANDROID_WORKSPACE=0
# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/go/README.md
RUN curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > /etc/apt/trusted.gpg.d/bazel.gpg \
&& echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | tee /etc/apt/sources.list.d/bazel.list \
&& apt-get update && apt-get install -y bazel bazel-3.7.2 \
&& (go get -d github.com/tensorflow/tensorflow/tensorflow/go || true) \
&& pushd $(go env GOPATH)/src/github.com/tensorflow/tensorflow \
&& chmod +x configure \
&& ./configure \
&& ln -s /usr/bin/python3 /usr/bin/python \
&& bazel build -c opt --verbose_failures //tensorflow:libtensorflow.so \
&& cp $(go env GOPATH)/src/github.com/tensorflow/tensorflow/bazel-bin/tensorflow/libtensorflow.so /usr/local/lib \
&& cp $(go env GOPATH)/src/github.com/tensorflow/tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so.2 /usr/local/lib/libtensorflow_framework.so \
&& ldconfig \
&& go generate github.com/tensorflow/tensorflow/tensorflow/go/op \
&& go test github.com/tensorflow/tensorflow/tensorflow/go \
&& cp -R tensorflow/go/vendor/github.com/tensorflow/tensorflow/tensorflow/go/core tensorflow/go/core \
&& cp -R tensorflow/go/vendor/github.com/tensorflow/tensorflow/tensorflow/go/stream_executor tensorflow/go/ \
&& go test github.com/tensorflow/tensorflow/tensorflow/go \
&& go mod init github.com/tensorflow/tensorflow \
&& apt-get clean -y \
&& apt-get autoremove -y \
&& rm -rf /var/lib/apt/lists/*
# COPY app app
# ローカルのパスを見に行くようにする
RUN go mod edit -replace github.com/tensorflow/tensorflow=$GOPATH/src/github.com/tensorflow/tensorflow
GPUを使う場合の設定
上記はCPUのみを使う場合ですが,GPU用のイメージはCUDAインストール後以下の設定でビルドできます. 詳しくは,https://github.com/tensorflow/tensorflow/blob/master/configure.pyを読むと早いです.
ENV PYTHON_BIN_PATH=/usr/bin/python3
ENV PYTHON_LIB_PATH=/usr/lib/python3/dist-packages
ENV TF_NEED_ROCM=0
ENV TF_NEED_CUDA=1
ENV TF_NEED_TENSORRT=1
# https://developer.nvidia.com/cuda-gpus
ENV TF_CUDA_COMPUTE_CAPABILITIES=7.0,7.5
ENV TF_CUDA_CLANG=0
ENV GCC_HOST_COMPILER_PATH=/usr/bin/gcc
ENV CC_OPT_FLAGS=-Wno-sign-compare
ENV TF_SET_ANDROID_WORKSPACE=0