Вам нужна платформа, которая поддерживает федеративное обучение на периферии, в настольных браузерах, хорошо интегрируется с мобильными приложениями, отличается производительностью и сохраняет конфиденциальность? Добро пожаловать в XayNet, полностью написанный на Rust!
Платформы для машинного обучения, в том числе специально предназначенные для федеративного обучения, уже существуют. Эти структуры обычно облегчают федеративное обучение перекрестным вариантам использования — например, при совместном обучении в ограниченном количестве больниц или, например, в нескольких банках, работающих над общим вариантом использования без необходимости обмена ценными и конфиденциальными данными.
В этом репозитории основное внимание уделяется федеративному обучению между устройствами в маске, позволяющему организовать машинное обучение на миллионах маломощных периферийных устройств, таких как смартфоны или даже автомобили. Сделав это, мы надеемся также увеличить темпы и масштабы внедрения федеративного обучения на практике и особенно обеспечить защиту данных конечных пользователей. Все данные остаются в частных локальных помещениях, при этом автоматически и асинхронно агрегируются только зашифрованные модели ИИ. Таким образом, мы предлагаем решение дилеммы конфиденциальности ИИ и устраняем часто существующий разрыв между конфиденциальностью и удобством. Представьте себе, например, голосового помощника, который будет изучать новые слова непосредственно на уровне устройства и делиться этими знаниями со всеми другими экземплярами, без централизованной записи и сбора вашего голосового ввода. Или подумайте о поисковой системе, которая учится персонализировать результаты поиска, не собирая централизованно ваши часто конфиденциальные поисковые запросы… Существуют тысячи таких случаев использования, которые прямо сегодня все еще жертвуют конфиденциальностью ради удобства. Мы считаем, что этого не должно быть, и хотим предложить альтернативу для преодоления этой дилеммы.
В частности, мы предоставляем разработчикам:
Наша структура федеративного обучения — это не только основа машинного обучения как такового. Скорее, он поддерживает объединение машинного обучения, которое происходит на возможно гетерогенных устройствах и где сценарии использования включают множество таких устройств.
Таким образом, язык программирования, на котором написан этот фреймворк, должен обеспечивать нам надежную поддержку следующего:
Rust — один из немногих современных языков программирования, отвечающих этим требованиям:
ржавчина 1.51.0
Есть несколько разных способов запустить бэкэнд: через Docker, развертывание его в кластере Kubernetes или компиляцию кода и запуск двоичного файла вручную.
docker
и docker-compose
) и/или рабочей настройке (если вы решите скомпилировать код Rust и запустить двоичный файл вручную).Примечание:
В Xaynet v0.11
координатору необходимо подключение к экземпляру Redis, чтобы сохранить его состояние.
Не подключайте координатор к экземпляру Redis, который используется в производстве!
Мы рекомендуем подключить координатор к собственному экземпляру Redis. Мы потратили много времени, чтобы координатор удалял только свои собственные данные, но на текущем этапе разработки мы не можем гарантировать, что так будет всегда.
Удобство использования настройки докера заключается в том, что нет необходимости настраивать рабочую среду Rust в вашей системе, так как все делается внутри контейнера.
Образы последних выпусков Docker доступны на Docker Hub.
Вы можете опробовать их со стандартными файлами configs/docker-dev.toml
выполнив:
Ксайнет ниже v0.11
docker run -v ${PWD} /configs/docker-dev.toml:/app/config.toml -p 8081:8081 xaynetwork/xaynet:v0.10.0 /app/coordinator -c /app/config.toml
Ксайнет v0.11+
# don't forget to adjust the Redis url in configs/docker-dev.toml
docker run -v ${PWD} /configs/docker-dev.toml:/app/config.toml -p 8081:8081 xaynetwork/xaynet:v0.11.0
Образ докера содержит релизную сборку координатора без дополнительных функций.
Запустите координатор, указав файл docker/docker-compose.yml
. Он запускает всю инфраструктуру, необходимую для работы координатора со стандартными или дополнительными функциями. Имейте в виду, что этот файл используется только для разработки.
docker-compose -f docker/docker-compose.yml up --build
При желании вы можете создать оптимизированную релизную сборку координатора, но имейте в виду, что компиляция будет медленнее.
docker build --build-arg RELEASE_BUILD=1 -f ./docker/Dockerfile .
Дополнительные функции можно указать с помощью аргумента сборки COORDINATOR_FEATURES
.
docker build --build-arg COORDINATOR_FEATURES=tls,metrics -f ./docker/Dockerfile .
Чтобы развернуть экземпляр координатора в кластере Kubernetes, используйте манифесты, расположенные внутри папки k8s/coordinator
. Манифесты создаются с помощью kustomize
( kustomize
официально поддерживается kubectl
начиная с версии 1.14). Мы рекомендуем вам тщательно просмотреть манифесты и настроить их в соответствии с вашими настройками (пространство имен, вход и т. д.).
Не забудьте также проверить (и при необходимости откорректировать) конфигурацию координатора по умолчанию, доступную по адресу k8s/coordinator/development/config.toml
.
Пожалуйста, настройте домен, используемый в файле k8s/coordinator/development/ingress.yaml
чтобы он соответствовал вашим потребностям (вы также можете вообще пропустить ingress
, просто убедитесь, что вы удалили его ссылку из k8s/coordinator/development/kustomization.yaml
).
Имейте в виду, что ingress
конфигурация, показанная в k8s/coordinator/development/ingress.yaml
зависит от ресурсов, которые недоступны в этом репозитории из-за их конфиденциального характера (например, ключ TLS и сертификат).
Чтобы проверить сгенерированные манифесты, запустите:
kubectl kustomize k8s/coordinator/development
Чтобы их применить:
kubectl apply -k k8s/coordinator/development
Если вы не раскрываете доступ к своему координатору через ingress
, вы все равно можете связаться с ним, используя переадресацию порта. В приведенном ниже примере создается переадресация порта на порту 8081
предполагая, что модуль координатора все еще использует метку app=coordinator
:
kubectl port-forward $( kubectl get pods -l " app=coordinator " -o jsonpath= " {.items[0].metadata.name} " ) 8081
Координатор без дополнительных функций можно собрать и запустить с помощью:
cd rust
cargo run --bin coordinator -- -c ../configs/config.toml
Пример можно найти в папке Rust/examples/. Он использует фиктивную модель, но поддерживает работу в сети, поэтому это хорошая отправная точка для проверки соединения с координатором.
test-drive
Убедитесь, что у вас есть работающий экземпляр координатора и что клиенты, которых вы создадите с помощью приведенной ниже команды, смогут подключиться к нему через сеть.
Вот пример того, как запустить 20
участников, которые будут подключаться к координатору, работающему по адресу 127.0.0.1:8081
:
cd rust
RUST_LOG=info cargo run --example test-drive -- -n 20 -u http://127.0.0.1:8081
Более подробную информацию о том, как запускать примеры, см. в прилагаемом руководстве по началу работы по адресу Rust/xaynet-server/src/examples.rs.
Если у вас возникли трудности с запуском проекта, свяжитесь с нами, открыв вопрос и описав свою настройку и проблемы, с которыми вы столкнулись.