OpenChat 7B запущенный локально через text-generation-webui
OpenChat 7B запущенный локально через text-generation-webui

Есть много локальных аналогов ChatGPT, но им не хватает качества, даже 65B модели не могут конкурировать хотя бы с ChatGPT-3.5. И здесь я хочу рассказать про 2 открытые модели, которые всё-таки могут составить такую конкуренцию.

Речь пойдет о OpenChat 7B и DeepSeek Coder. Обе модели за счет размера быстры, можно запускать на CPU, можно запускать локально, можно частично ускорять на GPU (перенося часть слоев на GPU, на сколько хватит видеопамяти) и для такого типа моделей есть графический удобный интерфейс.

И бонусом затронем новую модель для качественного подробного описания фото.

UPD: Добавлена информация для запуска на Windows с ускорением на AMD.

OpenChat

Ссылка: https://huggingface.co/openchat/openchat_3.5

Онлайн демо: https://openchat.team/

Сравнение с chatGPT
Сравнение с chatGPT

Эта модель, по заявлению разработчиков, превосходит модели с 70B параметров имея всего лишь 7B параметров и даже может конкурировать с ChatGPT-3.5, который по слухам имеет 175B параметров.

На практике, она не всегда дотягивает до ChatGPT, но она ощутимо превосходит Alpaca, Vicuna и прочие открытые модели. При этом, для модели размером 7B, хорошо, хоть и не идеально, понимает русский язык и сразу же на нем и отвечает, без дополнительных подсказок об этом.

А то, что она маленькая позволяет запускать её без проблем даже на CPU. Требуется 14гб памяти или после квантования до 5 bit всего 5гб, что для модели уровня ChatGPT-3.5 хороший результат.

DeepSeek Coder

Ссылка: https://github.com/deepseek-ai/deepseek-coder

Онлайн демо: https://chat.deepseek.com/coder

Эта локальная модель предназначена для генерации кода и представлена в виде base и Incruct версия с вариантами весов 1.3B, 5.7B, 6.7B или 33B. Incruct версия генерирует код лучше базовой модели, но с базовой модель можно поболтать. Понимает команды на русском.

Модель по тестам для Python'а оценивается выше чем ChatGPT-3.5 на 3% и отстает от ChatGPT-4.0 всего на 5%. С другими языками могут быть другие результаты, но в среднем результаты близки:

LLaVA: Large Language and Vision Assistant

Ссылка: https://github.com/haotian-liu/LLaVA

Онлайн демо: https://llava.hliu.cc/

gguf модель 13B: https://huggingface.co/mys/ggml_llava-v1.5-13b

gguf модель 7B: https://huggingface.co/jartine/llava-v1.5-7B-GGUF

Аналог ChatGPT Vision. Может распознать, что находится на изображении и ответить на вопросы связанные с этим, попытаться объяснить в чем юмор и прочее. Модель старается описать красиво и красочно, при этом сохраняет выверенную детализацию.

Есть варианты в 7B и 13B параметров.

Можно спросить, что она видит конкретное на изображении?

На экране надпись "Linux"
На экране надпись "Linux"

Где брать модели и как их квантовать самостоятельно

Модели обычно можно найти на https://huggingface.co/

В поиске нужно ввести название модели. Например, введя DeepSeek + gguf можно сразу найти конвертированную модель с разными уровнями квантования:

Либо качать оригинал модели и конвертировать вручную с помощью llama.cpp.

Рассмотрим на примере OpenChat. На странице https://huggingface.co/openchat/openchat_3.5 нажимаете на 3 точечки и выбираете Clone repository и там будет инструкция как клонировать оригинальный репозиторий из которого и можно будет сконвертировать в gguf модель.

Если вы под Windows, вам нужно будет установить cmake - https://cmake.org/download/, либо использовать wsl.

# клонируем репозиторий с openchat
git lfs install
git clone https://huggingface.co/openchat/openchat_3.5

# клонируем llama.cpp и переходим в её папку
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp

# собираем все нужные бинарники
make
# если установили cmake, то команда будет cmake, вместо make

# установим зависимости
pip install -r requirements.txt

# теперь можно запустить саму конвертацию
python3 convert.py ../openchat_3.5/  --outfile openchat_3.5-f16.gguf

# после этого модели можно устроить квантование 5bit или другое
./quantize openchat_3.5-f16.gguf openchat_3.5-q5_K_M.gguf q5_K_M

Теперь у вас есть файлы openchat_3.5-f16.gguf и openchat_3.5-q5_K_M.gguf - первый будет использовать 15гб памяти, а второй - 6.3гб.

Какой метод квантования выбрать - https://github.com/ggerganov/llama.cpp/discussions/406 оптимальный это q4_K_M, где меньше 1% потерь, но если память позволяет, можно взять q5_K_M. Цитата оттуда:

+ppl - увеличение неточности по сравнению с моделью f16.+ppl % - процентное увеличение неточности.+ppl от 13b до 7b % - неточность при переходе от модели 13b к модели 7b.
+ppl - увеличение неточности по сравнению с моделью f16.
+ppl % - процентное увеличение неточности.
+ppl от 13b до 7b % - неточность при переходе от модели 13b к модели 7b.

Графический интерфейс для text2text моделей

