Узнайте, как настроить среды anaconda для разных версий CUDA, TensorFlow и PyTorch

Очень жаль, что первый опыт, который большинство людей испытывает при глубоком обучении, - это проводить дни, пытаясь выяснить, почему модель, которую они скачали с GitHub, просто… не… работает….

Проблемы с зависимостями невероятно распространены при попытке запустить готовую модель. Самая проблемная из них - наличие правильной версии CUDA для TensorFlow. TensorFlow известен уже несколько лет, что означает, что даже новые выпускаемые модели могут использовать старую версию TensorFlow. Это не будет проблемой, за исключением того, что кажется, что каждая версия TensorFlow требует определенной версии CUDA, где все остальное несовместимо. К сожалению, установка нескольких версий CUDA на одном компьютере может быть настоящей проблемой!

После многих лет головной боли, благодаря помощи Anaconda я наконец понял, что установить TensorFlow и именно ту версию CUDA можно так же просто, как:

conda create --name tf
conda activate tf
conda install tensorflow-gpu

Conda против виртуальных сред pip

Раньше я использовал только pip из-за плохого понимания разницы между pip и conda. На самом деле просто зная, что pip является «официальным» менеджером пакетов Python.

Основное различие между ними состоит в том, что conda среды предназначены не только для пакетов Python. Такие библиотеки, как CUDA, можно установить в изолированной среде. С другой стороны, некоторые пакеты не существуют в conda, и вам придется установить их через pip, что является одной из причин, по которой люди могут отклониться от conda. Использование одновременно conda и pip может быть непростым делом, но я дам несколько советов, как справиться с этим позже в этом посте.

Если вы хотите начать использовать conda, следуйте инструкциям по установке anaconda по этой ссылке. Базовые команды для таких вещей, как создание, активация и удаление сред, очень похожи между pip и conda.

Создайте среду

# pip
virtualenv env_name
# conda
conda create --name env_name

Активировать среду

# pip
source /path/to/env_name/bin/activate
# conda
conda activate env_name

Примечание. После установки anaconda автоматически создает и активирует базовую среду. Рекомендуется создавать новые среды самостоятельно. Отключите автоматическую активацию с помощью этой команды:

conda config --set auto_activate_base false

Удалить среду

# pip
cd /path/to/env_name
rm -rf env_name
# conda
conda env remove -n env_name

Примеры

Ниже приведены несколько примеров того, как загружать модели TensorFlow и PyTorch, существующие в зоопарке моделей FiftyOne. FiftyOne - это инструмент с открытым исходным кодом для инженеров машинного обучения, позволяющий хранить свои данные, метки и прогнозы моделей таким образом, чтобы их можно было легко изменять, визуализировать и анализировать. В FiftyOne входит зоопарк моделей компьютерного зрения, которые доступны с помощью одной строчки кода и служат для легкого тестирования наших conda настроек среды.

Примечание. Для установки TensorFlow с функциями графического процессора требуется карта с поддержкой CUDA. Вот список графических процессоров с поддержкой CUDA.

Использование моделей Tensorflow 2.X

conda create --name tf2
conda activate tf2
conda install tensorflow-gpu

FiftyOne поддерживает наборы данных изображений и видео в различных форматах. В этих примерах у меня просто есть каталог изображений, которые я буду загружать в FiftyOne для создания прогнозов модели. Вы можете использовать свой собственный каталог изображений, если вы передадите /path/to/dataset и укажете, что вы используете тип набора данных fiftone.types.ImageDirectory.

Я использую интерфейс командной строки (CLI) FiftyOne для большей части работы в этом примере.

pip install fiftyone
# Create a dataset from the given data on disk
fiftyone datasets create \
    --name my_dataset \
    --dataset-dir /path/to/dataset \
    --type fiftyone.types.ImageDirectory

Я могу загрузить модель, которую хочу использовать, а затем проверить, удовлетворены ли требования к ней.

# Download a model from the zoo
fiftyone zoo models download centernet-hg104-512-coco-tf2
# Ensure you installed all requirements
fiftyone zoo models requirements \
    --ensure centernet-hg104-512-coco-tf2
# This model is from the TF2 Model Zoo which must be installed
eta install models

Затем я применю модель к набору данных, чтобы сгенерировать прогнозы и визуализировать их в приложении FiftyOne.

# Apply a model from the zoo to your dataset
fiftyone zoo models apply \
    centernet-hg104-512-coco-tf2 \  
    my_dataset \                    
    predictions                     
# Launch the FiftyOne App to visualize your dataset
fiftyone app launch my_dataset

Использование моделей TensorFlow 1.X

conda create --name tf1
conda activate tf1

Вы можете выполнить поиск доступных пакетов, а затем выбрать версию TensorFlow для установки. Это установит соответствующую версию CUDA в вашу conda среду.

conda search tensorflow-gpu
conda install tensorflow-gpu=1.15

Я буду использовать ту же процедуру, что и в примере с TensorFlow 2, за исключением модели, использующей TensorFlow 1.

