Как я запускаю 15+ самых разных ИИ на своей машине — open-source, self-hosted, с HTTP-доступом

от автора

TLDR: я написал BrainBox — local-first сервис поддержки open-source ИИ-систем для генерации изображений, распознавания объектов на снимках, озвучки, распознавания текстов, транскрибирования аудиозаписей и других целей. Эти системы запускаются за фасадом веб-сервера, который устанавливает их и затем принимает и выполняет задачи в едином для всех систем формате. Задачи можно ставить из любого языка программирования с помощью отправки веб-запросов на сервер, а для Python дополнительно разработан удобный API. Проект доступен на pypi https://pypi.org/project/kaia-brainbox/ с подробной документацией и инструкцией на английском языке. Я надеюсь, что BrainBox поможет тем, кто хочет сделать небольшой проект с использованием ИИ, но не хочет разбираться в питоне и торче, или просто не знает, с чего начать.

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

Мотивация

В 2023 после появления Stable Diffusion и Llama, искусственный интеллект перестал быть эксклюзивной собственностью корпораций и стал доступен всем. Стало понятно, что с этим нужно разбираться, чтобы не остаться со своими pandas и torch где-то на обочине истории. На работе этой темой было заниматься не особенно перспективно: полностью погрузиться в Прекрасное, то есть в технологии, не получается, бизнес все-таки должен генерировать прибыль, а значит, творческие порывы ограничиваются такими скучными вещами, как экономическая целесообразность и KPI.

Поэтому я решил сделать пет-проект в этой области, и через некоторое набрел на удачную тематику: Kitchen AI Assistant (Kaia) — кухонный помощник с лицом, голосом и характером моих любимых персонажей. Это как гуглоколонка, только с дисплеем и с большей персонализацией: с помощью AI я генерирую картинки с моими любимыми персонажами в разных ситуациях, клонирую их голос, а также перефразирую детерминированные ответы голосового помощника в соответствие с характером персонажей. Код помощника также открыт. Выглядит все это примерно так (чтобы не нарушать авторские права и морально-нравственные законы, в демо-версии используются open-source голоса и красивые AI-пейзажи):

Кухонный помощник Kaia

Кухонный помощник Kaia

Проект почти готов — осталось только переписать кое-какие управляющие алгоритмы на фронтенде, чтобы избавиться от требования наличия Python на девайсе и, соответственно, сделать Каю совместимой с Android-планшетами и IPad.

Но собственно об этом проекте я расскажу как-нибудь потом, а пока сосредоточусь на гораздо более проработанной и полезной его части — BrainBox, сервере поддержки ИИ-систем.

ИИ-систем в Kaia много. Очень много. Только для инференса нужно как минимум две. Во-первых, нужен text-to-speech, и я использую Piper — легковесный TTS, запускающийся на машинах без GPU и даже на Raspberry PI. Он поддерживает множество различных языков, в том числе достаточно малые. Голоса могут быть дотренированы в ходе отдельной процедуры обучения.

Во-вторых, нужно распознавание голоса. Стандартом де-факто здесь является Whisper, который преобразует сказанный текст в строку со всей необходимой пунктуацией. Однако, конкретно для помощника гораздо лучше подходит Kaldi, который я использую через его имплементацию в Rhasspy: он позволяет определить грамматику с фразами, которые будут распознаны помощником, и с такой закрытой грамматикой работает быстрее Whisper, при этом совмещая text-to-speech и natural-language understanding. Кроме того, есть еще Vosk — как и Whisper, он работает по открытой грамматике, он быстрее и существенно менее требователен к ресурсам, его выход лучше привязан к звуковому потоку, но отсутствует украшение в виде пунктуации.

Но помимо этих систем, которые помощнику требуются постоянно, есть и гораздо более трудоемкая часть заранее подготовленного контента: картинок, голосов и перефразов.

Для генерации картинок я использую ComfyUI, стандартное и эффективное решение в этой области. Для рисования картинок с моими персонажами мне необходимо сначала натренировать LoRA для них, и с этим мне помогает KohyaSS. Для тренировки LoRA, в свою очередь, требуется подготовить датасет, и здесь требуется огромный арсенал инструментов: разделение видео на отдельные кадры, поиск лиц на этих кадрах с помощью YOLO и тэгирование изображений с помощью WD14Tagger.

Похожая ситуация с обучением голоса. Для него требуется около получаса чистых сэмплов, без музыки и шумов. Найти такое количество голосов в первоисточников очень непросто, поэтому я применяю апсемплинг: на основе ~1 минуты звуков из первоисточников я генерирую требуемые 30 минут с помощью Zonos или CoquiTTS.

