Search
Write a publication
Pull to refresh

Как я устал от тормозов и закрытости Pinokio и написал свою портативную альтернативу за пару вечеров

Level of difficultyEasy
Reading time6 min
Views829

Часть 1: Боль от использования Pinokio

Все началось с простого — в один день я узнал о Pinokio, когда хотел поставить себе один популярный репозиторий с гитхаба — facefusion, но мне было лень самому ставить питон и CUDA на систему, поэтому я поспрашивал друзей о том, как они выкручиваются из такой ситуации. Они мне рассказали о Pinokio и я подумал, что он вполне может решить мою настолько тривиальную задачу. Скачал, установил. Оболочка красива — спору нет. Но для того чтобы поставить самый легковесный репозиторий — он стал ставить Miniconda, кучу пакетов, что весьма долго и нудно. А главное кушает место на диске. Но это полбеды. Интерфейс то тоже не быстрый — имеет лаги. А это весьма неприятно =(
Отсюда и выливается боль от использования, а аналогов данной приблуде нет, либо есть, но они не популярны.

Часть 2: Почему так больно? И правда, что это не полноценный open-source?

Человек я хоть и ленивый, но я никогда не против посмотреть на исходный код программы, которую использую — ведь всегда интересно, а почему она работает так?
Если мы перейдем на официальный репозиторий данной программы, то увидем, что код в целом есть. И видно, что приложение написано на Node JS. Но давайте копнем глубже? Посмотрим на package.json (приведены первые 24 строки):

  "name": "Pinokio",
  "private": true,
  "version": "3.19.92",
  "homepage": "https://pinokio.co",
  "description": "pinokio",
  "main": "main.js",
  "email": "cocktailpeanuts@proton.me",
  "author": "https://twitter.com/cocktailpeanut",
  "scripts": {
    "start": "electron .",
    "pack": "./node_modules/.bin/electron-builder --dir",
    "eject": "hdiutil info | grep '/dev/disk' | awk '{print $1}' | xargs -I {} hdiutil detach {}",

    "l": "docker run --rm -ti -v $PWD:/project -w /project -e SNAPCRAFT_BUILD_ENVIRONMENT=host -e SNAP_DESTRUCTIVE_MODE=true electronuserland/builder bash -lc 'rm -rf node_modules && npm install && npm run monkeypatch && ./node_modules/.bin/electron-builder install-app-deps && ./node_modules/.bin/electron-builder -l'",
    "mw": "rm -rf node_modules && npm install && npm run monkeypatch && ./node_modules/.bin/electron-builder install-app-deps && ./node_modules/.bin/electron-builder -mw && npm run zip",
    "build2": "npm run l && npm run mw",

    "dist": "npm run monkeypatch && ./node_modules/.bin/electron-builder install-app-deps && export SNAPCRAFT_BUILD_ENVIRONMENT=host && export SNAP_DESTRUCTIVE_MODE='true' && ./node_modules/.bin/electron-builder -l && npm run zip",
    "dist2": "npm run monkeypatch && export USE_SYSTEM_FPM=true && ./node_modules/.bin/electron-builder install-app-deps && export SNAPCRAFT_BUILD_ENVIRONMENT=host && export SNAP_DESTRUCTIVE_MODE='true' && ./node_modules/.bin/electron-builder -mwl && npm run zip",
    "zip": "node script/zip",
    "monkeypatch": "cp temp/yarn.js node_modules/app-builder-lib/out/util/yarn.js && cp temp/rebuild.js node_modules/@electron/rebuild/lib/src/rebuild.js",
    "postinstall2": "npm run monkeypatch && ./node_modules/.bin/electron-builder install-app-deps",
    "fix": "brew install fpm"
  },

Давайте подробнее посмотрим на секцию scripts. Что мы увидим? Что приложение написано на electron (привет лаги и большой вес!). И какие‑то весьма странные манки‑патчи, не так ли? Это двигает на следующий шаг рассмотреть main.js:

const Pinokiod = require("pinokiod")
const config = require('./config')
const pinokiod = new Pinokiod(config)
let mode = pinokiod.kernel.store.get("mode") || "full"
//iprocess.env.PINOKIO_MODE = process.env.PINOKIO_MODE || 'desktop';
if (mode === 'minimal') {
  require('./minimal');
} else {
  require('./full');
}

А собственно, где весь src? Где вся логика? А ее и нет в помине, ведь все что на гитхабе — это просто красивый враппер над уже скомпилированной библиотекой, исходный код которой закрыт. Разве это не странно? Проект позиционирует себя как open‑source, а по факту является source‑available. Исходного кода нет, но вы держитесь. А еще разве не странно, что дата релиза кода и даты релизов скомпилированных версий весьма разняться? Мне кажется это достаточно странным. Можете взглянуть и сами на это:

Релиз кода - первого января. А бинарников - 9 июня. Странно!
Релиз кода - первого января. А бинарников - 9 июня. Странно!

Часть 3. Где все аналоги? Почему все так плохо?

Аналоги может и есть в такой же красивой обертке — но они весьма непопулярны и их достаточно трудно найти. Тогда остается либо идти искать портативный вариант (у репакеров, например), либо ставить самому это руками или взять докер и задеплоить. Но докерфайлы есть не всегда, как и время с желанием у простого пользователя разбираться в установке из командной строки или докера. Поэтому, такую проблему иногда решает и сам автор репозитория, например ComfyUI — автор выпускает готовые окружения с CUDA, питоном и возможностью обновления через батник. Весьма удобно, не так ли? Но как можно было бы решить данную проблему, чтобы сохранить всю идейность? Чтобы просто скачать один.exe, запустить его, поставить то что нужно, поработать. Надоело? Просто снес одну папку и все, больше не надо нигде лазить по системе... Именно с такой мыслью я делал свой пет‑проект — PortableSource, который должен решить все возникшие вопросы.

Часть 4 Что это за зверь такой — PortableSource?

В чем, собственно, плюс был делать что‑то свое? Все весьма и весьма просто. Тут заложена простая идеология: юзеру нужно кликнуть всего‑лишь пару кнопочек, чтобы получить результат и работать с ним.

Как это было реализовано на практике? Изначально идея была проста: возьмем Miniconda, напишем простую логику обработки окружений и все будет чики‑пуки. Это могло годиться лишь на черновой проект, ведь у Miniconda (и ее аналогов, например micromamba) есть один жирный минус: они не портативны. Ты просто не можешь взять и перенести папку с проектом на другой диск — ведь у тебя выставлены статичные пути в батниках активации! А еще один достаточно неприятный минус — конда и ее производные оставляют свои данные не только в папке установки. Это может быть кэш, принятие ToS и так далее. И главный минус миниконды был в том, что написана она на питоне и весьма медленна. Как его можно было обойти? Взять micromamba. Но и тут всплыл жирный минус, о котором я говорил — отсутствие портативности. Тогда, собственно, что можно сделать, дабы достичь максимальной портативности? Собственный менеджер! Идея проста как пареная репа: для полностью рабочего окружения нужно всего‑то 4 пакета: CUDA, python, git и ffmpeg. У них есть портативные версии (кроме CUDA) и они вполне легко переносятся между дисками. А теперь минутка душноты для тех, кто хочет знать весь механизм создания среды:
Первый и самый важный этап состоит в том, чтобы определить видеокарту. Всего есть 3 условных класса для работы: GTX 10–16, RTX 20xx — относятся к классу для работы с CUDA 11.8, то есть Turing и Pascal используют свою «родную куду» и полностью себя раскрывают. Rtx 30xx — Ampere. CUDA 11.8 будет медленной, не так ли? А 12.8 избыточна по функционалу. Потому выбор пал на 12.4. Ну и Blackwell и Ada — 50xx и 40xx, конечно же, 12.8 чтобы полностью раскрыть свою мощь. Что насчет питона? Все вполне просто: мы скачиваем один раз чистую версию, в которой установлен лишь pip. А потом в сопоставление репозитория по имени создаем свою изолированную среду, на основе того самого чистого пакета. Мощно, быстро и сердито! А главное — легко и портативно.

Часть 5. Все красиво! А где потестить?

Потестить можно вот тут. Самое удобное — просто скачать portable версию. Она не устанавливается в систему и запускается просто два раза кликнув по ней. А для тех кто хочет подробнее узнать о коде, можно посмотреть вот тут: GUI, CLI. Надеюсь, именно тебе понравится моя работа =)

Tags:
Hubs:
+4
Comments0

Articles