Салют, Хабр!

Мы официально запустили продажи Умного кольца Sber — устройства, которое помогает владельцу следить за показателями своего организма, вовремя замечать отклонения и улучшать свою жизнь.

Это первый продукт Sber в сегменте носимой электроники и, в частности, wellness-электроники, поэтому его разработка оказалась особенно ответственной. Мы проводили собственные полисомнографические исследования, чтобы настроить и проверить алгоритмы, отвечающие за сон. В расширенном бета-тестировании проверяли качество алгоритмов и их визуальную интерпретацию. Дорабатывали GigaChat для более персонализированных рекомендаций и бесконечно рефакторили код.

Эта статья посвящена разработке software и firmware устройства, полисомнографии, нашему внезапному дебюту в сайзкодинге на C++/C, обучению и дообучению модели GigaChat (а в следующей расскажем о «железе» кольца и его производстве).

Исследования, алгоритмы и валидация данных

Умное кольцо Sber обеспечивает пользователя двумя типами показателей:

  • Физиологические — те, что отслеживают датчики в устройстве. Это частота пульса, вариабельность сердечного ритма, сатурация (насколько кровь насыщена кислородом), уровень физической активности.

  • Комплексные, которые на основе данных с датчиков оценивают ML-алгоритмы: фазы сна и пробуждения, качество сна, уровень стресса и ресурс — общее состояние организма и его запас сил.

Самая сложная из метрик — качество сна. Это интегральный показатель: он учитывает время засыпания, фазы медленного и быстрого сна, пробуждения во сне. Соответственно, чтобы его оценивать, необходимо сначала научиться определять фазы сна. Датчики отдают сырой сигнал, из которого нужно получить данные о базовых показателях, затем найти в них сложные признаки, информативно описывающие изменения — например, изменение пульса за последние N минут — и обучить модель, способную по этим сложным признакам самостоятельно выявлять закономерности, связанные с изменениями фаз сна. При этом зависимость между данными с сенсоров и теми же фазами сна непрозрачна, но нам нужно получить из них те же результаты, что врачи — из данных ЭЭГ и ЭКГ (электроэнцефалографии и электрокардиограммы). Вдобавок эти алгоритмы должны быть достаточно «лёгкими», чтобы работать локально на кольце (об этом дальше).

Чтобы решить задачу, прежде всего требовался большой массив данных о сне. Поэтому в плане разработки появилась полисомнография — комплексное исследование сна с измерением всех физиологических параметров организма. Участники спали в клинике, окутанные датчиками, с Умным кольцом Sber на пальце (и в собственных пижамах, которые рекомендуется приносить на исследование).

Любишь кольцо разрабатывать — люби и на полисомнографию ходить. Команда разработки на исследовании
Любишь кольцо разрабатывать — люби и на полисомнографию ходить. Команда разработки на исследовании

На момент запуска мы с научными партнёрами — клиникой Медси и клиникой Управления по делам президента — провели 150 полисомнографических исследований и собрали более 1000 часов данных. Полисомнография обеспечила нас эталонными данными о сне с заключениями врачей, которые мы с интервалами по 30 секунд сравнивали с метриками с кольца, обработанными алгоритмами, одновременно обучая свой ML-алгоритм и настраивая его точность.

Вверху — результат модели, внизу — данные с полисомнографии
Вверху — результат модели, внизу — данные с полисомнографии

В приложении Умного кольца Sber пользователь видит всю информацию о своём сне: его длительность, фазы, пробуждения и финальная оценка качества сна. При этом обработка данных и перевод их в числовые значения для первых трёх показателей происходит локально на кольце, а оценка самого качества — в приложении. 

Оценка качества сна учитывает:

  • общую длительность сна и длительность его фаз;

  • суммарную длительность awakes — пробуждений;

  • эффективность сна — отношение его продолжительности  к общему времени лежа в кровати;

  • возраст пользователя; 

  • время засыпания и стабильность сна;

  • тайминг.