Меньше всего проблем в перефразом: для этого нужна только LLM, Llama либо Mistral (для европейских языков), и они доступны через решение Ollama.

Собственно, из всех упомянутых систем только Ollama способна беспроблемно установиться, выкачать все, что ей нужно для работы и далее работать через API. Остальные системы на таком уровне, мягко говоря, не находятся, и часто представляют собой просто репозиторий с кодом и ноутбук с демонстрацией — и нужно еще как следует потрудиться, чтобы ее запустить, потому что с зависимостями в половине случаев царит полная неопределенность. Соответственно, для использования в проекте весь этот зоопарк нужно было как-то организовать. Так и появился BrainBox

Когда я уже написал BrainBox в проекте Kaia, я внезапно осознал, какого масштаба работу я проделал, и сколько шишек собрал на этом пути. Дополнительно в этом мне помогли студенты ФИИТ УрФУ, где я все еще волонтерю на проектной деятельности: задача «быстренько разобраться с новой ИИ-системой» могла легко растянуться на недели; задача «подготовить систему к использованию в продакшне» — на месяцы. Я понял, с какими серьезными вызовами на самом деле сталкивается человек, который хочет сделать небольшой ИИ-проект, даже самый простой: озвучивание аудиокниги, суммаризацию заметок, рисование обложек на Ютуб и так далее. И как многократно возрастают эти вызовы в случае, если python — не основной язык программирования. Порог вхождения в эту область слишком высок, и он вынуждает идти на поклон к корпоратам.

Поэтому я решил выложить BrainBox отдельным от Kaia продуктом, именно для того, чтобы помочь таким проектам. Теперь каждый, кто хочет написать такой небольшой проект, может просто установить BrainBox и сразу же получить доступ к ИИ-системам, как упомянутым выше, так и другим (полный список доступен в документации). И все, проблема решена: чтобы вызвать ту или иную систему, достаточно просто отправить HTTP-запрос!

Я очень надеюсь, что BrainBox поможет новым людям приобщиться к удивительному миру современного ИИ, и создать больше хороших, полезных продуктов. Нынешние времена очень напоминают мне зарю Web2.0: Тогда тоже внезапно появились различные инструменты, с помощью которых люди создавали новые продукты, от фейсбука до личного приложения для заметок. Не все из них стали юникорнами, но многие были и остаются полезными для своих пользователей. Сейчас точно такое же время.

Архитектура

BrainBox не ставит задачу включить абсолютно все системы из open-source. Вместо этого, я сфокусировался на архитектуре, которая бы позволила добавлять новую систему без большой головной боли.

Архитектура BrainBox

Архитектура BrainBox

Докер-контейнеры

Первым вопросом, который встал передо мной при проектировании, был такой: как организовать множество ИИ систем для работы за единым веб-интерфейсом?

Первым решением было запихнуть все эти системы в одно приложение с веб-сервером. Эта идея была крайне неудачной, что стало понятно в самом начале: когда я попытался интегрировать вместе всего три системы (Oobabooga вместо Ollama, Automatic1111 вместо ComfyUI и TortoiseTTS), все они требовали своих конкретных версий библиотек и победить эту проблему оказалось непросто. Это был тупиковый путь.

Вторым подходом было написание нескольких маленьких серверов, каждый из которых обслуживал свою систему: в питоне есть механизм окружений, который позволяет так сделать. Это решило проблему Oobabooga, Automatic1111 и TortoiseTTS, однако уже на CoquiTTS выяснилось, что это решение тоже нежизнеспособно: CoquiTTS потребовало установки espeak, который под Windows установить не так-то просто, а другим системам уже были нужны и wget, и ffmpeg… Стало ясно, что инструкция по установке такого решения будет очень длинной и никто его себе устанавливать на Windows не будет. При этом Windows — это основная система для машин с хорошими GPU из-за игр, а значит, большой процент потенциальной ЦА останется при таком решении за бортом.

Финальной версией стала сборка каждой системы внутри собственного докер-контейнера. ffmpeg, espeak и все прочее устанавливаются автоматически через apt, соответственно, пользователю ни с чем, кроме установки Docker и Python, разбираться не придется. Контейнеры я решил собирать прямо на пользовательской машине — в противном случае, мне бы пришлось менеджить все увеличивающийся пул репозиториев, что делать лениво. Кроме того, централизация контейнеров завязала бы систему на конкретные локации в интернете, и сделало бы ее, по моему ощущению, менее свободной.