Есть как минимум несколько вариантов запуска text2text моделей с графическим интерфейсом, включая AMD на Windows:

  • text-generation-webui - для тех кому привычен подход аналогичного интерфейса для stable diffusion, запускается сервер, открывается указанная ссылка в браузере и дальше работа в браузере.

  • koboldcpp - запускается exe файл и работа происходит в отдельной программе, для Nvidia карт, ускорение через CUDA.

  • https://github.com/YellowRoseCx/koboldcpp-rocm/releases - koboldcpp для AMD на Windows. Сборка с ROCm, вместо CUDA.

  • llama server - реализация сервера для Chatbot UI, реализация интерфейса как у chatGPT.

  • open-chat-ui - запуск сервера и UI для OpenChat как на их сайте онлайн.

Как запустить LLaVA

Хотя изначально LLaVA запускалась только под Linux, но для Windows уже есть несколько вариантов:

  • https://github.com/haotian-liu/LLaVA/blob/main/docs/Windows.md - официальный способ с графическим интерфейсом, только для f16 моделей, достаточно тяжелый вариант с требованием к видеокарте, так как не может запускать квантированные модели (квантование для этого способа работает только на Linux).

  • Запуск через консоль с помощью llama.cpp, там в наборе уже есть llava. Позволяет запускать квантированные модели на cpu/gpu. Нужно скачать и саму модель и mmproj модель (качается также на huggingface). Запускается командой:

    ./llava-cli -m models/llava/llava-v1.5-7b-Q4_K.gguf --mmproj models/llava/llava-v1.5-7b-mmproj-Q4_0.gguf --image 01.jpg

    Если указать параметр -p, можно задать вопрос про картинку, например, спросить какого цвета пингвин:

    ./llava-cli -m models/llava/llava-v1.5-7b-Q4_K.gguf --mmproj models/llava/llava-v1.5-7b-mmproj-Q4_0.gguf --image red_linux.jpg -p "what colour is the penguin?"

  • С помощью text-generation-webui multimodal, удобный графический интерфейс, но придется повозится с установкой и запуска сервера для поддержки множественности типов моделей.

Запуск на Windows с ускорением на AMD видеокартах

ROCm - это аналог CUDA от AMD. Портирование ROCm на Windows продолжается. Например, уже можно запускать Blender с ускорением на ROCm. И есть форк для koboldcpp с ROCm, который тоже уже работает. Спасибо @DrXakза подсказку, что это уже работает для Windows.

Для запуска вам нужно скачать файл koboldcpp_rocm_only.exe и запустить его, там выбрать модель и указать нужное количество GPU слоев (зависит от количества видеопамяти):

После этого откроется интерфейс в браузере, где можно будет найти поле для ввода промпта, найти параметры генерации, по умолчанию Instruct Mode и сценарии для отыгрыша персонажей. Для продолжения генераций нужно нажимать Generate More.

По скорости 7900 xtx не уступает 4090, 66 токенов в секунду:

Установка и запуск text-generation-webui

Раньше установка была сложной, но сейчас установка производиться в 1 действие, нужно просто запустить start_windows.bat и дальше всё установится само.

Для этого нужно скачать zip-архив репозитория или сделать:

git clone https://github.com/oobabooga/text-generation-webui

После распаковки архива и перехода в папку, нужно найти и запустить скрипт запуска, если вы под Windows, то это будет, например, start_windows.bat, или start_linux.sh если вы под Linux.

При запуске вам предложат выбрать на чем вы будете запускать, на GPU или CPU. Если у вас совместимая видеокарта, то выбирайте вариант с GPU, даже на видеокарте с 4гб памяти можно будет часть нагрузки разместить на ней, а часть будет считаться на CPU.

Для AMD видеокарт пока доступен только вариант ускорения ROCm под Linux. Работы над портированием ROCm под Windows ведутся.

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

Для моделей с разрешением gguf нужно выбирать llama.cpp в качестве загрузчика.

Также тут можно указать сколько слоев будет обработано на GPU, это позволит ускорить работу даже если у вас видеокарта с небольшим объемом видеопамяти.

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

После этого остается нажать Load и начнется загрузка модели, спустя некоторое времени появится надпись, что модель успешно загружена.

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

Теперь можно перейти на вкладку Chat и попытаться что-то поспрашивать:

Можно дать текст на анализ:

Chat работает в 3 режимах взаимодействия с моделью: chat, chat-instruct и instruct, по умолчанию выставлен chat. В режиме chat модель будет пытаться общаться невзирая на то, что вы у неё просите.

Например, если вам нужно, чтобы модель писала в ответ только перевод, без пояснений, для этого нужно выбрать режим chat-instruct или instruct:

Дальше уже можно поэкспериментировать. Можно попросить написать простой todo на js:

Модель предупреждает, что это только основа
Модель предупреждает, что это только основа

Результат простой и частично рабочий, кнопка X не работает, но об этом модель сразу предупреждает, само добавление работает:

Можно проверить насколько 7B модель может в простую математику:

Ответ верный
Ответ верный

Попробуем что-то посложнее. Запрос: напиши flutter приложение которое имитирует мессенджер:

Генерация на OpenChat 7B Q5, на 4090 66 токенов в секунду
Генерация на OpenChat 7B Q5, на 4090 66 токенов в секунду

Как использовать DeepSeek Coder

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