Финальную оценку мы выводим по методологии, которую разработали вместе с врачами, на основе суммы этих показателей с определёнными весами.

Для валидации данных полисомнографии нам также потребовалось эмулировать работу SoC, включая таймеры, GPIO и UART. Два месяца мы дорабатывали эмулятор, взяв за основу QEMU Cortex-m4. В неё помещалась прошивка кольца с урезанным функционалом — минус все микроконтроллеры, кроме основного. По QEMU UART можно было передавать пакеты «сырых» данных с кольца, на котором была установлена специальная прошивка, и прогонять эти данные через всевозможные алгоритмы.

Забегая вперёд: в ходе бета-теста выяснилось, что полисомнография — самое точное комплексное исследование сна — обладает одним минусом. Мы вдруг заметили, что кольцо недостаточно точно фиксирует awakes, то есть пробуждения во время сна. До этого проблему не удалось обнаружить из-за специфики полисомнографии. В ходе исследования на человеке закреплено множество датчиков. Ему неудобно, и, засыпая, он то и дело просыпается опять. Соответственно, график пробуждений на полисомнографии не соответствует графику в реальности.

Вверху — awakes на полисомнографии (ПСГ), внизу — при домашнем сне. Можно заметить, что в ходе ПСГ человек регулярно просыпается вечером и ночью, а дома пробуждения в основном приходятся на утро
Вверху — awakes на полисомнографии (ПСГ), внизу — при домашнем сне. Можно заметить, что в ходе ПСГ человек регулярно просыпается вечером и ночью, а дома пробуждения в основном приходятся на утро

Пришлось добавить дополнительный алгоритм, который уточняет данные ML-модели именно в разрезе пробуждений. Он потребовал сбора данных ценой спокойного сна команды разработки. По ночам они вставали, фиксировали в тетрадке пробуждение и ложились обратно (плюс записывали свою активность до и после сна). Затем эти данные сравнивались с показателями их Умных колец Sber. Это позволило валидировать данные с датчиков, которые показывают, что человек проснулся. Мы также дополнительно проводили эксперименты с домашними ПСГ — вручали испытуемым медицинские приборы, с которыми они спали дома, чтобы использовать данные для дообучения модели.

Кроме того, в рамках исследований стресса наши партнёры из ННГУ провели 60 медицинских исследований, изучая реакцию организма на специально созданные контролируемые нагрузки. В частности, применялись два метода:

  • проба Вальсавы. Пациент сильно выдыхает носом в трубку, которая подключена к манометру, поддерживая на устройстве определённый уровень давления. В этом время и сразу после с него снимают электрокардиограмму (ЭКГ). Так оценивают, как сердечно-сосудистая система реагирует на изменение внутригрудного давления (а это отражает работу вегетативной нервной системы). 

  • метод Струппа. Когнитивно-психологический тест: испытуемому показывают карточки, где название цвета написано другим цветом. Его задача — называть цвет, которым написано слово.

Эти работы позволили оценить, насколько организм справляется с разными видами стресса — когнитивным и физическим — и адаптируется к нему, увидеть периоды стресса и покоя.

Почти сайзкодинг, энергоэффективность и сихронизации 

В разработке software кольца ключевыми для нас оказались три характеристики. Во-первых, оно небольшое — всего 5 граммов. Во-вторых, оно мониторит показатели самочувствия владельца круглосуточно (в нём можно и нужно спать, принимать душ, заниматься спортом). В-третьих, согласно продуктовым требованиям его можно не заряжать до семи дней. Соответственно, в разработке приходилось постоянно учитывать:

  • Эффективность использования памяти. Данные, логи, системные и пользовательские метрики хранятся локально в кольце.

  • Энергоэффективность. Реализация возможностей кольца должна как можно меньше разряжать устройство. 