В результате для каждой из поддерживаемых ИИ-систем появляется сущность контроллера: он собирает докер-контейнер, запускает его и управляет его работой. Сервер BrainBox содержит эндпоинты, с помощью которых эти действия могут быть запущены через HTTP-запросы. Контроллеры полностью изолируют пользователя от контейнеров: пользователь работает только с BrainBox, совершенно не используя команд докера.

Очередь задач

Как правило, контейнеры содержат внутри себя HTTP-серверы — они, в основном, пишутся путем копипасты поставляемых с ИИ-системой ноутбуков в код сервера. По идее, этого уже достаточно для работы: минималистичный контроллерный веб-сервер запускает нужный вам ИИ, и затем вы общаетесь с ним через его собственный HTTP-сервер.

Это, однако, непрактично. Во-первых, будет неудобно пользоваться таким количеством разных API, которые уже написаны разными людьми в довольно разных стилях, и, как правило, без особой документации. Во-вторых, если вы запускаете эти системы для исследований, часто возникает необходимость управления потоком задач: например, сначала выполнить все задачи на отрисовку изображений, а потом — на озвучку. Более того, даже внутри задач отрисовки могут встречаться разные базовые модели, которые тоже нужно упорядочить, чтобы исключить повторную загрузку одной и той же модели.

Поэтому я написал второй слой BrainBox поверх контроллерного — слой десайдеров: сущностей, методы которых вызывают эндпоинты HTTP-серверов моделей и преобразуют, если необходимо, их результат. Запрос на вызов того или иного метода десайдера я называю задачей. BrainBox организует очередь задач, приоритизирует ее и далее выполняет работы в соответствии с этой приоритизацией, поднимая и опуская нужные докер-контейнеры.

Приоритизацией занимается еще одна сущность — планер, который зависит от сценария использования BrainBox. В случае, когда BrainBox используется как поддерживающий сервер для Kaia, все нужные контейнеры поднимаются один раз, при старте Kaia, и затем BrainBox занимается исключительно диспетчеризацией запросов; в исследовательском режиме планер выбирает один из десайдеров, поднимает контейнер, выполняет все приписанные к нему задачи, затем опускает контейнер и переходит к следующему десайдеру. Добавление задач в очередь, блокировка процесса до достижения результата, мониторинг статуса и получение результатов осуществляется через эндпоинты BrainBox-сервера. Таким образом, слой десайдеров обеспечивает единый интерфейс для всех поддерживаемых систем.

Этот интерфейс дополнительно усилен PythonAPI, который упрощает создание задач за счет использования фич python. Это будет дополнительно разобрано далее, в примерах использования BrainBox.

BrainBox также выступает как файловое хранилище: многие десайдеры производят изображения или звуки, и кажется неправильным хранить все эти гигабайты в базе данных. Поэтому бинарные результаты сохраняются в кэш-папке BrainBox, и вместо них десайдер возвращает имя файла. В случае, когда десайдер требует файл на вход (например, распознавание речи), такой файл должен быть предварительно загружен на сервер, и его имя должно быть передано десайдеру.

В принципе, BrainBox может быть запущен на отдельной машине, например, в облаке, и выполнять также функцию удаленного сервера поддержки ИИ — что-то вроде open-source версии AWS Bedrock. Я использую такой сценарий в локальной сети, но для разворачивания в облаке нужно, вероятно, как-то решить вопрос с безопасностью — чего я не делаю, потому что ничего в этом не понимаю. Поэтому я из осторожности не рекомендую такой способ, но если вы знаете, что делаете, и готовы рискнуть, то я не ожидаю проблем на уровне самого BrainBox.

Самотестирование

В ходе самотестирования контроллер выполняет один или несколько сценариев использования десайдера, вызывая его эндпоинты — это может быть разовый вызов эндпоинта, либо демонстрация их взаимодействия, если речь идет об обучении модели десайдером и последующем использовании этой модели.

Все эти вызовы осуществляются точно тем способом, которым это делается при использовании PythonAPI. Самотестирование по сути содержит код, который можно копипастить в ваш проект для вызова десайдера. В самотестировании я стараюсь покрыть все сценарии использования, чтобы упростить последующий копипастинг. Таким образом, самотестирование, помимо проверки работоспособности, выполняет также документационную функцию.

Добавление нового десайдера