pip install fiftyone
# Download a model from the zoo
fiftyone zoo models download mask-rcnn-resnet101-atrous-coco-tf
# Create a dataset from the given data on disk
fiftyone datasets create \
    --name my_dataset \
    --dataset-dir /path/to/dataset \
    --type fiftyone.types.ImageDirectory
# Apply a model from the zoo to your dataset
fiftyone zoo models apply \
    --error-level 1 \
    mask-rcnn-resnet101-atrous-coco-tf \     
    my_dataset \                              
    predictions                               
# Launch the FiftyOne App to visualize your dataset
fiftyone app launch my_dataset

Использование моделей PyTorch

Установить PyTorch немного проще, потому что он скомпилирован с несколькими версиями CUDA. Это дает нам свободу использовать любую версию CUDA, которую мы хотим. Инструкции по установке по умолчанию на момент написания (январь 2021 г.) рекомендуют CUDA 10.2, но есть версия PyTorch, совместимая с CUDA 11.

conda create --name pyt
conda activate pyt
conda install pytorch torchvision torchaudio cudatoolkit=10.2 \
    -c pytorch
pip install fiftyone

В этом примере я буду использовать FiftyOne Python API для выполнения почти тех же действий, что и раньше, используя командную строку. Единственное отличие состоит в том, что мы используем модель и загружаем набор данных из зоопарка FiftyOne dataset zoo.

Примечание: установите PyTorch из исходного кода, если вы используете Mac и вам нужна поддержка графического процессора.

Общие проблемы

Когда я переключился с pip на conda, возникли три проблемы, которые потребовалось немного времени, чтобы разобраться.

1) Pip может работать внутри conda

Если пакет, который вы хотите использовать, существует только в pip, вы можете использовать pip, чтобы установить его в своей conda среде. Однако pip и conda не всегда хорошо играют вместе.

Основная проблема заключается в том, что conda не может управлять пакетами, которые не были установлены. Таким образом, если pip используется внутри conda среды, conda не знает об изменениях и может нарушить среду.

Следуйте этим советам Джонатана Хельмуса при одновременном использовании pip и conda:

  • Никогда не используйте conda после pip. Установите все, что можно, с помощью conda, затем установите оставшиеся пакеты с помощью pip
  • Создавайте новые conda среды. Использование pip может привести к поломке среды, поэтому всегда создавайте новую изолированную conda среду перед установкой pip пакетов.
  • Если вам нужно установить пакет aconda после использования pip, лучше просто создать новую среду и переустановить все в правильном порядке.

2) Конда-окружения не изолированы глобально

Поведение по умолчанию при создании виртуальной средыpip таково, что внутри новой среды у вас нет доступа к глобально установленным pip пакетам. Если вам нужен доступ к глобальным пакетам, вам необходимо инициализировать виртуальную среду с помощью:

virtualenv env --system-site-packages

conda, с другой стороны, по умолчанию позволяет вам получить доступ к глобальным системным пакетам. Если вы хотите, чтобы среда была полностью изолирована от этих глобальных пакетов, как в случае с pip, вы можете создать conda среду на основе клона пустого pip virtualenv.

virtualenv empty_env
conda create -n env --clone empty_env

В идеале вам все равно следует избегать установки глобальных pip пакетов, чтобы это не было проблемой.

3) Необходимо указать пути CUDA

Если у вас есть общесистемная установка CUDA, то переменная среды LD_LIBRARY_PATH может указывать на неправильное место после установки CUDA внутри вашей conda среды.

Чтобы исправить это, вы захотите обновить LD_LIBRARY_PATH, чтобы он указывал на каталог, содержащий cuda в conda, когда вы входите в среду conda (обычно это каталог /path/to/conda/pkgs/). Затем вы захотите вернуть его к общесистемной установке CUDA, когда вы покинете среду conda.

Сначала перейдите в папку со своей conda средой и создайте следующие файлы и папки:

cd /path/to/anaconda/envs/my_env
mkdir -p ./etc/conda/activate.d
mkdir -p ./etc/conda/deactivate.d
touch ./etc/conda/activate.d/env_vars.sh
touch ./etc/conda/deactivate.d/env_vars.sh

В activate.d/env_vars.sh добавьте следующие строки. Замените /your/path на путь к установке CUDA в вашей conda среде.

#!/bin/bash
export OLD_LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=/your/path:${LD_LIBRARY_PATH}

а затем добавьте следующие строки в deactivate.d/env_vars.sh:

#!/bin/bash
export LD_LIBRARY_PATH=${OLD_LD_LIBRARY_PATH}
unset OLD_LD_LIBRARY_PATH

Резюме

Возможность устанавливать пакеты, отличные от Python, такие как CUDA, всего в нескольких командах с conda - это находка. Использование conda в сочетании с зоопарком моделей FiftyOne означает, что вы можете создавать прогнозы на основе десятков моделей за считанные минуты. Однако переключение с pip виртуальных сред на conda может привести к неожиданному поведению, если вы не готовы.