Для генерации только кода, вам нужно взять модель с именем instruct, она генерирует код лучше чем base модель в которой есть режим чата и поэтому она хуже справляется с кодом. А сам чат нужно перевести тоже в режим instruct для лучшего результата (тоже самое можно делать для OpenChat, если нужен только код):

После этого модель сможет лучше понимать, что вы от неё хотите и лучше додумывать, что это могло бы означать в формате кода. Попробуем попросить его сгенерировать bash-скрипт, с которым у OpenChat проблема.

Напиши bash скрипт, который будет искать в папке и подкаталоги все картинки png и jpg, выполнять для них скрипт, и запоминать уже обработанные файлы в txt файл
Напиши bash скрипт, который будет искать в папке и подкаталоги все картинки png и jpg, выполнять для них скрипт, и запоминать уже обработанные файлы в txt файл

Если дать тоже задание OpenChat, то с первого раза модель не всегда будет выполнять все условия которые ожидаются, например, будет записывать уже обработанные файлы, но не проверяет их, чтобы повторно не обрабатывать. И с одной стороны правильно, этого не было в условии, но DeepSeek и ChatGPT сразу понимают, что это подразумевается и ожидается.

 Напиши bash скрипт, который будет искать в папке и подпапках все картинки png и jpg, выполнять для них скрипт, и запоминать уже обработанные файлы записывая обработанные в txt файл.
Напиши bash скрипт, который будет искать в папке и подпапках все картинки png и jpg, выполнять для них скрипт, и запоминать уже обработанные файлы записывая обработанные в txt файл.

Попробуем что-то посложнее, с чем и у ChatGPT есть сложность, чтобы с 1 раза сгенерировать всё правильно.

Запрос: Напиши приложение на flutter которое будет показывать случайный комикс xkcd. Должна быть кнопка показать следующий комикс. Должна быть кнопка добавить в избранное и возможность посмотреть своё избранное

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

Применим исправления и попробуем запустить и посмотреть, что получилось. Да, теперь программа успешно запустилась:

Кнопка добавить в избранное работает
Кнопка добавить в избранное работает

Пролистывание работает, но оно не рандомное, а на 1 комикс вперед. Кнопка добавления в избранное работают, сам список избранного в виде бесконечной ленты отображает, кнопка назад на главный экран тоже предусмотрена.

Лента избранного (если листать вниз, будет ещё 3 комикса)
Лента избранного (если листать вниз, будет ещё 3 комикса)

В этой же задачей ChatGPT-3.5 справился похожим образом, он тоже не получал рандомный комикс и генерировал не рабочий Flutter код, но после нескольких итераций сообщения об ошибках, он ошибки исправил, также как и DeepSeek. Можно сделать поверхностный вывод, что в более редких сценариях, чем являются Dart и Flutter, они показали себя равнозначно.