Для добавления в BrainBox новой ИИ-системы требуется выполнить следующую последовательность действий:

  1. Заставить эту систему работать на своей машине вне докер-контейнера, и понять, какие зависимости для этого нужны

  2. Создать контроллер для сборки контейнера с этими зависимостями и исходным кодом системы

  3. Реализовать внутри контейнера веб-сервер

  4. Реализовать десайдер, взаимодействующий с этим веб-сервером

  5. Написать самотестирование

Сейчас эти процедуры можно сделать за несколько часов. Подробное видео, в котором я это делаю с нуля для системы Zonos, можно посмотреть здесь.

Использование BrainBox

В этой секции я расскажу о том, как устанавливать и использовать BrainBox. Продемонстрирую я это на двух примерах: озвучке текста и распознавании объектов на изображении с помощью тэгирования.

Установка BrainBox

Для установки BrainBox требуются следующие шаги:

  • Установка Docker

  • Установка Python (я предпочитаю дистрибутив Anaconda )

  • Установка и самотестирование BrainBox.

Ссылки содержат руководства по установке, и обычно они работают хорошо. На случай, если вы новичок в Anaconda и Docker и/или у вас что-то не получается, я приведу в приложении более детальную инструкцию по их установке.

После установки Docker и Anaconda, создайте окружение для BrainBox:

conda create --name brainbox python=3.11

BrainBox протестирован для Python 3.9-3.13, но разработан на Python 3.11, поэтому это самая надежная для использования версия Python. После создания окружения, активируйте его:

conda activate brainbox

Все последующие операции с BrainBox необходимо выполнять с активированным окружением. Теперь вы можете установить BrainBox:

pip install kaia-brainbox

И, наконец, запустить его:

python -m brainbox.run --data-folder PATH_TO_SOME_LOCAL_FOLDER

Успешно запущенный сервер напечатает в консоли:

WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:8090 * Running on http://10.10.5.48:8090 Press CTRL+C to quit

Поскольку BrainBox все еще в стадии разработки, я рекомендую протестировать запущенный сервер. Для этого в другом консольном окне наберите:

conda activate brainbox python -m brainbox.run_test

В случае успеха, тест напечатает ALL GOOD в конце.

Основной причиной неудач является незапущенный (в Windows или MacOS) Docker-сервер. В этом случае консоль теста напечатает длинную ошибку, заканчивающуюся в Windows:

error during connect: this error may indicate that the docker daemon is not running: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json?all=1&filters=%7B%22ancestor%22%3A%7B%22hello_brain_box%22%3Atrue%7D%7D": open //./pipe/docker_engine: The system cannot find the file specified.    

в MacOS:

Cannot connect to the Docker daemon at unix:///Users/yura/.docker/run/docker.sock. Is the docker daemon running?

Для исправления проблемы, запустите Docker Desktop в этих операционных системах, и запустите тесты снова. Сервер BrainBox можно не перезагружать. В Linux докер-демон по умолчанию запускается при загрузке ОС и не требует приложений, поэтому такой проблемы возникать не должно.

Для всех последующих примеров вам нужно запустить BrainBox и держать его запущенным все время работы. В Windows и MacOs также необходимо держать запущенным Docker Desktop.

Установка десайдера

Прежде чем использовать десайдер, его нужно установить. Установка соберет докер-контейнер с ИИ-системой на вашей машине, а также скачает из интернета модели, необходимые для его работы.

Самый простой способ сделать это — через WebUI BrainBox, по адресу http://127.0.0.1:8090/controllers/status. Для действий, описанных ниже, вам понадобятся десайдеры Piper и WD14Tagger. Эти десайдеры не требуют ни GPU, ни в целом интенсивных вычислений, и заведутся на плюс-минус любом ноутбуке.

После установки, имеет смысл запустить процедуру самотестирования и ознакомиться с ее результатами: это позволит на ранней стадии отловить ошибки, а также позволит понять, как пользоваться установленными десайдерами.

Установить десайдеры можно не только через UI, но также с помощью API либо HTTP-запросов, этот пример я приведу ниже.

Озвучка (API)

Для Python разработан удобный API, который позволяет использовать Brainbox, по сути, в формате Remote Procedure Call, почти бесшовно:

from brainbox import BrainBox from brainbox.deciders import Piper  if __name__ == '__main__':          #Создаем api для уже запущенного сервера       api = BrainBox.Api("127.0.0.1:8090")         #Запускаем озвучивание текста       result = api.execute(BrainBox.Task.call(Piper).voiceover("Привет, мир!", "ru"))       #Результат является строкой - именем файла. Этот файл можно скачать:       api.download(result, "./piper_result.wav")          #Либо открыть без скачивания, например, для ipywidgets.Audio       print(api.open_file(result).content[:10])