Память кольца — 1 Мб flash и 256 Кб оперативной памяти процессора (RAM), плюс дополнительная флэшка на 4 Мб для хранения показателей самочувствия как владельца, так и самого кольца. Для примера, у нас сейчас свободно 10% RAM и 8 Кб данных на флэшке.

Реализовав примерно 60-70% от планируемого, мы упёрлись в ограничение объёма памяти, а оно, в свою очередь, создало максимально жёсткие требования по соотношению полезности кода к его объёму. Каждая новая фича, которую реализовывала команда, требовала улучшения алгоритмов… без повышения энергопотребления и с минимальным потреблением памяти.

С этого момента команда разработки параллельно с разработкой занималась беспрерывным рефакторингом. Мы прибегали к:

—  улучшению архитектуры;

— переходу на другой формат сохранения и передачи данных;  

—  переиспользованию кода;  

— снижению вычислительной сложности алгоритмов. Кстати, это одновременно решало задачу обеспечить максимальную энергоэффективность кольца.  

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

Для сохранения энергоэффективности ключевой задачей стал поиск оптимальных значений светодиодов PPG-сенсора, он же датчик плетизмографии, и частоты их свечения. Лирическое отступление о принципе работы датчика:

PPG-сенсор позволяет отслеживать пульс и насыщение крови кислородом. В него входят три LED-светодиода зелёного, красного и инфракрасного диапазонов и два фотодиода, принимающих отражённое излучение от светодиодов. Принцип работы PPG основан на измерении объёма крови в мелких сосудах (капиллярах) и артериях в зависимости от фазы сердечного цикла; когда сосуды наполняются кровью, это влияет на количество поглощённого и отражённого света.

Нам требовалось найти значение, при котором светодиоды потребляли бы минимум энергии и обеспечивали максимально точные данные. Сначала мы попробовали решить задачу методом подбора: собрали набор колец с прошивками, куда был заложен разный уровень яркости, и привлекли группу добровольцев. Участник теста надевал одновременно умное кольцо и медицинский пульсоксиметр, который в режиме реального времени записывал данные пульса и оксигенации. Далее данные сверялись.

Тем не менее, полученное значение оказалось слишком приблизительным. Поэтому пришлось провести дополнительный тест SNR (signal-to-noise ratio). Что было сделано:

  • подготовили специальную прошивку, в которой мы по bluetooth могли управлять мощностью светодиодов и эквивалентным сопротивлением, установленным на АЦП;

  • поместили печатную плату с этими компонентами (PCBA) с вышеупомянутой прошивкой в светонепроницаемый ящик, внутри которого установили на определённом расстоянии от PCBA специальную полоску белого цвета;

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

Так удалось подобрать значения мощности светодиодов, которые позволили попасть в норматив по энергопотреблению и вместе с тем качественно улучшить сигнал. К примеру, SNR на зелёном светодиоде повысился с 70 Дб до 83.

Первые три — графики зависимости SNR от мощности и времени экспозиции при зафиксированном значении резистора на АЦП для красного, инфракрасного и зелёного светодиодов. Внизу справа зависимость SNR от мощности зелёного светодиода и резистора на АЦП при зафиксированном значении времени экспозиции.

Ещё одним вызовом для энергоэффективности кольца стала настройка синхронизации между данными акселерометра (ACC) и PPG-сенсора на уровне прошивки. Изначально мы использовали программное прерывание для генерации тактирующего сигнала для датчиков, но это существенно повышало энергопотребление кольца. Тогда мы решили использовать часовой (RTC) генератор микроконтроллера с кварцевым резонатором на 32 кГц для генерации сигнала синхронизации уже по аппаратному прерыванию, что позволило «замедлять» микроконтроллер между периодами сбора данных сенсорами и таким образом экономить энергию. Считанные данные собираются в блоки длительностью в 1 секунду реального времени и подаются в алгоритмы. 

