Vadim1700

Vadim1700

На Пикабу
Дата рождения: 17 апреля
667 рейтинг 12 подписчиков 6 подписок 2 поста 2 в горячем
Награды:
5 лет на Пикабу
520

Пишем приложение на Mi Band 7 с сервисной частью

Недавно я купил себе Mi band 7, по началу хотел купить 6-ую версию, пока не узнал, что на 7-ой обновилась операционная система и теперь она поддерживает установку приложений. Да, официально они об этом не заявили, но умельцы уже сделали множество приложений. Они ставят их как циферблаты, и это вполне обычные приложения. Но все эти приложения работают только локально на самом MiBand 7, не имея возможности взаимодействовать ни с телефоном, ни с интернетом. Я углубился в байткод приложения и документацию по Zepp OS чтобы найти способ создавать приложения, взаимодействующие с интернетом, в этой статье я опишу свой путь. В итоге у меня получилось сделать запрос в интернет с часов и даже запустить мост для отладки приложений.

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

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

Эта статья написана чисто в ознакомительных целях. Я не призываю никого к переработке кода для добавления новых функций с целью использования и распространения переделанного ПО.

Почему приложения официально не поддерживаются?

Мне интересен этот вопрос, но к сожалению я не знаю причин. Похоже что Xiaomi Band 7 сделала для xiaomi компания zepp. И им было проще не поддерживать другую операционную систему, а использовать уже имеющиеся наработки для часов zepp. Поэтому на этих часах стоит система ZeppOS. Вероятно Xiaomi решила не платить за все фишки системы и поэтому функционал часов программно ограничен.

Начало

Для начала, чтобы разобраться как работает система, я попробовал поставить пару приложений от MelianMiko. Ставил самым простым способом, через приложение для установки циферблатов, подробности можете почитать на 4PDA. Я немного поразбирался в структуре приложений и вот что я понял: приложение это bin файл, который является простым zip архивом с, как минимум, несколькими файлами: app.json(Manifest), app.js(Код инициализации и деинициализации приложения при запуске), index.js(Код страницы),icon.png. Далее я пошел на сайт официальной документации по ZeppOS, там описано как включать режим отладки через приложение ZeppApp. Но попробовав подключить часы через это приложения я получил ошибку:

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

Я решил на этом не останавливаться, скачал это приложение версии 7.0.1, декомпилировал через apktool в байткод и через jadx в java код:

apktool d com.huami.watch.hmwatchmanager_7.0.1-play_100802.apk jadx com.huami.watch.hmwatchmanager_7.0.1-play_100802.apk -d com.huami.watch.hmwatchmanager_7.0.1-play_100802_JADX

Далее для исследование кода проще использовать результат jadx, но скомпилировать обратно получится только результат apktool, поэтому изменения придется делать в байткоде.

Для начала я убедился что это приложение поддерживает ну или когда-то поддерживало MiBand. Для этого я нашел несколько упоминаний MiBand 7 (Официально он называется Xiaomi Smart Band 7). Его кодовое название в приложении “MILI_L66”.

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

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

https://hlth.io.mi.com/download?redir=7800&mac=CE82E4D50...

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

В ней указан мак адресс, pnpNumber, pnpVersion - это похоже какие-то идентификаторы устройства. Я пробовал их заменить, но это не помогло, поэтому я решил посмотреть, какие qr коды у других устройств zepp при сетапе. В гугл я нашел видео в привязкой Amazfit Band 7, отсканировал код, получил такую ссылку:

https://api-watch.huami.com/forwarding/watchUS?macAddress=C9...

Эта ссылка ссылается совсем на другое доменное имя. Далее я решил попробовать просто подставить в этот URL macAddress из своего qr кода и сделать с этого url qr код. И это помогло, мои часы подключились, приложение засетапило их как Amazfit Band 7.

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

Я обнаружил что весь функционал из приложения Xiaomi здесь есть и я могу полноценно настраивать свои часы. Но после сетапа приложения понимало что у меня не Amazfit а Mi Band и не давало возможности ставить никакие приложения и циферблаты для Amazfit. Поэтому дальше я решил переделать приложение.