Комментарии (69)


  1. Resursator
    28.11.2023 10:20
    +4

    Настроил deepseek coder с применением ollama, и подключил к vscode с помощью continue. Ну и дополнительно ollama webui запустил. Очень удобно, хотя, возможно, есть интерфейс и получше, но оно и так работает.


    1. XPb14
      28.11.2023 10:20
      +1

      не подскажете краткую инструкцию?


      1. Resursator
        28.11.2023 10:20
        +6

        Ну, как-то так. Тут всё через докер, можно и нативно поставить, но я с этим не заморачивался.

        1. Установить дрова для nvidia cuda и докер. Нужно, чтобы из контейнеров докера был доступ к видеокарте, т.е. команда типа docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark выводила информацию о видеокарте.

        2. Клонировать ollama-webui. Там есть docker-compose.yml с необходимой минимальной настройкой. Разве что порты у сервиса ollama раскомментировать. Также можно добавить локальную папку в volume у ollama, например так.
          - ./ollama_models/:/models
          Пригодится, если будете дорабатывать существующие нейронки заменой системного промпта, например.

        3. Выполнить docker compose up -d. Должен заработать ollama-webui на http://localhost:3000/

        4. Библиотека уже готовых моделей тут. Инструкция по ollama конкретно есть в репозитории. Для deepseek coder нужно выбрать подходящий тэг и пуллить командой типа docker exec ollama ollama pull deepseek-coder:6.7b-instruct-q8_0. После чего в webui можно будет поспрашивать по коду. Правда, лично у меня на линуксе из webui конкретно эта нейронка не может выгружать слои в видеопамять. Собственно, почему 1й пункт этой инструкции со ссылкой под винду - я так и не разобрался, из-за чего так.

        5. Для режима копилота в VScode: в папке ./ollama_models создать modelfile - текстовый файл с удобным именем и содержимым типа
          FROM deepseek-coder:6.7b-instruct-q8_0
          После чего выполнить
          docker exec ollama ollama create deepseeker-copilot-f /models/modelfile
          Это, возможно, лишнее, но мне кажется, Continue не очень корректно отрабатывает разные теги у нейронок в ollama, он вообще выдаёт ошибку за использование неправильной нейронки в конфиге.

        6. Установить расширение Continue. После начальной настройки в файле в папке пользователя\.continue\config.json добавить в модели свою нейронку и сохранить.
          ,
          {
          "title": "DeepSeeker Copilot",
          "provider": "ollama",
          "model": "deepseeker-copilot",
          "api_base": "http://localhost:11434"
          }

        7. Выбрать DeepSeeker Copilot из нейронок и развлекаться. Кстати, через расширение DeepSeek Coder работает с выгрузкой в видеокарту и в линуксе, так что, вероятно, проблема всё-таки со стороны именно webui у меня.


        1. XPb14
          28.11.2023 10:20

          огромное большое спасибо


          1. XPb14
            28.11.2023 10:20
            +2

            И тогда я еще от себя отпишу, я до коммента все нативно поставил

            1. ставим расширение https://marketplace.visualstudio.com/items?itemName=Continue.continue

            2. Ставим ollama https://github.com/jmorganca/ollama curl https://ollama.ai/install.sh | sh

            3. Добавляем DeepSeek https://github.com/jmorganca/ollama/issues/1040#issuecomment-1818147154 в этом комменте инструкция

            4. Добавляем в ~/.continue/config.json в "models": [ ... ]

                {
                  "title": "deepcoder",
                  "provider": "ollama",
                  "model": "deepseek-7B",
                  "api_base": "http://localhost:11434"
                }
            
            1. Стартуем оламу ollama run deepseek-7B

            2. В расширении выбираем deepseek

            устанавливал вчера, может что-то пропустил, по памяти написал


  1. eugenk
    28.11.2023 10:20

    Ребят, извиняюсь за тупость, глупость и невежество, но вопрос такой. У меня ноутбук Ryzen-5, 16Gb, Nvidia 1650 4Gb под линуксом. Скажите, существуют в природе какие-нибудь нейросетки, которым будет достаточно такого железа ??? Производительность не интересует от слова совсем. Пусть хоть час работает. Интересна в первую очередь (а может быть и исключительно) генерация картинок. И даже более специализированно - генерация арта для игр. Хочу освоить это дело.


    1. Altaev
      28.11.2023 10:20
      +2

      У меня на i5, 8гб озу, gtx 1650 4гб, stable diffusion 1.4 крутится с web-ui


    1. freeExec
      28.11.2023 10:20

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


    1. Resursator
      28.11.2023 10:20
      +1

      У deepseek coder есть разные варианты, какая-нибудь вариация из 1.7b может запуститься с использованием видеокарты. Но работает так себе, судя по запросу накодить змейку. Не знаю, будет ли вообще какая-то выгода от запуска нейронки на такой видеокарте, но можно попробовать и 6.7b варианты, с нагрузкой на CPU, ОЗУ может и хватит. Правда, и на моём i7-8700k оно было ощутимо медленнее, чем на видеокарте rtx 4070. Запускаю максимально уместившуюся в 12 гигов видеопамяти 6.7b-instruct-q8_0, но там есть варианты полегче.

      Не заметил, что интересует генерация картинок, их я особо не пробовал пока.


      1. nixooyase
        28.11.2023 10:20
        +1

        А какое железо нужно, чтоб 33B запустить?


        1. Resursator
          28.11.2023 10:20
          +1

          Нашёл сайт для таких расчётов.


        1. Aniro
          28.11.2023 10:20
          +1

          На очень хорошей скорости - любая 24 Гб видеокарта (exlama2, GPTQ: 50 - токенов в секунду). На так себе скорости - 32 Гб RAM (llamacpp, GGUF формат)


    1. Chizhikov
      28.11.2023 10:20

      Посмотрите в сторону https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-AMD-GPUs
      На 5 рязани работает у меня, конечно генерация не пару секунд на картинку, но потерпеть иногда можно.


    1. BigDaddy09
      28.11.2023 10:20

      Посмотри на последние драйвера на свою карту. Нвидиа выкатили прикол что бы карта могла брать недостающую память из оперативки. Она будет медленней чем родная память карты раз в 10 но расширение прям большое может быть. Я поставил эти драв на свою 3060. Когда память забивается, автоматом идёт наполнение озу


    1. johnfound
      28.11.2023 10:20

      Все из этой статьи должно работать. Я запускал и на слабее компьютеры и работало более/менее.


    1. Aniro
      28.11.2023 10:20

      Вы можете использовать любые 7B или 13B gguf сетки на процессоре, уровень квантизации подберете экспериментально. Часть слоев можно будет скинуть даже на эту видеокарту. В text-generation-webui есть поддержка старых nvidia.

      А стоп. Не увидел что вам для картинок - тогда модели на базе Stable Diffusion 1.5


    1. barbashovtd
      28.11.2023 10:20
      +1

      Схожее железо, но 24ГБ RAM. Comfui просто прелесть, SD1.5 крутит хорошо. В зависимости от сэмплера 1.5-5 с/итерацию. Может даже в SSD-1B, но без лор

      https://github.com/comfyanonymous/ComfyUI


    1. mirooooooo
      28.11.2023 10:20

      Stable Diffusion исправно работает и генерирует за 20-30 секунд с разрешением 1024х1024px, у меня видеокарта Nvidia GTX 1080Ti на 4GB. Запускаю с параметрами --medvram --xformers.


      1. riky
        28.11.2023 10:20

        1080Ti имеет 11гб.


        1. mirooooooo
          28.11.2023 10:20

          Ошибся, 1050Ti.


    1. andrejbestuzhev
      28.11.2023 10:20

      Производительность не интересует от слова совсем

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


    1. PsihXMak
      28.11.2023 10:20

      Увы, для генерации картинок железо слабовато. Да и не вижу смысла пытаться запускать локально, когда есть google colab.


  1. files32
    28.11.2023 10:20

    А есть что-то, что может распознавать текст как ChatGPT? ChatGPT даже рукописный распознает, хотя и с ошибками.


    1. ruslantum
      28.11.2023 10:20

      LLaVА в статье же описана. там как пример как раз разпознавание текста на картинке.


    1. nav68
      28.11.2023 10:20

      Файнридер


  1. michael108
    28.11.2023 10:20

    Такой вопрос. Мне бы хотелось иметь возможность залезть внутрь подобной проги и посмотреть, как она работает -- типа поставить точку остановки, разобраться с параметрами и т.д. Цель -- понять, как можно было бы модифицировать код под свои задачи. Например, сделать анализатор текстов, заточенный на определенную область науки. Я знаю, что сетку надо натренировать на каком-то пуле текстов. Но, с моей точки зрения, это просто приведет к тому, что она будет выдавать последовательнсти слов, имеющиеся в этих текстах. А я хочу большего -- например, чтобы сетка могла выяснить, что ей не хватает какой-то инфы, и могла залезть в Сеть и поискать ее. Для этого надо хорошо знать, что и где добавть в коде или поменять. Может, кто-нибудь подскажет, какая из open-source сеток позволяет подобный апгрейд и с чего бы стоило начать подобную работу? В идеале мне бы хотелось работать под Visual Studio или Code, т.к. все время работаю под Виндой.


    1. rPman
      28.11.2023 10:20
      +15

      Топаешь сюда, клонируешь, настраиваешь свою среду разработки, там cmake (я в eclipse настраивал, отладка работала), там поддерживается тьма тьмущая открытых сетей, читай, ищи готовые примеры и finetune на huggingface (будь готов к десяткам гигабайт на каждую), для работы потребуют сравнимое количество RAM (есть начальная поддержка gpu, причем даже если ее не хватает чуть чуть)

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

      а вот тут тебе исходники и отладка не помогут. Нейронные сети работают так что внутрь залезть практически невозможно (но попытки есть), можно попытаться дообучить/переобучить- finetuning, можно попробовать поработать с запросами (точнее с весами входов) - peft и в любом случае это требует оборудования (gpu к сожалению пока только nvidia) с оперативной памятью, в которую помещается все веса выбранной тобой сети (количество параметров умножить на 2 плюс еще несколько гигабайтов, лучше больше) и еще сложнее, подготовленных датасетов обучающих данных под твою задачу (именно на этом и на том как именно их используют современные языковые модели улучшают)

      p.s.

      gpt сети работают в общем так (на самом деле там сложнее, есть еще понятие состояние но по исходникам моих знаний в этом разобраться не хватает) - текст преобразуется в токены, затем входные токены записываются в контекстное окно (оно всегда одного размера), остальное место заполняется условными нулями, и это окно подается как вход на нейронную сеть (каждому токену соответствует свой вектор чисел, именно эти числа и идут на вход), нейронная сеть в данном случае последовательность (кстати там не просто линейная последовательность а граф) операций над матрицами и векторами (произведения, нормализация и т.п.) пример сеть llama34b это ~700 шагов, на выходе получается вектор (размерность количество всех возможных токенов) вероятности следующего токена после введенных на старте... по некоторому алгоритму (в который ты уже можешь залезть и поменять) выбирается токен (например с максимальной вероятностью - это temp=0, или случайный из топ N токенов с максимальной вероятностью,...), он выводится пользователю (декодируется обратно в текст) и подсовывается как следующий в контекстное окно (если достигли конца, то по какому то алгоритму, который ты тоже можешь контролировать, все или часть окна сдвигается в начало, удаляя старый токен) и процесс повторяется до тех пор, пока не будет прерван пользователем, или условием в программе или финишным токеном.

      Ты можешь вмешаться в алгоритмы выбора следующего токена, алгоритм детектирования окончания генерации, и алгоритм сдвига контекстного окна при его переполнении (например чтобы твой стартовый промпт остался нетронутым).

      llama.cpp проект непрерывно дорабатывается и улучшается, в него внедряется космическими темпами все самое интересное, например сейчас пилится ускорение вычислений за счет того что следующий токен скорее всего будет в той же 'области знаний' что и предыдущий (это видно при генерации по вероятностям) и многие вычисления внутри операций над матрицами можно взять из предыдущего шага... вроде говорят что можно ускорить 10-40кратно! генерацию. Но чтобы такие изменения делать, нужно быть в теме на очень глубоком уровне


    1. GrimAnEye
      28.11.2023 10:20
      +2

      Для базовой теории (с созданием простенькой сетки разбора почерка), рекомендую прочитать "Создаем нейронную сеть" Тарик Рашид (пример). Большая часть книги - это математические основы, но они дают базу для понимая происходящих процессов


  1. yrub
    28.11.2023 10:20
    +7

    https://lmstudio.ai/ - самый простой и удобный способ найти, скачать и запустить чат модель под win lin mac, есть и готовые промт темплейты, и встроенный api сервер совместимый с openai форматом. text-generation-webui все же сложнее в установке и  освоении, зато gptq формат моделей поддерживает, который работает быстрее на nvidia, lmstudio пока не могет


  1. eugenk
    28.11.2023 10:20
    +2

    Ребят, извините не могу ответить всем. Тут и так крыша потихоньку едет от плотного погружения в vulkan. ОГРОМНОЕ ВСЕМ СПАСИБИЩЩЕ И РЕСПЕКТИЩЩЕ ! Дали мне хотя бы отправную точку, откуда начинать искать. Надеюсь всё получится.


  1. vesowoma
    28.11.2023 10:20
    +5

    На КПДВ в ответе ИИ - опечатка в названии группы. ИИ тоже по клавиатуре промахивается?


    1. perfect_genius
      28.11.2023 10:20

      На этом скриншоте тоже ошибка:

      "внимание к собой"


    1. IgorPie
      28.11.2023 10:20
      +1

      Но ведь, Все идет по плану была написана в 1988, а не в 1984. Фактическая ошибка.

      И это еще про Нирвану у роботов не спрашивали


  1. yrub
    28.11.2023 10:20
    +1

    Требуется 14гб памяти или после квантования до 5 bit всего 5гб, что для модели уровня ChatGPT-3.5 хороший результат.

    вот только после квантования она станет вообще-то хуже


    1. vvzvlad
      28.11.2023 10:20
      +1

      Ну не факт


      1. yrub
        28.11.2023 10:20

        тогда в чем логика не квантовать?)) https://habr.com/ru/articles/764598/ тут имеется табличка и чуть подробней про все расписано, и есть вопросы насчет накапливающейся ошибки, т.е. просто так взять скажем 30% вряд ли можно. Ах да, есть же Open LLM Leaderboard, так что и обсуждать нечего

        Ну и насчет сравнений с chatgpt: бенчмарки судя по всему открыты и есть подгон под них со стороны участников, кроме chatgpt


        1. riky
          28.11.2023 10:20

          для дообучения нужна не квантованная. а так конечно со стороны квантование странно выглядит из 16 бит оставляем только 4-5 и она не сильно проигрывает в качестве.


  1. 413x
    28.11.2023 10:20

    У кого-нибудь получилось запустить модели через koboldcpp?


    1. MountainGoat
      28.11.2023 10:20
      +1

      Ну у меня получилось всё, что пробовал. Считаю, что это лучший софт для чат-моделей, на голову лучше oobaboga.


    1. DrXak
      28.11.2023 10:20
      +1

      Я использую koboldcpp-rocm, что, кстати, по-моему, является единственной опцией для владельцев AMD на Windows.


    1. vikarti
      28.11.2023 10:20
      +1

      У меня например. Единственное - схемы с 2 GPU работают с некоторыми приколами если видеопамяти и так на пределе, надо либо подбирать распределение по картам (а там НЕ учитывается похоже место под контекст) либо не трогать в драйверах system memory fallback (или вообще его включить).


  1. remindscope
    28.11.2023 10:20
    +1

    Большое спасибо за статью. Извиняюсь, если глупые вопросы, но эти модели можно дергать по API? И как ситуация с цензурой?


    1. Moog_Prodigy
      28.11.2023 10:20
      +2

      В ридми опенчата написано, что можно по апи.

      Once started, the server listens at localhost:18888 for requests and is compatible with the OpenAI ChatCompletion API specifications. Please refer to the example request below for reference. Additionally, you can use the OpenChat Web UI for a user-friendly experience.


    1. ruslantum
      28.11.2023 10:20
      +3

      у почти каждого клиента есть OpenAI-compatible апи сервер, список клиентов тут:
      https://huggingface.co/TheBloke/deepseek-coder-33B-instruct-GGUF#about-gguf
      по поводу цензуры у deepseek не указано, openchat тоже еще не смотрел. zephyr и mistral не цензурят:
      https://huggingface.co/HuggingFaceH4/zephyr-7b-beta#bias-risks-and-limitations
      https://huggingface.co/mistralai/Mistral-7B-v0.1#notice


  1. ruslantum
    28.11.2023 10:20
    +1

    спасибо за статью, про deepseek не знал, интересная модель, до этого крутил mistral и zephyr сначала на LM Studio, потом с text-generation-webui поднял сервис на k8s. памяти на рабочей машине для deepseek coder 33b вроде должно хватить, попробую повторить подвиг первого комметатора :)


  1. AllexIn
    28.11.2023 10:20
    +2

    Спасибо за наводку на OpenChat. Действительно, лучше себя показывает чем Мистраль, которую использовал до этого.


    1. AllexIn
      28.11.2023 10:20

      Ладно. Я поторопился....


  1. j-b
    28.11.2023 10:20
    +1

    Все хорошо, а как теперь запустить API чат вот с этим openchat_3.5-q5_K_M.gguf как сервис, что-бы делать запросы по restapi ? :)


    1. ruslantum
      28.11.2023 10:20
      +1

      на huggingface ниже описания gguf есть список клиентов:
      https://huggingface.co/TheBloke/deepseek-coder-33B-instruct-GGUF#about-gguf
      они почти все поднимают кроме веб морды с чатом еще и OpenAI-compatible апи сервер


    1. AllexIn
      28.11.2023 10:20
      +2

      Gpt4All скачайте. Там и менеджер удобный, и встроенный чат, и возможность запустить сервер с OpenAI API.


  1. maxwolf
    28.11.2023 10:20
    +5

    Кто-нибудь тут пробовал DeepSeek Coder в реальной разработке? Меня, в основном, интересуют подходы к его "затачиванию" на конкретный проект. Как "скормить" ему ~пару сотен MB исходников кодовой базы "с повышающим коэффициентом", чтобы он генерил не абстрактный код, а, например, использовал API библиотек, применяемых в проекте? Файнтюнить? Как? Подсовывать всё в промпт? Есть хорошо работающие примеры?


    1. TedBeer
      28.11.2023 10:20

      Imho для (до-)обучения нужно железо помощнее. Для тренировки ChatGpt3 OpenAI использовала

      > 285,000 CPU cores, 10,000 GPUs and 400 gigabits per second of network connectivity for each GPU server,

      Одна NVidia A100 стоит порядка 20к евро. Большие компании строят кластеры из тысяч таких плат. А сколько это еще электричества потребляет! В аренду можно взять виртуальный сервер с мощными GPU специально для тренировки модели. Видел цены порядка €3-6 за час работы (https://www.oracle.com/cloud/compute/gpu/) А уже натренированную сеть можно гонять локально на более слабом железе. Конкретных рецептов для вашей задачи еще не встречал. У меня на работе исследуют подобную возможность, но пока общедоступных для других команд результатов еще нет. Лучше поискать такое на Reddit (https://www.reddit.com/r/LocalLLaMA/ например) Там и народу побольше и доступность хорошего железа получше.


    1. TedBeer
      28.11.2023 10:20
      +1

      Кстати DeepSeek-Coder readme содержит инструкцию как до-обучить модель, как готовить правильно данные - https://github.com/deepseek-ai/DeepSeek-Coder/blob/main/README.md#5-how-to-fine-tune-deepseek-coder


  1. siberianlaika
    28.11.2023 10:20
    +1

    Не совсем по статье, просто общий вопрос. Если мне хочется, чтобы контекст общения запоминался постоянно, не для каждой новой сессии? Как пример, дать какую-то инфу о себе, чтобы нейросеть её помнила, не объясняя каждый раз заново. Как я понимаю, это даже не про дообучение модели, а про сохранение контекста. На ум приходят идеи, как это программно закостылить в виде БД, которая подтягивается в каждую сессию. Но не хочется изобретать велосипед, может есть готовые решения?


    1. TheRikipm
      28.11.2023 10:20

      Вставлять инфу в каждый промпт.


    1. AllexIn
      28.11.2023 10:20
      +2

      Gpt4All LocalDocs


    1. vikarti
      28.11.2023 10:20
      +1

      Silly Tavern, world info (например)


  1. johnfound
    28.11.2023 10:20
    +2

    Надо сказать, что какой-то результат есть. Вот мои эксперименты с OpenChat:

    Первая попытка с «говорящими этикетами»

    Я:

    Что делает этот код. Какие входные параметры? Как работает код?
    Для чего используется рекурсия? Проиграй этот код для входных значений: EAX = 321, ECX = 16, EDI = 1000h

        num2str:
            cmp   eax,ecx
            jb    .less_than_radix
            xor   edx,edx
            div   ecx
            push  edx
            call  num2str
            pop   eax
    
        .less_than_radix:
    
            cmp   al, 10
            sbb   al, 69h
            das
            stosb
            ret                                     
    

    OpenChat:

    Этот код преобразует десятичное число, заданное в регистрах EAX в строковое представление в регистре EDI. Рекурсия используется для преобразования числа в строку до тех пор, пока число не станет меньше радикса (в данном случае 16).

    Входные параметры:

        EAX - десятичное число, которое нужно преобразовать в строку.
        ECX - радикс (количество символов в числе).
        EDI - адрес начала строкового буфера, в который будет записано строковое представление числа.
    

    Код работает следующим образом:

    Сравнивается значение EAX с ECX. Если EAX меньше ECX, выполняется переход к метке .less_than_radix.
    Если EAX больше или равно ECX, выполняется деление EAX на ECX с помощью инструкции DIV и результат деления записывается в регистр EDX.
    Затем EDX push-ается на стек, и вызывается сама функция num2str с переходом к метке .less_than_radix.
    После вызова функции num2str, выполняется pop эксклюзивного адреса EAX, чтобы вернуть значение EDX с стека.
    Метка .less_than_radix выполняет следующие действия:

    a. Сравнивается значение AL (нижший байт EAX) с 10. Если AL меньше 10, выполняется сдвиг вправо AL на 1 и записывается результат в AL.

    b. Затем выполняется сравнение AL и 69h (105 в десятичной системе счисления). Если AL больше 105, выполняется сдвиг влево AL на 1 и записывается результат в AL.

    c. Записывается в строковый буфер EDI значение AL.

    d. Увеличивается адрес EDI на 1.

    Функция num2str заканчивает свою работу, когда EAX станет меньше ECX.

    Выполнение кода для входных значений EAX = 321, ECX = 16, EDI = 1000h:

    Сравнение EAX и ECX дает false, поэтому переход к метке .less_than_radix.

    Сравнение AL и 10 дает false, поэтому переход к метке .less_than_radix.

    Запись в строковый буфер EDI значения AL (32) и увеличение адреса EDI на 1.

    Сравнение AL и 10 дает false, поэтому переход к метке .less_than_radix.

    Запись в строковый буфер EDI значения AL (2) и увеличение адреса EDI на 1.

    Сравнение AL и 10 дает false, поэтому переход к метке .less_than_radix.

    Запись в строковый буфер EDI значения AL (1) и увеличение адреса EDI на 1.

    Теперь EAX стало меньше ECX, поэтому функция num2str заканчивает свою работу.

    После выполнения кода в строковом буфере EDI будет записано "321".

    Стоит изменить наименование этикетов, и понимание улетучивается:

    Вторая попытка с «абстрактными этикетами»

    Я:

    Что делает этот код. Какие входные параметры? Как работает код?
    Для чего используется рекурсия? Проиграй этот код для входных значений: EAX = 321, ECX = 16, EDI = 1000h

    start:
        cmp   eax,ecx
        jb    .less
        xor   edx,edx
        div   ecx
        push  edx
        call  start
        pop   eax
    
    .less:
    
        cmp   al, 10
        sbb   al, 69h
        das
        stosb
        ret
    

    OpenChat:

    Этот код реализует рекурсивную процедуру, которая выполняет следующие действия:

    Сравнивает значения регистров EAX и ECX. Если EAX меньше ECX, то переходит к метке .less.

    Если EAX больше или равно ECX, выполняет деление EAX на ECX с помощью инструкции DIV и сохраняет остаток в регистре EDX. Затем вызывает саму себя с помощью инструкции CALL, что означает, что это рекурсивная функция.

    После рекурсивного вызова функции, выполняет обратное вызов (RET) с помощью инструкции POP и сохраняет значение EAX в стеке.

    Метка .less содержит код, который выполняется, когда EAX меньше ECX. Он сравнивает значение AL (нижших 8 бит EAX) с числом 10. Если AL меньше 10, то выполняет сравнение AL и 69h (105 в десятичной системе счисления) с помощью инструкции SBB (сравнение с установлением знакового флага). Затем выполняет инструкцию DAS (дополнительная сумма), которая меняет местами младшие и старшие байты регистра EDI. Затем выполняет инструкцию STOSB, которая записывает значение AL в память по адресу EDI и увеличивает EDI на 1.

    После выполнения метки .less, код возвращается из рекурсивного вызова с помощью инструкции RET.

    Входные параметры для этого кода:

        EAX - значение, на котором выполняется операция.
        ECX - значение, с которым выполняется деление.
        EDI - указатель на начало области памяти, в которую будут записываться результаты вычислений.
    

    Рекурсия используется для реализации деления с остатком в этом коде. Благодаря рекурсии, код может легко выполнить деление на число ECX без использования стандартной инструкции DIV.

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

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


  1. Moog_Prodigy
    28.11.2023 10:20

    А как запустить то все это дело именно в режиме таком, который предлагает демо-сайт? Демо впечатляет. Я уже раз 10 перечитал статью, все скачал, а как это запускать не очень врубился. Т.е. модель еще переквантизовать надо, если комп не с 32 гигами озу? Видеокарта то нужна или нет? И экешников нигде нет, а я ж виндузятник. с SD нормально разобрался, и первую ламу одну из - поставил и оно там даже что то работало. А тут? Помогите. Не могу разобраться.


    1. PsihXMak
      28.11.2023 10:20
      +2

      1. Иди на гит и скачивай koboldcpp - это интерфейс.

      2. Выбирай нужную модель из статьи и скачивай 7B gguf - это сама модель.

        Дальше запускаешь kobold и в настройках выбираешь путь к своей модели.


      1. dimwap
        28.11.2023 10:20

        del


  1. Zargiel
    28.11.2023 10:20
    +1

    но она ощутимо превосходит Alpaca, Vicuna и прочие открытые модели

    Alpaca? Vicuna? Вы из какого года?

    Что по сравнению с Zephyr, OpenHermes, Yi?


    1. janvarev
      28.11.2023 10:20
      +1

      Лучше Зефира и Гермеса по метрикам

      https://huggingface.co/openchat/openchat_3.5


  1. world1709
    28.11.2023 10:20
    +2

    Попытал openchat с релятивистскими скоростями сначала на русском:

    и потом на английском:

    после того как подсказал формулу расчета он почти справился) помогла вторая подсказка)


  1. Scytheros
    28.11.2023 10:20
    +1

    Спасибо за статью ???? А насколько GPU влияет на производительность и скорость обработки при условии среднемощного CPU? А в случае с CPU имеют ли смысл системы Dual-CPU на тех же Xeon (понятное - из ныне бюджетного б/у)? Не столько профцели, сколько просто спортивный интерес


    1. janvarev
      28.11.2023 10:20
      +1

      GPU все равно очень сильно быстрее - от 3 до 10 раз; если есть возможность, лучше всё перекладывать на них.


  1. DivoTech
    28.11.2023 10:20
    +1

    Как подключить к нему свой набор данных (например, архив хабра)?


  1. janvarev
    28.11.2023 10:20
    +1

    Если кому вдруг нужно побаловаться, запустил для OpenChat интернет-инстанс с доступом по OpenAI API (у меня куча сеток по нему доступны, а теперь и он тоже)


  1. jarkevithwlad
    28.11.2023 10:20
    +1

    спасибо, собрал себе сборку на пк, запускается секунд 10, отвечает быстро, потребляет 15гб ram и 8гб vram