Как итог, синхронизация данных позволила дополнительно улучшить работу всех алгоритмов, основанных на данных ACC и PPG. Например, пульс в покое стал считаться с точностью до 1 bpm по сравнению с референсными значениями, улучшилось качество определения начала и конца сна.

Баги, их фиксы и вычисления с плавающей точкой

Особенную прелесть разработке и отладке Умного кольца Sber придавал один факт: к нему физически невозможно подключиться по проводу. Соответственно, когда устройство зависало, мы никак не могли его перезагрузить.

Например, на некоторых кольцах мы получили баг: в процессе разработки начал зависать сам bluetooth-стек. Из-за редкости возникновения не удавалось поймать этот баг на PCBA в режиме отладки. Единственное, что мы могли сделать — ждать возникновения проблемы на большой выборке пользователей. После проявления пользователю необходимо было ждать 10 дней, когда оно полностью разрядится. Заряжаясь, оно с нуля запускало прошивку, и мы могли решать проблему. 

Что дело в bluetooth, было понятно сразу: хотя к кольцу нельзя было подключиться, остальные алгоритмы работали — кольцо продолжало считать метрики и следить за зарядом. Часть проблемы удалось решить обновлением операционной системы — nrf Connect SDK от Nordic использовал довольно старый релиз, с тех пор были обнаружены и исправлены многие ошибки. Но ошибка, пусть и стала намного реже воспроизводиться, по-прежнему возникала.

В итоге мы запустили ферму из PCBA, на которых постоянно подключались/ отключались от них по BLE. Удалось воспроизвести баг — добавив много-много логов, локализовали проблему.

Zephyr RTOS аллоцирует память на BLE-буферы. Вместе с тем очистка этих буферов в OS была реализована не особенно корректно. Соответственно, в определённых условиях все буферы занимались, а новые не появлялись. Контрибьютеры Zephyr вносили изменения в функционал многопоточного управления буферами памяти до тех пор, пока не решено было переехать из выделенных потоков в системный workqueue. В Zephyr был проведён соответствующий рефакторинг, который затрагивал большое количества кода для работы с bluetooth-стеком. Переносить весь этот функционал не решились с учётом объёмов необходимых после тестов. Поэтому мы максимально аккуратно дополнили освобождение буферов в тех местах, которые считали необходимыми. Проблема перестала воспроизводиться вовсе.

В начале бета-тестирования кольца появился, пожалуй, самый неприятный баг за всё время разработки: оно зависало. Причём исключительно ночью, когда владелец спал в кольце. Соответственно мы не могли посмотреть логи. Дело в том, что основной механизм при отладке в команде firmware — просмотр UART/RTT логов в режиме реального времени, но для этого необходима «полоска». Крепить полоску к специальной плате, а плату к ноутбуку ночью для отслеживания сна не представлялось возможным. 

Для решения проблемы мы ввели дополнительные способы сбора отладочной информации — сделали хранилище логов в энергонезависимой памяти, стали передавать логи по BLE (что серьёзно сказывалось на энергопотреблении), добавили сохранение дампа оперативной памяти как при обнаружении каких-либо проблем в работе операционной системы, так и при каждой перезагрузке кольца. Воспроизвести баг днём не удавалось. Логи для дебага хранились в специальном хранилище на кольце, которого хватало примерно на несколько недель ношения устройства. Но просмотр получаемых логов не давал никакого результата: в момент зависания как будто все переставало работать. 

Решать проблему пришлось вслепую — мы по очереди откатывали коммиты и запускали тест-кейсы. Проще говоря, команда полтора месяца ложилась спать, надев несколько колец с разными версиями прошивки: целевого приоритета, второго приоритета… Заодно протестировали, сколько колец человек может носить во сне: шесть. Если их больше, уснуть почти невозможно. 

Как спит тестировщик кольца
Как спит тестировщик кольца

Разумеется, дело было собственно в ночном времени и конкретно во сне. Проблема оказалась в одновременной работе с FPU из нескольких потоков, а зависание происходило во время переключения между ними. Одним из алгоритмов, активно использующих вычисления с плавающей точкой, был алгоритм расчёта сна. Поэтому проблема и проявлялась, когда пользователь спал. 