Перекомпиляция приложения

Чтобы приложение дало мне возможность ставить mini apps на часы, я решил заставить его думать что у меня не Xiaomi Smart Band 7, а Amazfit Band 7. Для этого таже как и для Mi Band 7, нашел кодовое название для Amazfit Band 7 - “MiliBari”:

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

Далее нашел все упоминания MILI_L66 и MILI_BARI. Самым интересным показался класс HMDeviceSource:

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

Вы можете в нем увидеть коды соответствующие разным типам устройств - их идентификаторы.

Далее необходимо переключиться на байткод, который нам выдал apktools.

Здесь я тоже нашел байткод класса HMDeviceSource$a.smali и изменил в нем 3 строки как на скриншотах:

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост
Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

Теперь можно собрать его обратно, подписать, установить. Оригинальное приложение придется сначала удалить, так как подпись теперь не оригинальная.

apktool b com.huami.watch.hmwatchmanager_7.0.1-play_100802 --use-aapt2 apksigner sign --ks-key-alias alias_name --ks-pass pass:123456 --ks release-key.keystore com.huami.watch.hmwatchmanager_7.0.1-play_100802/dist/com.huami.watch.hmwatchmanager_7.0.1-play_100802.apk adb install com.huami.watch.hmwatchmanager_7.0.1-play_100802/dist/com.huami.watch.hmwatchmanager_7.0.1-play_100802.apk

Теперь можно снова логиниться в приложении и подключать Mi Band как я описывал выше, изменяя qr код.

Работа перекомпилированного приложения

После этих манипуляций приложение начало отображать функционал как для amazfit band 7! Ура! На изображении сначала будет Mi Band 7, но если поменять циферблат, то оно сменится на amazfit band 7. У меня циферблат от Аmazfit встал как родной.

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост
Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

Также теперь появилась кнопка App Store, там можно поставить приложения из магазина для amazfit band 7. Не все заработали идеально, но большинство. Их почему-то в магазине пока только 5. Видимо пока весьма маленькое сообщество разработчиков)

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

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

Создание проекта

На 4PDA я нашел проекты пользователя MelianMiko. Он сделал и симулятор mi band, и множество приложений, и утилиту для сборки проектов - zmake. Можете ими воспользоваться для создания простых приложений, но как я понял zmake создает проекты только без сервисной части, выполняемой на телефоне. Еще в отличии от официального сборщика он, не сжимает код в bin файл, а оставляет в формате js(Тут может ошибаюсь, поправьте если не так). Симулятор к сожалению не работает под Linux и MacOS, поэтому я им не пользовался, вместо него использовал официальный симулятор Amazfit band 7.

Для создания проекта я использовал официальную утилиту zeus для ZeppOS. Новый проект можно создать командой zeus create project-name. Необходимо выбрать “1.0 API”, апи второй версии MiBand 7 не поддерживает.

Далее опишу содержимое собранного приложения, это не очень нужная информация, просто для общего ознакомления.

Когда проект будет готов, его можно собрать командой zeus build. В папке dist появится архив в формате zab, его можно открыть как простой zip архив. В нем манифест с описанием приложения и архив common.zpk, который тоже открывается как zip архив. В нем уже можно увидите основные составляющие приложения:

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост
  • Файл device.zip содержит код выполняемый на часах, ему можно сменить формат на bin и поставить даже через приложение для установки циферблатов.

  • Файл app-side.zip сожержит код выполняемый на стороне телефона.

  • Вроде еще может быть файл, описывающий настройку mini app с помощью приложения телефона.

Отличный набор примеров приложений, в том числе с сервисной частью, есть на github. Я, как основу, взял пример “fetch-api”.

Настройка моста

Тут нет ничего особенного, все из документации ZeppOS. Необходимо залогиниться в один аккаунт в приложении на телефоне и в приложении симуляторе. Включить режим разработчика в приложении и потом выбрать часы в списке устройств, открыть внизу настройки разработчика и в выпадающем списка нажать кнопку включения моста. После подключиться к мосту надо и в приложении симуляторе, нажав кнопку Bridge.

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

