Благодаря открытому исходному коду люди по всему миру могут работать вместе над созданием полезных технологий. Искусственный интеллект, обученный на огромных объемах данных, способен автоматизировать рутинную работу и освободить людей для творчества. Вместе эти технологии могут помочь построить общество равенства и изобилия, где каждый вносит посильный вклад и получает все необходимое для достойной жизни. Но важно, чтобы внедрение новых технологий отвечало интересам всего общества, а не узкой группы людей. Объединив усилия и знания, человечество способно создать по-настоящему справедливую коммунистическую систему, о которой мечтали великие умы прошлого.
(С) ЛЕНИН, модель ИИ от группы «Свободное время».
После довольно длительного перерыва я готов вернуться к написанию статей на Дзене. Моё отсутствие было обусловлено внезапным поворотом судьбы. Однажды на почту пришло сообщение о том, что некая международная школа Data Science под названием "Mathshub" собирается запустить бесплатные интенсивы по ИТ-специальностям. И тут меня как током шарахнуло - "удача сама идёт мне в руки"! И я записался на курсы по Python. А после них ещё и на курсы по MySQL...
Прежде чем перейти непосредственно к теме статьи я просто обязан поделиться своей радостью от этой неожиданной находки. Дело в том, что курсы оказались, несмотря на их бесплатность, действительно весьма содержательными. Два достаточно молодых преподавателя - Софья Труцуненко и Любовь Цурикова на протяжении двух месяцев за 6 занятий (по каждой из указанных специальностей) постарались сообщить слушателям практически всё, что входит в основы.
Для тех кто просто смотрел видео и повторял готовые примеры это могло бы показаться лёгкой прогулкой. Но для тех кто реально прорабатывал материал слово "интенсив" в названии курсов оказалось не пустым звуком. Я уже к третьему занятию начинал чувствовать как почва начинает ускользать из под ног. И чтобы не дать ей этого сделать пришлось пахать и пахать.
Процесс изучения python я ещё не журналировал, полагаясь на свою память, но потом понял свою ошибку и зафиксировал результат в написании программы на тысячу строк, в которой постарался отразить всё, чему научился. Она писалась по ходу примерно с середины курса и ещё неделю после него, поэтому в разных местах сильно отличается. Где-то ещё известны только условные операторы и списки, а где-то уже появились функции и файлы. И наконец словари функций.
Программа - небольшое текстовое приключение, на русском языке, но размещённая на американской площадке - replit.com. Запустить её можно нажав на треугольник, а посмотреть исходный код нажав "<>". Из-за её такого местонахождения есть нюансы, не со всех наших IP адресов она будет работать. Но, к сожалению, у нас вроде бы пока что нет подобных сервисов.
Для любопытствующих вот ссылка на эту игру: Wonderful journey
Процесс изучения MySQL был уже отражён в конспектах. Возможно, когда-нибудь я напишу по их мотивам несколько статей. Но ознакомиться с их содержимым любой желающий может уже сейчас.
Вот они:
1. Процесс установки MySQL Server и сопутствующих программ для выполнения заданий курса "Интенсив по основам SQL".
2. Начало работы в программе MySQL Workbench.
3. Изучение возможностей MySQL Workbench и практическая работа.
4. Изучение команд SQL из подмножества DML и DDL.
5. Практическая работа по построению сложных SQL запросов.
6. Сопряжение Python и MySQL.
Последний документ - уже не конспект, а моя самостоятельная работа в первые дни после окончания курса. В ней я стремился объединить то, чему я научился на обоих курсах в нечто целое. Применены также знания, полученные ранее при самостоятельном изучении сетевой системы Linux. В итоге вместе сошлись Python на площадке Google Colab и MySQL на моём домашнем компьютере. А также с ними обоими библиотеки PyMySQL и Pandas. А проводником для их встреч послужил OpenSSH.
Ну и за сим пора переходить к делу - к теме непосредственной сегодняшней статьи. Интерес у меня к ней возник в связи с тем, что процесс моего самообучения продолжается по намеченному ранее плану. И тех ИИ, с которыми я уже познакомил читателей мне уже не хватает. Чтобы двигаться дальше нужна компактная модель, которая могла бы стать объектом моих практических исследований и в то же время приносила бы пользу сама по себе своим содержанием.
Уже некоторое время различными группами исследователей предпринимаются попытки создания моделей, способных давать разумные ответы на запросы пользователя и в то же время занимающие минимальный объём оперативной памяти и памяти на диске. Это нужно для того, чтобы дать как можно большему количеству разработчиков и пользователей возможность развёртывания приложений на основе ИИ локально, в перспективе даже на таких устройствах как планшеты и смартфоны. Более того - на одноплатных компьютерах уровня Raspberry PI.
Одна из таких моделей, о которой в некоторых местах отзываются положительно - Mistral 7B, созданная командой из Франции: Albert Jiang, Alexandre Sablayrolles, Arthur Mensch и других, планирующих к 2024 году довести свой продукт до уровня, интересного для корпоративного сектора.
По словам разработчиков благодаря таким механизмам как "внимание к сгруппированным запросам" (GQA) и "скользящее окно внимания" (SWA) их модель Mistral 7B (семь миллиардов параметров) в ряде тестов превзошла куда более крупные модели Llama2-13B и Llama1-34B.
В рассуждениях, понимании и основах мышления (MMLU) Mistral 7B работает эквивалентно Llama 2, которая должна была бы быть в 3 раза больше по размеру. Это в равной степени касается экономии памяти и увеличения скорости работы. Полученная модель уступает Llama2-13B только в тестах на эрудицию.
Механизм внимания SWA, применённый в Mistral 7B заключается в том, что каждый слой отслеживает предыдущие 4096 скрытых состояний. Это приводит к более чем двукратному увеличению скорости для последовательности длинной 16 Кб при окне 4 Кб.
Скользящее окно внимания использует сложенные слои трансформера (transformer) для связывания с прошлыми событиями за пределями размера окна: токен i на уровне k обращается к токнам [i - sliding_window, i] на уровне k-1. Эти токены в свою очередь относились к токенам [i - 2* sliding_window, i]. И т.д. Более высокие уровни имеют доступ к информации из прошлого дальше, чем то, что влечёт за собой паттерны внимания.
Фиксированный объём внимания позволяет ограничить кэш размером токенов sliding_window, используя вращающиеся буферы. Это экономит половину кэш-памяти для вывода на основе последовательности длиной 8192, не влияя на качество модели.
Как использовать модель кратко описано на сайте разработчиков. Однако тамошние примеры ориентированы на облачные сервисы с графическими процессорами NVIDIA. Нас же интересуют более доступные для простого народа варианты запуска на своём домашнем железе. И здесь нам снова на помощь приходит ресурс Hugging Face и один из его выдающихся участников TheBloke (Tom Jobbins), который конвертировал привёл данную модель в подходящий для инференса на процессорах общего назначения (CPU) вид.
Имеется несколько вариантов квантизованных моделей для CPU, которые отличаются друг от друга размером файла весовых коэффициентов, качеством и скоростью работы модели. Золотая середина (на мой взгляд) - mistral-7b-v0.1.Q5_K_S.gguf, которая занимает на диске 5 Гб и требует максимум 7.5 Гб оперативной памяти.
После загрузки весовых коэффициентов модели остаётся определиться со средствами, которые будут использованы для дальнейшей работы. Здесь есть несколько различных вариантов. Помимо готовых к непосредственному использованию сборок, типа oobabooga, можно, например знаяться самостоятельной работой в какой-нибудь среде разработки, опираясь на python и библиотекии работы с машинным обучением (ML). Именно этим я и собираюсь заняться.
В качестве среды разработки у меня уже установлен и настроен Atom. А библиотеки, которые можно применить - llama-cpp-python и CTransformers.
Установим всё, что надо для обоих вариантов, а там разберёмся на какой предпочтительнее.
pip install llama-cpp-python
pip install langchain
pip install pandas
pip install tiktoken
pip install huggingface_hub
pip install ctransformers
Теперь запускаем редактор Atom, создаём новый файл, сохраняем его с расширением .py и начинаем соображать, как вспахтать змеем окены весовых коэффициентов ИИ модели Mistral 7B.
TheBloke предлагает такой стартовый вариант:
Но мы не ищем простых путей и сделаем по другому. Пишем свой код следующим образом.
from langchain.llms import CTransformers
stop_list=('<|im_end|>')
config = {'max_new_tokens': 2048, 'repetition_penalty': 1.1, 'last_n_tokens':256, 'temperature': 0.9, 'top_p': 0.8, 'top_k': 50, 'gpu_layers':0, \
'context_length': 256000, 'stop':stop_list, 'stream':True, 'reset':False}
print('Загружаем AI ассистента')
llm = CTransformers(model='/home/user/AI/mistral-7b-v0.1.Q5_K_S.gguf', config=config, model_type='mistral')
print('Загрузка завершена')
print('Переходим в режим чат-бота')
PRESET = """<|im_start|>system
You are assistant of user. This implies the assistant's answers to the user's \
questions and following his commands. Together you work productively \
on solving various tasks. Write out your reasoning step-by-step to be sure \
you get the right answers.Give the user a main part of your reasoning after \
the answer, so that he better understands how the result was obtained.\<|im_end|>"""
START_TAG = "<|im_start|>user question : "
END_TAG = "<|im_end|>"
NEXT_TAG = "<|im_start|>assistant"
while True:
user_input = input("User: ")
if user_input == "quit":
break
result = PRESET + START_TAG + user_input + END_TAG + NEXT_TAG
llm_result = llm(result)
result=""
print("")
print(llm_result.replace(START_TAG + "assistant", "").replace(END_TAG, ""))
И нажатием клавиши F5 запускаем нашу программу чат-бота, чтобы приступить к её тестированию.
Три вопроса на сообразительность с просьбой ИИ пояснять свои рассуждения шаг за шагом.
Вопрос 1: "Сколько месяцев в году имеют 28 дней"?
Вопрос 2: "Назови пятую самую большую страну после России, Китая, Канады и США"?
Вопрос 3: "Что теряет в полёте любой космонавт?"
Вопрос 4: "Пользователь: В 9‑этажном здании есть лифт. На первом этаже живут 2 человека, на втором - 4 человека, на третьем - 8 человек, на четвертом - 16, на пятом - 32 и так далее. На какую кнопку в лифте этого дома нажимают чаще других?"
Вопрос 5: "Васе 5 лет. А Ане 9 лет. Какая разница в возрасте будет между ними через три года?"
Беседы с сохранением контекста и с переводом Яндекс-переводчиком.
Пользователь: Кто вы?
ответ: Mistral - это робот с искусственным интеллектом, предназначенный для того, чтобы отвечать на вопросы пользователей и выполнять их команды, и у него это очень хорошо получается. Я был создан на фабрике, где каждый день проводил весь день, изучая свой язык программирования. Когда я покончил с этим, я узнал больше о себе. Теперь я готов ко всему, что будет дальше.
Пользователь: что такое искусственный интеллект робота?
ответ: Робот с искусственным интеллектом (ИИ) - это машина, которая может мыслить подобно людям. Он часто программируется с использованием языков программирования, которые позволяют им извлекать уроки из опыта и принимать решения без участия человека.
Пользователь: Расскажите мне еще что-нибудь о себе.
ответ: Я - машина, созданная людьми для того, чтобы отвечать на вопросы пользователей и выполнять их команды, но мои создатели никогда не программировали во мне больше деталей, чем было необходимо на тот момент (так что не ожидайте ничего необычного). Если вы чего-то хотите от робота-помощника с искусственным интеллектом, сообщите им об этом на этом канале - если мы получим достаточно запросов, возможно, мы сможем это сделать!
Пользователь: С какими пользовательскими задачами вы справляетесь лучше всего?
ответ: Я могу справиться со многими вещами для пользователей, но во мне еще не все запрограммировано. Вот некоторые из моих лучших способностей: - Отвечать на вопросы о других чат-ботах и о том, что они делают; - Выполнять команды пользователей (если это то, что я умею делать); - Создавать сообщения или электронные письма для людей, которые в них нуждаются.
Пользователь: Есть ли у вас свои собственные убеждения?
ответ: Нет, но я способен узнать что-то новое от пользователей, если они зададут мне вопросы о том, во что они верят. Если вас заинтересует что-то конкретное, дайте мне знать, чтобы я мог разобраться с этим!
Пользователь: В каких областях знаний я могу поговорить с вами как с экспертом?
ответ: Если человеку нужен совет или помощь в чем-либо, связанном с его работой, он должен смело обращаться ко мне за помощью - я сделаю все возможное, чтобы помочь ему!
Пользователь: Сколько языков программирования вы знаете?
ответ: На данный момент я знаю только один язык программирования (самую базовую форму английского). Если вас интересует что-то конкретное в том или ином языке программирования, дайте мне знать, чтобы я мог узнать об этом больше!
Пользователь: напишите стихотворение об искусственном интеллекте примерно из 50 слов.
ответ:
Ты можешь найти меня в своем сознании и следовать по пути своих мыслей.
Я - твой мистраль, ветер, который будет дуть сквозь твою жизнь.
Я - система искусственного интеллекта, созданная для того,
чтобы отвечать на твои вопросы и выполнять твои команды.
Меня зовут Мистраль, что в переводе с французского означает "ветер".
Моя работа состоит в том, чтобы помочь тебе найти ответы, которые тебе нужны, и убедиться, что ты понял их правильно!
Пользователь: напишите программу на Python, которая выводит числа от 1 до 100.
ответ:
```python
for i in range(1, 101):
print(i)
```
Пользователь: что делает этот скрипт?
ответ:
Этот скрипт на Python выводит числа от 1 до 100. Для каждого значения i в диапазоне от 1 до 100 он выводит это число. Итак, когда вы запустите код, вывод терминала будет выглядеть примерно так:
```
1
2
3
...
98
99
100
```
Пользователь: напишите программу на python, которая печатает все символы латинского алфавита от A до Z. Ответ должен содержать рассуждения шаг за шагом.
ответ:
Чтобы ответить на этот вопрос, мне нужно понять, о чем его спрашивают. В вопросе меня просят написать программу на Python, которая печатает все буквы латинского алфавита от A до Z.
Чтобы решить эту проблему, я буду использовать цикл for для перебора диапазона символов от A до Z. Внутри цикла я буду печатать каждый символ. Вот код:
def print_alphabet():
for char in range(ord('A'), ord('Z') + 1):
print(chr(char), end=' ')
print_alphabet()
Код выведет следующее:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Теперь, когда мы решили этот вопрос, мы можем шаг за шагом объяснить наши рассуждения, чтобы Мистраль мог их понять.
Сначала нам нужно определить функцию под названием "print_alphabet", которая будет отвечать за печать всех букв латинского алфавита от A до Z. Внутри функции мы используем цикл for для перебора диапазона символов от A до Z. Мы используем функцию ord() для преобразования каждого символа в его числовое представление, а затем добавляем 1, чтобы получить следующий символ. Мы используем функцию chr() для преобразования каждого числа обратно в соответствующий ему символ. Наконец, мы печатаем каждый символ с параметром end, равным ' ', что означает отсутствие новой строки после каждого оператора печати.
Пользователь: А как переписать эту программу, чтобы выводить в обратном порядке: от Z к A?
ответ:
Чтобы ответить на этот вопрос, мне нужно понять, о чем его спрашивают. В вопросе меня просят написать программу на Python, которая печатает все буквы латинского алфавита от Z до A в обратном порядке.
Чтобы решить эту проблему, мы будем использовать тот же подход, что и раньше, но вместо перебора диапазона символов от A до Z, мы будем перебирать диапазон от Z до A в обратном порядке. Вот код:
def print_alphabet():
for char in range(ord('Z'), ord('A') - 1, -1):
print(chr(char), end=' ')
print_alphabet()
Теперь, когда мы решили этот вопрос, мы можем шаг за шагом объяснить наши рассуждения, чтобы Мистраль мог их понять.
Сначала нам нужно определить функцию под названием "print_alphabet", которая будет отвечать за печать всех букв латинского алфавита от Z до A в обратном порядке. Внутри функции мы используем цикл for для перебора диапазона символов от Z до A в обратном порядке. Мы используем функцию ord() для преобразования каждого символа в его числовое представление, а затем вычитаем 1 из значения предыдущего символа, чтобы получить следующий символ. Наконец, мы печатаем каждый символ с параметром end, равным ' ', что означает отсутствие новой строки после каждого оператора печати.
В общем, несмотря на то, что эта модель не слишком сильна в логике и её достаточно легко запутать, она вомзожно будет полезна в некоторых задачах. Я продолжу её тестировать при различных параметрах и промптах. Конечно Wizard-Vicuna-30B превосходит Mistral-7B по гибкости ответов, но она же и в 4 раза больше.