Часть алгоритмов пришлось переписать на целочисленные расчёты, сон остался на расчётах с плавающей точкой. И всё сразу прошло.

Обучение GigaChat, дообучение и промпт

Параллельно с разработкой software кольца велась работа над личным консультантом по вопросам здоровья для владельца кольца с искусственным интеллектом GigaChat. Он объясняет, что значит та или иная метрика. Следит за жизненными показателями пользователя в динамике и предупредит, если заметит устойчивые отклонения от нормы либо от устоявшихся долгосрочных трендов пользователя. С ним можно посоветоваться, идти сегодня на тренировку по бегу, как управлять стрессом, вредно ли работать в офисе продактом (возможно) и как минимизировать этот ужасный вред.

В приложении владельцу Умного кольца Sber доступны как его личные показатели, так и персонализированные рекомендации от GigaChat. При этом персональный помощник получает физиологические метрики и интерпретирует их сам плюс алгоритмы отдают ему оценки комплексных метрик.

Реализовать продвинутого помощника получилось за счёт специальной подготовки GigaChat в медицинском домене. Модель обучили и дообучили на медицинских данных, собранных с помощью специалистов-медиков из разных областей медицины. Всего в обучении использовалось более 70 Гб претрейна по 72 врачебным специальностям, в который вошли все актуальные медицинские пособия и клинические рекомендации.

Перед дообучением были выбраны четырнадцать ключевых для подобного устройства врачебных специальности — терапия, кардиология, гастроэнтерология, медицинская реабилизация и другие — и сформулировано более 25 000 SFT-кейсов для дообучения. Для разметки кейсов также привлекли медиков — как ординаторов и преподавателей, так и действующих врачей. В итоге инкремент составил 80% — и это хороший результат.

Тестирование проходило как на теоретических данных, так и на практических, использовался навык AI работать с изображениями, реальные медицинские кейсы. Дополнительно стоит отметить, что в общем-то дообучение GigaChat и проверка его на медицинских экзаменах и ранее. В 2024 году он успешно прошёл тестирование, которые проходят люди-терапевты для аккредитации по специальности «Лечебное дело»; в феврале этого года сдал экзамен по специальности «Кардиология».

Формулируя промпт, которым руководствуется помощник с искусственным интеллектом GigaChat при общении, мы заложили в него несколько разумных ограничений. Так, он (закономерно) не рекомендует лекарства, БАДы, медицинские процедуры и методы диагностики. Ему нельзя интерпретировать данные как диагноз. Словом, GigaChat в приложении Умного кольца Sber должен стать помощником по вопросам ЗОЖ, который вдобавок знает показатели вашего организма.

В процессе разработки устройства вышла вторая версия модели — GigaChat 2.0 Max — которая дополнительно улучшила качество ответов.

Заключение

Мы начали разрабатывать Умное кольцо Sber как устройство, которое мониторит и анализирует показатели организма, а пока совершенствовали его — пришли к комплексному wellbeing-продукту. Оно отслеживает не только сами метрики, но и тренды: приложение сообщит, если по данным кольца состояние пользователя за последние семь дней стабильно отклоняется от нормального, и даст детальный отчет. Из оповещения можно перейти в сервис СберЗдоровье и оперативно записаться на консультацию специалиста. Искусственный интеллект GigaChat в удобном приложении даёт рекомендации с опорой одновременно на свои медицинские знания и показатели организма владельца. Словом, получилась полновесное отечественное носимое устройство, которое систематически помогает пользователю менять свой образ жизни к лучшему.

***

В подготовке статьи участвовали: Никита Дранишников, Михаил Базик, Станислав Унмут, Максим Потапов, Владимир Кондратенко, Роман Гуркин, Саид Насрулаев, Маркос Легра Санчес

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