Теперь можно пользоваться консольной утилитой zeus для отладки проекта:

zeus bridge
сonnect
install

Запрос в интернет по кнопке на часах.

Как я уже писал выше, я взял за основу пример проекта с официального гитхаб аккаунта zepp os, “fetch-api”. Изменив код в app-side, я сделал запрос с телефона на домен ident.me, чтобы получить мой текущий внешний ip, ради примера.

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

Вывод

В итоге я получил небольшое приложение на часах, которое может когда угодно выводить мне мой внешний ip. Это конечно не та цель, к которой я стремился.  Моей целью было продемонстрировать, то что на самом деле у часов Mi Band 7 есть скрытый, программно ограниченный функционал. Эти часы могут не просто менять циферблаты, но и работать с приложениями. И даже отправлять данные через телефон в интернет и получать ответ. Такие приложения можно использовать например для управления умным домом) Вероятно в будущих версиях часов об этом официально заявят, но пока такого нет. Даже на Band 7 Pro официально не стоит zepp os.

Пишем приложение на Mi Band 7 с сервисной частью Xiaomi, Mi band 7, Реверс-инжиниринг, Взлом, Информационная безопасность, Гаджеты, Хакеры, Android, Java, Разработка, Длиннопост

P.S. Это была моя первая статья. Надеюсь вам было интересно, пишите комментарии, буду рад любой критике!

Недавно я создал телеграм канал. Там я планирую регулярно делиться интересными мыслями по темам информационной безопасности, программирования и нейросетей. Если вам интересны такие темы, присоединяйтесь) буду делиться там подобным контентом.

Показать полностью 16
49

Как дообучить LLaMA бесплатно и без программирования: как создать тупого друга

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

Прошло уже около полугода как Meta* случайно слили свою языковую модель LLaMA. А недавно они сами выложили в открытый доступ ее 2-ую версию. Для понимания масштаба - на обучение Meta* потратили более 3 311 616 GPU часов. Это примерно 378 лет работы одной мощной видеокарты.

Как дообучить LLaMA бесплатно и без программирования: как создать тупого друга Программист, ChatGPT, Python, IT, Lora, Искусственный интеллект, Нейронные сети, Чат-бот, Программирование, Гайд, Длиннопост

Cразу скажу, что я уже публиковал эту статью на Хабр. Но хочу теперь попробовать начать писать статьи на Пикабу, так что я буду очень рад любым комментариям и отзывам. Надеюсь пользователям Пикабу эта статья тоже зайдет)

Те, кто интересовался темой языковых моделей, уже, наверное, знают, что первую версию llama энтузиасты почти сразу после слива оптимизировали для работы на обычных процессорах и на нейроускорителях Apple, которые стоят в их процессорах. При этом на M1 процессоре LLaMA стала работать очень быстро, выдавая более 10 токенов(токен - это слово, часть слова или буква) в секунду, это быстрее чем бесплатный ChatGPT на тот момент. Еще через пару недель ее дообучили ребята из Стэнфорда, чтобы она понимала концепцию вопрос-ответ и могла давать ответы и выполнять задачи.

Что потребуется для запуска нейронки

Есть две версии модели: LLaMA и LLaMA 2. LLaMA есть в размерах 7B, 13, 30B, 65B, LLaMA 2 - в размерах 7B, 13B и 70B. 7B весит примерно 13 гб, 65B - 120 гб. Но не торопитесь ужасаться, во-первых, как я уже писал, ее можно запустить не только на видеокарте, она хорошо работает и на процессоре, а во вторых, для запуска на обычных компьютерах применяют квантизацию (quantization) - это сжатие всех весов нейронов. В оригинальной версии вес каждого нейрона 16 бит, но их сжимают до 8, 4 и даже до 2 бит. Чаще всего используют сжатие до 4 бит, LLaMA 7B при таком сжатии весит 3.9 гб и требует немного больше 4 гб оперативной памяти и обычный процессор.

Что будем обучать и что потребуется

В данной статье я покажу как я дообучал LLaMA 7B и LLaMA 2 7B. Если готовы заплатить за аренду видеокарт, то можете обучить и модели покрупнее. Обучение будем проводить для нейронки в оригинальном размере (16 битовые веса), создав Lora модуль (не буду тут рассказывать, что это, если вкратце, то это алгоритм обучающий лишь несколько дополнительных слоев для нейросети, которые корректируют ее работу, это намного менее требовательно, чем полное дообучение). Для этого пока обязательно нужна видеокарта, то есть нужно около 15 гб видеопамяти.

На этом можно было бы остановиться, подумав, что за такое железо точно придется платить. Но пока изучал эту тему, я увидел, что один парень на гитхабе написал о возможности запустить обучение бесплатно на Google Colab. Честно говоря, я был в шоке, когда понял что google совершенно бесплатно дает доступ к машине с 13.6 гб оперативки, с Nvidia Tesla T4 на 16 гб видеопамяти, около 78 гб хранилища и очень быструю сеть (скорость загрузки нейросети там доходила до 200 мегабайт в секунду).  Конечно всю эту радость дают не навсегда, а на неопределенный срок, и отнять это могут в любой момент. У меня получалось обучать по часа 4.

Как дообучить LLaMA бесплатно и без программирования: как создать тупого друга Программист, ChatGPT, Python, IT, Lora, Искусственный интеллект, Нейронные сети, Чат-бот, Программирование, Гайд, Длиннопост

Данные для обучения

Для обучения я взял историю диалога с друзьями в ВК. В ВК можно получить по запросу все данные о себе, которые у них есть, в том числе истории всех переписок. Чтобы подготовить полученные данные, я воспользовался первым попавшимся на github репозиторием для парсинга сообщений в бэкапе вк и сделал форк с изменениями для создания датасета. Через код в Jypyter вы сможете получить json файл с датасетом для обучения.

Обучение

Для обучения можно воспользоваться этим проектом, я сделал от него форк, добавив шаблон для обучения на простом тексте (оригинальный репозиторий имеет шаблоны только для обучения концепции вопрос-ответ). Вот мой форк и вот проект которые вы можете запустить в гугл колабе, он подтянет мой форк. В первых нескольких полях вы можете поменять папку на Google Disk, куда будут сохраняться результаты обучения, нужно не меньше 300 мб. Также можете вместо модели "sharpbai/Llama-2-7b-hf" выбрать другую, например llama 7b первой версии (decapoda-research/llama-7b-hf), найти вы их можете на huggingface. Лучше всего брать те, которые разбиты на множество файлов (такие требуют меньше памяти при загрузке). Те, что не разбиты, не всегда загружаются на бесплатном google colab (требуется больше памяти).

Как дообучить LLaMA бесплатно и без программирования: как создать тупого друга Программист, ChatGPT, Python, IT, Lora, Искусственный интеллект, Нейронные сети, Чат-бот, Программирование, Гайд, Длиннопост

Пакеты не всегда ставятся сразу в виртуальной машине, не стоит пугаться, иногда требуется нажать Runtime -> Restart runtime. На второй раз пакеты ставятся успешно.

После того как языковая модель скачается и загрузится в память, вы можете воспользоваться веб интерфейсом, чтобы настроить параметры обучения.
Ссылка будет выведена в формате: Running on public URL: https://...

Как дообучить LLaMA бесплатно и без программирования: как создать тупого друга Программист, ChatGPT, Python, IT, Lora, Искусственный интеллект, Нейронные сети, Чат-бот, Программирование, Гайд, Длиннопост

Сразу можете переходить во вкладку Fine tuning, в поле Template выставлять "my_sample", в поле Format "JSON Lines". my_sample - это тот простой шаблон промптов, который я добавил, в нем нет ничего кроме input и output. Далее нужно либо скопировать содержимое файла датасета, либо открыть его, скопировав на машину google colab.

Как дообучить LLaMA бесплатно и без программирования: как создать тупого друга Программист, ChatGPT, Python, IT, Lora, Искусственный интеллект, Нейронные сети, Чат-бот, Программирование, Гайд, Длиннопост

После можете посмотреть превью данных для обучения во вкладке Preview. Еще на этой вкладке браузер меньше тупит, не пытаясь отобразить все данные для обучения.

Как дообучить LLaMA бесплатно и без программирования: как создать тупого друга Программист, ChatGPT, Python, IT, Lora, Искусственный интеллект, Нейронные сети, Чат-бот, Программирование, Гайд, Длиннопост

Остается только выставить параметры обучения, в целом можно оставить по умолчанию, но вот поля, которые я менял:

  • Max Sequence Length - Влияет на максимальную длину текста в наборе датасета. Все данные из датасета, длина которых превышает эту, не будут использоваться в обучении. (На русском почти всегда длина это количество букв). Очень большое число может привести к переполнению памяти на бесплатной машине.

  • Train on Inputs - Эту галочку лучше поставить, чтобы модель обучалась и на input тексте, и на output.

  • Micro Batch Size - Грубо говоря, указывает количество данных, которое берется для обучения за раз. Очень большое число может привести к переполнению памяти на бесплатной машине. Я оставлял в основном 8.

  • Gradient Accumulation Steps - Не разбирался как работает, но я поднимал до двух. Судя по описанию, ускоряет обучение, как и Micro Batch Size, но не увеличивает потребляемый объем памяти.

  • Epochs - Количество эпох обучения. Можно смело ставить больше, все равно остановим обучение руками, или гугл сам остановит машину часа через 4.

  • Learning Rate - Коэффициент обучаемости, влияет на скорость, но слишком большой может привести к плохому обучению, я оставлял 0.0003.

  • Saved Checkpoints Limit - Максимальное число чекпоинтов, ставьте побольше.

  • Steps Per Save - Количество шагов перед сохранением бэкапа. Ставьте 200-300, чтобы почаще сохраняться и меньше терять в случае отключения машины гуглом.

  • LORA Model Name - Название папки на гугл диск, в которую будут сохраняться бэкапы.

Позже еще понадобится раздел Continue from Model для продолжения обучения с последнего чекпоинта.

Как дообучить LLaMA бесплатно и без программирования: как создать тупого друга Программист, ChatGPT, Python, IT, Lora, Искусственный интеллект, Нейронные сети, Чат-бот, Программирование, Гайд, Длиннопост

В процессе обучения вы будете видеть примерно такой график. Я обычно дожидался ошибки примерно до 1.1. Дольше у меня не хватало терпения).

Как дообучить LLaMA бесплатно и без программирования: как создать тупого друга Программист, ChatGPT, Python, IT, Lora, Искусственный интеллект, Нейронные сети, Чат-бот, Программирование, Гайд, Длиннопост

Теперь, зная как можно бесплатно дообучить llama, вы можете создать тупого бота симулирующего участника в диалоге с друзьями, он, конечно, не будет кидать мемы и понимать глубокий смысл, но может поугорать за компанию или написать тупую шутку. Можно попробовать сделать что-то и посерьезнее, например, ПО системы для написания ответов на письма или откликов на фриланс бирже. Применений может быть много, но стоит понимать что LLaMA 7B все же плоховата в работе с русским, так как мало его учила.

Как дообучить LLaMA бесплатно и без программирования: как создать тупого друга Программист, ChatGPT, Python, IT, Lora, Искусственный интеллект, Нейронные сети, Чат-бот, Программирование, Гайд, Длиннопост

Спасибо больше за внимание, надеюсь статья была для вас полезна! Буду рад любым коментариям и дополнениям!

Я выложил пару сравнений работы дообученной и простой llama 2 7B в телеграм канале, который недавно создал, буду стараться там регулярно выкладывать интересные мысли про программирование, нейросети и информационную безопасность.

Также выложу там инфу про то, как я поднял llama на raspberry pi для бота в телеграмме.

* Meta - признана экстремистской организацией и запрещена в России.

Показать полностью 9
Отличная работа, все прочитано!