Есть много локальных аналогов 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/
Эта модель, по заявлению разработчиков, превосходит модели с 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 параметров.
Можно спросить, что она видит конкретное на изображении?
Где брать модели и как их квантовать самостоятельно
Модели обычно можно найти на 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. Цитата оттуда:
Графический интерфейс для 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 приложение которое имитирует мессенджер:
Как использовать DeepSeek Coder
OpenChat может генерировать код, но в зависимости от сложности и дополнительных условий, она будет выдавать не совсем то, что ожидается. В этом смысле DeepSeek куда ближе к ChatGPT, чем OpenChat.
Для генерации только кода, вам нужно взять модель с именем instruct, она генерирует код лучше чем base модель в которой есть режим чата и поэтому она хуже справляется с кодом. А сам чат нужно перевести тоже в режим instruct для лучшего результата (тоже самое можно делать для OpenChat, если нужен только код):
После этого модель сможет лучше понимать, что вы от неё хотите и лучше додумывать, что это могло бы означать в формате кода. Попробуем попросить его сгенерировать bash-скрипт, с которым у OpenChat проблема.
Если дать тоже задание OpenChat, то с первого раза модель не всегда будет выполнять все условия которые ожидаются, например, будет записывать уже обработанные файлы, но не проверяет их, чтобы повторно не обрабатывать. И с одной стороны правильно, этого не было в условии, но DeepSeek и ChatGPT сразу понимают, что это подразумевается и ожидается.
Попробуем что-то посложнее, с чем и у ChatGPT есть сложность, чтобы с 1 раза сгенерировать всё правильно.
Запрос: Напиши приложение на flutter которое будет показывать случайный комикс xkcd. Должна быть кнопка показать следующий комикс. Должна быть кнопка добавить в избранное и возможность посмотреть своё избранное
Код с виду рабочий, но при запуске показываются ошибки, пока ничего страшного, такие же ошибки генерирует и ChatGPT. ChatGPT может их исправить если ему кидать сообщения об ошибках, посмотрим как с этим у DeepSeek:
Применим исправления и попробуем запустить и посмотреть, что получилось. Да, теперь программа успешно запустилась:
Пролистывание работает, но оно не рандомное, а на 1 комикс вперед. Кнопка добавления в избранное работают, сам список избранного в виде бесконечной ленты отображает, кнопка назад на главный экран тоже предусмотрена.
В этой же задачей ChatGPT-3.5 справился похожим образом, он тоже не получал рандомный комикс и генерировал не рабочий Flutter код, но после нескольких итераций сообщения об ошибках, он ошибки исправил, также как и DeepSeek. Можно сделать поверхностный вывод, что в более редких сценариях, чем являются Dart и Flutter, они показали себя равнозначно.
Комментарии (69)
eugenk
28.11.2023 10:20Ребят, извиняюсь за тупость, глупость и невежество, но вопрос такой. У меня ноутбук Ryzen-5, 16Gb, Nvidia 1650 4Gb под линуксом. Скажите, существуют в природе какие-нибудь нейросетки, которым будет достаточно такого железа ??? Производительность не интересует от слова совсем. Пусть хоть час работает. Интересна в первую очередь (а может быть и исключительно) генерация картинок. И даже более специализированно - генерация арта для игр. Хочу освоить это дело.
freeExec
28.11.2023 10:20Видюха ни о чём, но можешь обсчитывать на проце, и час это наверное слишком оптимистично. В общем я бы поберёг нервы.
Resursator
28.11.2023 10:20+1У deepseek coder есть разные варианты, какая-нибудь вариация из 1.7b может запуститься с использованием видеокарты. Но работает так себе, судя по запросу накодить змейку. Не знаю, будет ли вообще какая-то выгода от запуска нейронки на такой видеокарте, но можно попробовать и 6.7b варианты, с нагрузкой на CPU, ОЗУ может и хватит. Правда, и на моём i7-8700k оно было ощутимо медленнее, чем на видеокарте rtx 4070. Запускаю максимально уместившуюся в 12 гигов видеопамяти 6.7b-instruct-q8_0, но там есть варианты полегче.
Не заметил, что интересует генерация картинок, их я особо не пробовал пока.
Chizhikov
28.11.2023 10:20Посмотрите в сторону https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-AMD-GPUs
На 5 рязани работает у меня, конечно генерация не пару секунд на картинку, но потерпеть иногда можно.
BigDaddy09
28.11.2023 10:20Посмотри на последние драйвера на свою карту. Нвидиа выкатили прикол что бы карта могла брать недостающую память из оперативки. Она будет медленней чем родная память карты раз в 10 но расширение прям большое может быть. Я поставил эти драв на свою 3060. Когда память забивается, автоматом идёт наполнение озу
johnfound
28.11.2023 10:20Все из этой статьи должно работать. Я запускал и на слабее компьютеры и работало более/менее.
Aniro
28.11.2023 10:20Вы можете использовать любые 7B или 13B gguf сетки на процессоре, уровень квантизации подберете экспериментально. Часть слоев можно будет скинуть даже на эту видеокарту. В text-generation-webui есть поддержка старых nvidia.
А стоп. Не увидел что вам для картинок - тогда модели на базе Stable Diffusion 1.5
barbashovtd
28.11.2023 10:20+1Схожее железо, но 24ГБ RAM. Comfui просто прелесть, SD1.5 крутит хорошо. В зависимости от сэмплера 1.5-5 с/итерацию. Может даже в SSD-1B, но без лор
mirooooooo
28.11.2023 10:20Stable Diffusion исправно работает и генерирует за 20-30 секунд с разрешением 1024х1024px, у меня видеокарта Nvidia GTX 1080Ti на 4GB. Запускаю с параметрами
--medvram
--xformers
.
andrejbestuzhev
28.11.2023 10:20Производительность не интересует от слова совсем
Это только кажется. Когда столкнётесь со всякими нейронеточностями, захочется рисовать за меньшее время побольше вариантов. На вашем железе за час сделаете 30 картинок максимум. И это очень мало, учитывая, какой бред оно порой генерирует.
PsihXMak
28.11.2023 10:20Увы, для генерации картинок железо слабовато. Да и не вижу смысла пытаться запускать локально, когда есть google colab.
michael108
28.11.2023 10:20Такой вопрос. Мне бы хотелось иметь возможность залезть внутрь подобной проги и посмотреть, как она работает -- типа поставить точку остановки, разобраться с параметрами и т.д. Цель -- понять, как можно было бы модифицировать код под свои задачи. Например, сделать анализатор текстов, заточенный на определенную область науки. Я знаю, что сетку надо натренировать на каком-то пуле текстов. Но, с моей точки зрения, это просто приведет к тому, что она будет выдавать последовательнсти слов, имеющиеся в этих текстах. А я хочу большего -- например, чтобы сетка могла выяснить, что ей не хватает какой-то инфы, и могла залезть в Сеть и поискать ее. Для этого надо хорошо знать, что и где добавть в коде или поменять. Может, кто-нибудь подскажет, какая из open-source сеток позволяет подобный апгрейд и с чего бы стоило начать подобную работу? В идеале мне бы хотелось работать под Visual Studio или Code, т.к. все время работаю под Виндой.
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кратно! генерацию. Но чтобы такие изменения делать, нужно быть в теме на очень глубоком уровне
yrub
28.11.2023 10:20+7https://lmstudio.ai/ - самый простой и удобный способ найти, скачать и запустить чат модель под win lin mac, есть и готовые промт темплейты, и встроенный api сервер совместимый с openai форматом. text-generation-webui все же сложнее в установке и освоении, зато gptq формат моделей поддерживает, который работает быстрее на nvidia, lmstudio пока не могет
eugenk
28.11.2023 10:20+2Ребят, извините не могу ответить всем. Тут и так крыша потихоньку едет от плотного погружения в vulkan. ОГРОМНОЕ ВСЕМ СПАСИБИЩЩЕ И РЕСПЕКТИЩЩЕ ! Дали мне хотя бы отправную точку, откуда начинать искать. Надеюсь всё получится.
yrub
28.11.2023 10:20+1Требуется 14гб памяти или после квантования до 5 bit всего 5гб, что для модели уровня ChatGPT-3.5 хороший результат.
вот только после квантования она станет вообще-то хуже
vvzvlad
28.11.2023 10:20+1Ну не факт
yrub
28.11.2023 10:20тогда в чем логика не квантовать?)) https://habr.com/ru/articles/764598/ тут имеется табличка и чуть подробней про все расписано, и есть вопросы насчет накапливающейся ошибки, т.е. просто так взять скажем 30% вряд ли можно. Ах да, есть же Open LLM Leaderboard, так что и обсуждать нечего
Ну и насчет сравнений с chatgpt: бенчмарки судя по всему открыты и есть подгон под них со стороны участников, кроме chatgpt
riky
28.11.2023 10:20для дообучения нужна не квантованная. а так конечно со стороны квантование странно выглядит из 16 бит оставляем только 4-5 и она не сильно проигрывает в качестве.
413x
28.11.2023 10:20У кого-нибудь получилось запустить модели через koboldcpp?
MountainGoat
28.11.2023 10:20+1Ну у меня получилось всё, что пробовал. Считаю, что это лучший софт для чат-моделей, на голову лучше oobaboga.
DrXak
28.11.2023 10:20+1Я использую koboldcpp-rocm, что, кстати, по-моему, является единственной опцией для владельцев AMD на Windows.
vikarti
28.11.2023 10:20+1У меня например. Единственное - схемы с 2 GPU работают с некоторыми приколами если видеопамяти и так на пределе, надо либо подбирать распределение по картам (а там НЕ учитывается похоже место под контекст) либо не трогать в драйверах system memory fallback (или вообще его включить).
remindscope
28.11.2023 10:20+1Большое спасибо за статью. Извиняюсь, если глупые вопросы, но эти модели можно дергать по API? И как ситуация с цензурой?
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.
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
ruslantum
28.11.2023 10:20+1спасибо за статью, про deepseek не знал, интересная модель, до этого крутил mistral и zephyr сначала на LM Studio, потом с text-generation-webui поднял сервис на k8s. памяти на рабочей машине для deepseek coder 33b вроде должно хватить, попробую повторить подвиг первого комметатора :)
j-b
28.11.2023 10:20+1Все хорошо, а как теперь запустить API чат вот с этим openchat_3.5-q5_K_M.gguf как сервис, что-бы делать запросы по restapi ? :)
ruslantum
28.11.2023 10:20+1на huggingface ниже описания gguf есть список клиентов:
https://huggingface.co/TheBloke/deepseek-coder-33B-instruct-GGUF#about-gguf
они почти все поднимают кроме веб морды с чатом еще и OpenAI-compatible апи сервер
AllexIn
28.11.2023 10:20+2Gpt4All скачайте. Там и менеджер удобный, и встроенный чат, и возможность запустить сервер с OpenAI API.
maxwolf
28.11.2023 10:20+5Кто-нибудь тут пробовал DeepSeek Coder в реальной разработке? Меня, в основном, интересуют подходы к его "затачиванию" на конкретный проект. Как "скормить" ему ~пару сотен MB исходников кодовой базы "с повышающим коэффициентом", чтобы он генерил не абстрактный код, а, например, использовал API библиотек, применяемых в проекте? Файнтюнить? Как? Подсовывать всё в промпт? Есть хорошо работающие примеры?
TedBeer
28.11.2023 10:20Imho для (до-)обучения нужно железо помощнее. Для тренировки 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/ например) Там и народу побольше и доступность хорошего железа получше.
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
siberianlaika
28.11.2023 10:20+1Не совсем по статье, просто общий вопрос. Если мне хочется, чтобы контекст общения запоминался постоянно, не для каждой новой сессии? Как пример, дать какую-то инфу о себе, чтобы нейросеть её помнила, не объясняя каждый раз заново. Как я понимаю, это даже не про дообучение модели, а про сохранение контекста. На ум приходят идеи, как это программно закостылить в виде БД, которая подтягивается в каждую сессию. Но не хочется изобретать велосипед, может есть готовые решения?
johnfound
28.11.2023 10:20+2Надо сказать, что какой-то результат есть. Вот мои эксперименты с OpenChat:
Первая попытка с «говорящими этикетами»
Я:
Что делает этот код. Какие входные параметры? Как работает код?
Для чего используется рекурсия? Проиграй этот код для входных значений: EAX = 321, ECX = 16, EDI = 1000hnum2str: 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 = 1000hstart: 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.
Тем не менее, результат вполне приемлем. Ведь и не все программисты сразу поймут что это такое и как работает. А нейросетка хоть что-то вменяемое пишет.
Попробовал попросить ее переписать этот код, но без рекурсии. Она знает, что так можно, но так как не понимает рекурсию, то и развернуть ее в цикле не получается.
Moog_Prodigy
28.11.2023 10:20А как запустить то все это дело именно в режиме таком, который предлагает демо-сайт? Демо впечатляет. Я уже раз 10 перечитал статью, все скачал, а как это запускать не очень врубился. Т.е. модель еще переквантизовать надо, если комп не с 32 гигами озу? Видеокарта то нужна или нет? И экешников нигде нет, а я ж виндузятник. с SD нормально разобрался, и первую ламу одну из - поставил и оно там даже что то работало. А тут? Помогите. Не могу разобраться.
world1709
28.11.2023 10:20+2Попытал openchat с релятивистскими скоростями сначала на русском:
и потом на английском:
после того как подсказал формулу расчета он почти справился) помогла вторая подсказка)
Scytheros
28.11.2023 10:20+1Спасибо за статью ???? А насколько GPU влияет на производительность и скорость обработки при условии среднемощного CPU? А в случае с CPU имеют ли смысл системы Dual-CPU на тех же Xeon (понятное - из ныне бюджетного б/у)? Не столько профцели, сколько просто спортивный интерес
janvarev
28.11.2023 10:20+1GPU все равно очень сильно быстрее - от 3 до 10 раз; если есть возможность, лучше всё перекладывать на них.
janvarev
28.11.2023 10:20+1Если кому вдруг нужно побаловаться, запустил для OpenChat интернет-инстанс с доступом по OpenAI API (у меня куча сеток по нему доступны, а теперь и он тоже)
jarkevithwlad
28.11.2023 10:20+1спасибо, собрал себе сборку на пк, запускается секунд 10, отвечает быстро, потребляет 15гб ram и 8гб vram
Resursator
Настроил deepseek coder с применением ollama, и подключил к vscode с помощью continue. Ну и дополнительно ollama webui запустил. Очень удобно, хотя, возможно, есть интерфейс и получше, но оно и так работает.
XPb14
не подскажете краткую инструкцию?
Resursator
Ну, как-то так. Тут всё через докер, можно и нативно поставить, но я с этим не заморачивался.
Установить дрова для nvidia cuda и докер. Нужно, чтобы из контейнеров докера был доступ к видеокарте, т.е. команда типа
docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
выводила информацию о видеокарте.Клонировать ollama-webui. Там есть docker-compose.yml с необходимой минимальной настройкой. Разве что порты у сервиса ollama раскомментировать. Также можно добавить локальную папку в volume у ollama, например так.
- ./ollama_models/:/models
Пригодится, если будете дорабатывать существующие нейронки заменой системного промпта, например.Выполнить
docker compose up -d. Должен заработать ollama-webui на
http://localhost:3000/Библиотека уже готовых моделей тут. Инструкция по ollama конкретно есть в репозитории. Для deepseek coder нужно выбрать подходящий тэг и пуллить командой типа
docker exec ollama ollama pull deepseek-coder:6.7b-instruct-q8_0
. После чего в webui можно будет поспрашивать по коду. Правда, лично у меня на линуксе из webui конкретно эта нейронка не может выгружать слои в видеопамять. Собственно, почему 1й пункт этой инструкции со ссылкой под винду - я так и не разобрался, из-за чего так.Для режима копилота в VScode: в папке
./ollama_models
создать modelfile - текстовый файл с удобным именем и содержимым типа
После чего выполнитьFROM deepseek-coder:6.7b-instruct-q8_0
docker exec ollama ollama create deepseeker-copilot-f /models/modelfile
Это, возможно, лишнее, но мне кажется, Continue не очень корректно отрабатывает разные теги у нейронок в ollama, он вообще выдаёт ошибку за использование неправильной нейронки в конфиге.Установить расширение Continue. После начальной настройки в файле в папке пользователя\.continue\config.json добавить в модели свою нейронку и сохранить.
,
{
"title": "DeepSeeker Copilot",
"provider": "ollama",
"model": "deepseeker-copilot",
"api_base": "http://localhost:11434"
}
Выбрать DeepSeeker Copilot из нейронок и развлекаться. Кстати, через расширение DeepSeek Coder работает с выгрузкой в видеокарту и в линуксе, так что, вероятно, проблема всё-таки со стороны именно webui у меня.
XPb14
огромное большое спасибо
XPb14
И тогда я еще от себя отпишу, я до коммента все нативно поставил
ставим расширение https://marketplace.visualstudio.com/items?itemName=Continue.continue
Ставим ollama https://github.com/jmorganca/ollama
curl https://ollama.ai/install.sh | sh
Добавляем DeepSeek https://github.com/jmorganca/ollama/issues/1040#issuecomment-1818147154 в этом комменте инструкция
Добавляем в
~/.continue/config.json
в"models": [ ... ]
Стартуем оламу
ollama run deepseek-7B
В расширении выбираем deepseek
устанавливал вчера, может что-то пропустил, по памяти написал