Piper — это десайдер, и его метод Piper::voiceover, будучи запущен из-под BrainBox, выполняет запрос к контейнеру piper. В приведенном коде, однако, вызова voiceover не происходит, поскольку реализован такой фокус: BrainBox.Task.call(Piper) через аннотацию возвращаемого значения «притворяется», что возвращает объект Piper, но на самом деле возвращает мок, вызовы которого строят задачу для BrainBox. Однако обманутый IDE показывает методы внутри класса Piper, для каждого из методов показывает аргументы с их типами, а при появлении документации, покажет и ее. Дополнительно мок выполняет проверку аргументов, и несогласованности на этом этапе будут отловлены до попадания задачи в BrainBox, то есть на стороне клиента.

Озвучка (HTTP-запросы)

Все API BrainBox доступно без использования питона. Этот способ не являлся основным для доступа к BrainBox, и в целом мне пока непонятно, насколько велик спрос на него. Поэтому это реализовано по принципу «лишь бы работало», и оно действительно работает, но расти есть куда, особенно в плане документации и формата передаваемых данных.

Следующая инструкция добавляет в очередь массив из одной задачи на озвучку, для Linux/MacOS:

curl -X POST "http://127.0.0.1:8090/jobs/add" \      -H "Content-Type: application/json" \      -d '{          "arguments": {              "jobs": [                  {                      "decider": "Piper",                      "method": "voiceover",                      "arguments": {                          "text": "Привет, мир!",                          "model": "ru"                      }                  }              ]          }      }'

Windows:

curl -X POST "http://127.0.0.1:8090/jobs/add" ^      -H "Content-Type: application/json" ^      -d "{""arguments"":{""jobs"":[{""decider"":""Piper"",""method"":""voiceover"",""arguments"":{""text"":""Привет, мир!"",""model"":""ru""}}]}}"

Эти команды возвращают JSON следующего формата:

{   "error": null,    "result": ["4e1ddb3d-c50b-4201-a90c-f954c8024ca8"] }

где result — это массив id поставленных в очередь задач, по длине равный длине массива переданных задач. После этого, необходимо дождаться выполнения этой задачи с помощью эндпоинта join, в Linux/MacOS:

curl -X GET "http://127.0.0.1:8090/jobs/join" \      -H "Content-Type: application/json" \      -d '{             "arguments": {                 "ids": ["4e1ddb3d-c50b-4201-a90c-f954c8024ca8"]             }          }'

В Windows:

curl -X GET "http://127.0.0.1:8090/jobs/join" ^      -H "Content-Type: application/json" ^      -d "{""arguments"":{""ids"":[""4e1ddb3d-c50b-4201-a90c-f954c8024ca8""]}}"

Результатом этого вызова является уже непосредственно результат озвучки:

{   "error": null,   "result": ["4e1ddb3d-c50b-4201-a90c-f954c8024ca8.output.wav"] }  

Поскольку результатом озвучки является бинарный контент, этот контент сохраняется в файл и возвращается только имя файла. Соответственно, файл необходимо скачать из кэша BrainBox:

curl -o voiceover.wav http://127.0.0.1:8090/cache/download/4e1ddb3d-c50b-4201-a90c-f954c8024ca8.output.wav

Распознавание изображений

Для распознавания изображений последовательность другая: нужно сначала загрузить файл, а потом вызвать десайдер. С BrainBoxAPI это делается так:

from brainbox import BrainBox from brainbox.deciders import WD14Tagger from pathlib import Path   if __name__ == '__main__':     api = BrainBox.Api("127.0.0.1:8090")      api.upload('image.png', Path(__file__).parent/'image.png')      result = api.execute(BrainBox.Task.call(WD14Tagger).interrogate('image.png'))     print(result)

На самом деле, загрузку файлов можно «обойти» несколькими способами. В первом из них передается путь до файла:

result = api.execute(BrainBox.Task.call(WD14Tagger).interrogate(Path(__file__).parent/'image.png'))

Такой способ можно использовать, если вы уверены, что BrainBox всегда будет запущен на той же машине, что и ваше приложение; если же вы передумаете и захотите использовать BrainBox на удаленной машине, вам придется переписать все вызовы.

Кроме того, можно передать весь файл целиком:

with open(Path(__file__).parent/'image.png', 'rb') as file:     image = file.read()  result = api.execute(BrainBox.Task.call(WD14Tagger).interrogate(image))

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

Лучше всего — если вход одного десайдера является выходом другого. В этом случае ни скачивать, ни заливать ничего не нужно: все файлы лежат в кэше BrainBox, и, соответственно, между десайдерами нужно передавать лишь их имена.

На уровне HTTP-запросов, загрузка файлов происходит стандартным образом:

curl -X POST -F "image.png=@image.png" http://127.0.0.1:8090/cache/upload

После этого, необходимо выполнить ту же пару add/join со следующим JSON:

{   "arguments": {     "jobs": [       {         "decider": "WD14Tagger",         "method": "interrogate",         "arguments": {           "image": "image.png"         }       }     ]   } }

Заключение

Я надеюсь, что приведенные примеры убедят вас попробовать BrainBox для своих проектов, и что это решение окажется вам полезным. Я достаточно уверен в его стабильности: уже около года я использую BrainBox как сервер поддержки для Kaia, а также как исследовательский сервер для таких задач, как подготовка сэмплов для клонирования голоса, изготовления LoRA моделей, рисования картинок или перефраза ответов голосового помощника в зависимости от персонажа. Кроме того, я выполнил пару небольших проектов на BrainBox, типа озвучивания аудиокниги или описания одежды на фотографии.

Дополнительная документация по BrainBox находится на его Pypi-странице, и содержит следующие темы:

  • Управление ресурсами десайдеров, разделяемыми между файловой системой хоста и контейнером

  • Скачивание дополнительных моделей для десайдеров

  • Построение воркфлоу для десайдеров

  • Пакетный запуск задач со сбором их результатов воедино

В дальнейшем я планирую добавлять в BrainBox новые десайдеры по мере того, как они будут нужны в моих проектах. Кроме того, я хочу существенно улучшить систему документации и десайдеров, и API BrainBox, чтобы его использование без Python стало проще.

Приложение

Установка Docker

Перед тем как устанавливать Docker, проверьте, что он еще не установлен. Для этого в Windows и MacOS поищите приложение DockerDesktop и запустите его; в Linux этот шаг не требуется. Далее откройте командную строку и наберите

docker run hello-world

В случае успеха, будет возвращен текст, начинающийся с Hello from Docker!

Если Docker Desktop отсутствует и команда docker не обнаружена, установите Docker, выполнив инструкции:

После установки перезагрузите систему, откройте Docker Desktop и выполните docker run hello-world еще раз.

Если на вашей машине установлено GPU и вы хотите убедиться, что оно корректно пробрасывается в Docker, выполните

docker run --gpus all hello-world

Если будет возвращен текст, начинающийся с Hello from Docker!, то все хорошо. В противном случае, вам нужно убедиться, что у вас установлены нужные драйверы CUDA для взаимодействия с докером.

Установка Anaconda

  1. Зайдите на https://www.anaconda.com/download/success

  2. Выберите вашу операционную систему

  3. Скачайте и установите дистрибутив

В Linux и MacOS команды Anaconda будут доступны из обычного терминала. В Windows следует использовать программу «Anaconda Prompt», которая появится после установки.

Установка десайдера через API

Следующий код проверяет, установлен ли десайдер (Piper), и устанавливает его в случае отсутствия:

from brainbox import BrainBox from brainbox.deciders import Piper   if __name__ == '__main__':     api = BrainBox.Api("127.0.0.1:8090")     status = api.controller_api.controller_status(Piper)     if not status.installation_status.installed:         api.controller_api.install(Piper, True)         api.controller_api.self_test(Piper)

Для уровня HTTP-запросов эта проверка выполняется несколько сложнее, и я приведу ее тоже на Python, но с использованием библиотеки requests.

import requests  if __name__ == '__main__':     status = requests.post(         'http://127.0.0.1:8090/controllers/status',         json=dict(arguments={})     )      containers = status.json()['result']['@content']['containers']     piper_container = next((c for c in containers if c['name']=='Piper'))     if not piper_container['installation_status']['installed']:         requests.post(             'http://127.0.0.1:8090/controllers/install',             json=dict(arguments=dict(decider='Piper', join=True))         )         requests.post(             'http://127.0.0.1:8090/controllers/self_test',             json=dict(arguments=dict(decider='Piper'))         )


ссылка на оригинал статьи https://habr.com/ru/articles/895540/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *