Как установить Tensorflow для C в Ubuntu 20.04 - PullRequest
0 голосов
/ 04 августа 2020

Мне кажется, что это больше вопрос Tensorflow / Bazel, чем вопрос Ubuntu, поэтому я задаю здесь.

Я просмотрел десятки страниц установки Tensorflow в Интернете, и проблемы попадают в одну из следующих категорий

Проблема 1: Большинство руководств говорят вам установить с помощью pip (примеры 1 , 2 и 3 ), но Мне нужен файл libtensorflow_ cc .so, и я не думаю, что pip устанавливает это

Проблема 2: Всегда предлагается создавать Tensorflow с использованием Bazel, но для тех, кто не знаком с bazel, это непонятно как его запустить. Например, вот 3 предлагаемые команды для установки tenorflow с использованием bazel (взяты из примеров 1 , 2 и 3 )

bazel build --config opt //tensorflow/tools/lib_package:libtensorflow
bazel build //tensorflow/tools/pip_package:build_pip_package
bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

Проблема 3: На самом деле никогда не определено, какие версии Tensorflow работают с какими версиями Ubuntu.

Проблема 4: На самом деле никогда не определено, какие версии Bazel можно использовать какие версии Tensorflow устанавливать. В предыдущем вопросе я наткнулся на кирпичную стену, где Bazel искал несуществующую библиотеку (см. Как установить libcusolver.so.11 )

MWE: В интересах предоставления минимального рабочего примера я создал этот скрипт грубой силы bash, чтобы посмотреть, смогу ли я найти жизнеспособную комбинацию Tensorflow и Bazel

#!/bin/bash

UBUNTU_VERSION=$(lsb_release -rs) # 16.04, 18.04, 20.04, etc.
UBUNTU_ARCHITECTURE=$(uname -i)   # x86 or x86_64
TARGET_TENSORFLOW_BRANCHES=(2.3.0 2.2.0 2.1.1 2.0.2)
TARGET_BAZEL_VERSIONS=(3.4.1 3.4.0 3.3.1 3.3.0 3.2.0 3.1.0 3.0.0 2.2.0 2.1.1 2.1.0 2.0.1 2.0.0 1.2.1 1.2.0 1.1.0 1.0.1 1.0.0)
TARGET_TENSOR_FLOW_FEATURE=libtensorflow_cc.so
CUDA_FULL_VERSION=$(cat /usr/local/cuda/version.txt | cut -d ' ' -f 3)
CUDA_MAJOR_VERSION=$(cat /usr/local/cuda/version.txt | cut -d ' ' -f 3|cut -d '.' -f 1)
GPU_TYPE=$(nvidia-smi --query-gpu=gpu_name --format=csv|tail -n 1)

ROOT_DIR=$(pwd)
LOG_DIR=$ROOT_DIR/logs
rm -fr $LOG_DIR
mkdir $LOG_DIR

for TARGET_TENSORFLOW_BRANCH in ${TARGET_TENSORFLOW_BRANCHES[@]}
do
    for TARGET_BAZEL_VERSION in ${TARGET_BAZEL_VERSIONS[@]}
    do
        cd $ROOT_DIR
        rm -fr tensorflow.tf-$TARGET_TENSORFLOW_BRANCH.bazel-$TARGET_BAZEL_VERSION
        mkdir tensorflow.tf-$TARGET_TENSORFLOW_BRANCH.bazel-$TARGET_BAZEL_VERSION
        cd tensorflow.tf-$TARGET_TENSORFLOW_BRANCH.bazel-$TARGET_BAZEL_VERSION

        LOG_FILE=$LOG_DIR/tf-$TARGET_TENSORFLOW_BRANCH.bazel-$TARGET_BAZEL_VERSION.txt
        BAZEL_CMD=bazel-${TARGET_BAZEL_VERSION}
        echo "Ubuntu Version           : $UBUNTU_VERSION"           &>> $LOG_FILE
        echo "Ubuntu Architecture      : $UBUNTU_ARCHITECTURE"      &>> $LOG_FILE
        echo "Target TensorFlow Branch : $TARGET_TENSORFLOW_BRANCH" &>> $LOG_FILE
        echo "Target Bazel Version     : $TARGET_BAZEL_VERSION"     &>> $LOG_FILE
        echo "Cuda Full Version        : $CUDA_FULL_VERSION"        &>> $LOG_FILE
        echo "Cuda Major Version       : $CUDA_MAJOR_VERSION"       &>> $LOG_FILE
        echo "GPU Type                 : $GPU_TYPE"                 &>> $LOG_FILE

        sudo apt-get install $BAZEL_CMD &>> $LOG_FILE
        if [[ $? == 0 ]]
        then
            echo "$BAZEL_CMD installation: SUCCESS" &>> $LOG_FILE
            BAZEL_COMMAND_INSTALLED=true
        else
            echo "$BAZEL_COMMAND installation: FAIL" &>> $LOG_FILE
            BAZEL_COMMAND_INSTALLED=false
        fi
        git clone https://github.com/tensorflow/tensorflow.git &>> $LOG_FILE
        cd tensorflow
        git checkout tags/v${TARGET_TENSORFLOW_BRANCH} &>> $LOG_FILE
        if [[ $? == 0 ]]
        then
            TENSORFLOW_BRANCH_CHECKED_OUT=true
            echo "tags/$TARGET_TENSORFLOW_BRANCH checkout: SUCCESS" &>> $LOG_FILE
        else
            echo "tags/$TARGET_TENSORFLOW_BRANCH checkout: FAIL" &>> $LOG_FILE
            TENSORFLOW_BRANCH_CHECKED_OUT=false
        fi
        ./configure
        if [[ $? == 0 ]]
        then
            echo "configure: SUCCESS" &>> $LOG_FILE
            TENSORFLOW_CONFIGURED=true
        else
            echo "configure: FAIL" &>> $LOG_FILE
            TENSORFLOW_CONFIGURED=false
        fi
        $BAZEL_CMD build\
            -c opt\
            --config=v2\
            --config=cuda\
            --config=monolithic\
            --copt=-mavx\
            --copt=-mavx2\
            --copt=-mfma\
            --copt=-msse4.1\
            --copt=-msse4.2\
            --genrule_strategy=standalone\
            --spawn_strategy=standalone\
            //tensorflow:${TARGET_TENSOR_FLOW_FEATURE} &>> $LOG_FILE

        if [[ $? == 0 ]]
        then
            echo "Bazel installation: SUCCESS" &>> $LOG_FILE
            TENSORFLOW_INSTALLED=true
        else
            echo "Bazel installation: FAIL" &>> $LOG_FILE
            TENSORFLOW_INSTALLED=false
        fi

        if [[ $BAZEL_COMMAND_INSTALLED == "true" && $TENSORFLOW_BRANCH_CHECKED_OUT == "true" && $TENSORFLOW_CONFIGURED == "true" && $TENSORFLOW_INSTALLED == "true" ]]
        then
            echo "Tensorflow installed Successfully" &>> $LOG_FILE
            exit 0
        fi
    done
done

Execution: Я вызываю сценарий так:

./install_tensor_flow.sh

Базовая системная информация: Параметры компиляции следующие

Ubuntu Version           : 20.04
Ubuntu Architecture      : x86_64
Target TensorFlow Branch : X.X.X
Target Bazel Version     : X.X.X
Cuda Full Version        : 11.0.207
Cuda Major Version       : 11
GPU Type                 : GeForce GTX 1650

Полные выходы: Тест все еще выполняется, так как он очень медленный, а этап ./configure не может быть автоматизирован и требует ввода данных пользователем. Я могу загрузить журналы, когда закончу, но это может быть излишним

Вопрос: Может ли кто-нибудь обновить сценарий bash с правильными TARGET_TENSORFLOW_BRANCH и TARGET_BAZEL_VERSION, чтобы этот сценарий работал?

...