지능형 앱

ML Kit 및 Gemini Nano를 사용하여 Android에서 Formula E 보조 드라이버 빌드하기

스피커

  • Alastair Breeze

    Google Cloud CTO실 소프트웨어 엔지니어

  • 올리 톰슨

    Formula E 주니어 데이터 과학자

정보

강연 소개

경주용 자동차는 고속, 열, 원격 분석 제약 조건이 있는 까다로운 환경입니다. 온디바이스 에이전트가 스포츠 및 엔지니어링 애플리케이션의 실시간 차량 데이터를 처리하는 데 어떻게 도움이 될 수 있나요?

이 기술 세션에서는 에지 하드웨어와 클라우드 에이전트를 결합한 실험적인 하이브리드 아키텍처를 살펴봅니다. Raspberry Pi를 사용하여 CAN 버스 원격 분석을 스트리밍하는 연구 개념 증명, ML Kit 및 Gemini Nano로 구동되는 온디바이스 대화형 에이전트를 실행하는 Pixel 휴대전화, 레이스 후 워크플로를 위한 에이전트 간 (A2A) 클라우드 연결을 살펴보겠습니다.

요약

  • 포뮬러 E 레이스 환경은 폭염과 짧은 지연 시간 요구사항으로 에지 AI에 도전 과제를 제시합니다. Pixel 휴대전화에 에이전트를 호스팅하여 시속 200km가 넘는 속도로 주행하는 운전자에게 답변을 제공했습니다.
  • Android는 ML Kit를 통해 에이전트 개발자 키트와 Gemini Nano를 사용하여 에지 아키텍처를 호스팅합니다. 에지 에이전트는 A2A 프로토콜을 통해 클라우드 에이전트와 직접 대화할 수 있습니다.
  • 차량 통합은 Raspberry Pi를 통해 실시간 CAN 버스 원격 분석을 라우팅하여 MQTT를 통해 다운샘플링된 10Hz 데이터를 게시합니다. Android 에이전트는 이 데이터를 운전자 음성 입력과 결합하여 쿼리를 평가하고 음성으로 응답합니다.
  • 굿우드에서 진행된 트랙 테스트에서 휴대전화가 심한 열을 문제없이 처리하는 것으로 입증되었습니다. 마지막 순간에 디버깅을 통해 자동차가 언덕을 올라가기 전에 드라이버 헬멧에 대한 블루투스 연결을 해결했습니다.

Gemini Notebook

주제

  • gemini-nano
  • ml-kit
  • on-device-ai
  • ai-agents
  • formula-e

스크립트

소개

  • 안녕하세요.

  • 제 이름은 알라스테어입니다. 오늘은 작년에 Formula E와 함께 진행한 프로젝트에 대해 이야기해 보려고 합니다.

  • 오늘 이 자리에 올리 님을 모시고 함께 진행한 작업에 대해 이야기를 나누어 보겠습니다.

  • 저는 Google Cloud의 CTO 사무실에서 일하고 있으며, 현재 모바일과 클라우드에서 가능한 것의 한계를 뛰어넘고 이 둘이 어떻게 함께 작동할 수 있는지 알아보고 있습니다.

  • 우리가 무엇을 했는지 간단히 소개하는 동영상을 보여드리겠습니다.

  • 4세대 자동차는 600kW의 레이싱 괴물입니다.

  • 전기 동력, 상시 사륜구동.

  • 엄청나게 빠르다고 표현하고 싶습니다.

  • 자동차에서 전송되는 텔레메트리 데이터에 연결된 Pixel 휴대전화에서 에이전트를 사용할 수 있을까요?

  • 운전자가 굿우드에서 언덕을 올라갈 때 실제로 자동차와 대화할 수 있습니다.

  • 아주 편리한 방식입니다.

  • Gemma, 내 타이어 상태는 어때?

  • 타이어 압력은 약 1.4bar로 양호합니다.

  • ECU에 직접 연결된 휴대전화가 운전자인 제가 하는 행동에 관한 수많은 데이터 포인트를 읽고 있습니다.

  • 경주용 자동차에서 이런 일이 발생한 것은 이번이 처음입니다.

  • 이보다 더 좋은 곳은 없다고 생각합니다.

  • Gemma, 준비됐어?

  • 준비되셨으면 시작하겠습니다.

에지에서 에이전트를 실행할 때의 과제

  • 이 프로젝트에서는 보조 운전자 에이전트를 운전자와 함께 조종석에 배치하려고 했습니다.

  • 근본적으로 여기서 하려는 것은 에지에서 에이전트로 가능한 것의 한계를 뛰어넘는 것입니다. 이는 정말 어려운 과제의 좋은 예이기 때문입니다.

  • 경주용 자동차에서 볼 수 있는 문제는 당연히 높은 열입니다.

  • 경주용 자동차는 열이 많이 발생하는 것으로 유명하며, 이는 가장 큰 과제 중 하나입니다.

  • 연결이 불안정합니다.

  • 그래서 우리는 수십만 명의 모터스포츠 팬이 모여 자동차 경주를 관람하는 굿우드 페스티벌 오브 스피드에서 이 작업을 진행하고 있습니다.

  • 예상하시겠지만, 수십만 명의 사람들이 한곳에 모여 있으면 연결이 원활하지 않을 수 있습니다.

  • 블루투스도 마찬가지입니다.

  • 이 자동차는 기본적으로 패러데이 케이지와 같아서 레이싱 드라이버의 헬멧에 연결하는 것조차 얼마나 어려운지 상상할 수 있습니다.

  • 마지막으로 지연 시간이 짧아야 한다는 요구사항이 있습니다.

  • 이 드라이버는 시속 200km가 넘는 속도로 달리고 있으므로 보조 드라이버 에이전트로부터 받는 답변이 매우 빠르고 간결해야 합니다.

  • 근본적으로 Google이 이 분야에 관심을 갖는 이유는 에이전트가 어디에나 존재하게 될 것이라고 믿기 때문입니다.

  • 이러한 변화는 이미 시작되었습니다.

  • 이제 컴퓨터에만 있는 것이 아닙니다.

  • 스마트폰, 시계, 안경, 스마트 홈, 이제는 자동차에도 있습니다.

  • 따라서 근본적으로 이와 같은 어려운 시나리오에서 무엇을 달성할 수 있는지 확인하고 싶었습니다.

  • 이것을 어떻게 만들지 브레인스토밍할 때, 가속기가 내장된 소형 마이크로컴퓨터를 만들어 모델을 탑재할지 고민했습니다.

  • 필요한 모든 요소가 이미 존재한다는 사실을 갑자기 깨달았는데, 그것이 바로 Android였습니다.

Android가 이상적인 호스트인 이유

  • Android는 에이전트 개발자 키트인 ADK를 제공하므로 이 작업에 완벽한 호스트입니다.

  • 이 라이브러리는 애플리케이션에 에이전트를 직접 빌드할 수 있는 매우 유용한 라이브러리입니다.

  • 수십억 명의 사용자가 있고, 다양한 폼 팩터에서 쉽게 실행할 수 있으므로 테스트하고 코드를 배포하기가 정말 쉽습니다.

  • 디버그하고 다양한 작업을 시도하며 무엇이 잘못되었는지 찾을 수 있는 개발자 도구

  • 온디바이스 AI, Google Pixel 휴대전화는 이제 휴대전화 자체에 TPU가 탑재되어 출시되며, 휴대전화에 바로 탑재된 온디바이스 모델에 최적화되어 있어 ML Kit와 같은 API를 사용하여 매우 강력한 모델에 쉽게 액세스할 수 있습니다.

  • 또한 텍스트 음성 변환 및 음성 인식과 같은 기능도 있습니다. 이는 강력한 대화형 환경을 제공하는 완전한 오프라인 API입니다.

  • 마지막으로 연결성입니다.

  • 휴대전화는 모바일 네트워크, Wi-Fi 또는 기타 수단을 통해 연결되도록 설계되었습니다.

  • 하지만 에지 에이전트가 모든 것을 할 수는 없다는 문제가 있습니다. 그렇다면 클라우드에 있는 에이전트와 어떻게 연동할 수 있을까요?

  • 하이브리드 솔루션이라면 어떨까요?

  • 휴대전화에 있는 에이전트가 클라우드의 에이전트와 직접 대화하여 더 복잡한 작업을 수행할 수 있다면 어떨까요?

  • 예를 들어 드라이버가 자신의 레이스 순위를 알고 싶어 한다고 가정해 보겠습니다.

  • 자동차 자체는 레이스에서 자신의 위치를 알 수 없지만 클라우드의 에이전트는 알 수 있습니다.

  • 또한 에이전트 간 프로토콜을 사용하면 에지 및 클라우드에서 에이전트를 생성하고 서로 대화하여 더 복잡한 작업을 수행할 수 있습니다.

에이전트의 핵심 아키텍처

  • 그렇다면 어떻게 빌드했을까요?

  • 이 시스템의 구성 요소를 살펴보겠습니다.

  • 하네스에서 시작합니다.

  • 여기서 하네스는 기본적으로 Android용 에이전트 개발자 키트를 실행하는 Android 애플리케이션입니다.

  • 두 번째 부분은 모델입니다.

  • 이를 지원하는 모델이 필요한데, 저희는 ML Kit를 통해 Gemini Nano를 사용했습니다. 이는 손쉽게 사용할 수 있는 매우 강력한 온디바이스 모델입니다.

  • 다음은 데이터입니다.

  • 잠시 후에 Oli가 이 부분에 대해 조금 더 설명하겠지만, 자동차에서 들어오는 데이터도 있고 운전자의 음성 인식도 있을 수 있습니다.

  • 마지막으로 에이전트가 수행할 수 있는 작업도 있습니다.

  • 운전자에게 다시 말하고 후속 질문을 하거나 필요한 정보를 제공할 수 있는 TTS(텍스트 음성 변환)일 수도 있고, 앞서 언급한 것처럼 에이전트 간 통신, 클라우드의 에이전트와 통신하여 더 복잡한 작업을 수행하는 것일 수도 있습니다.

  • 이제 올리를 무대로 초대하여 Formula E에서 이 작업을 어떻게 수행했는지에 대해 간단히 이야기해 보겠습니다.

차량 원격 분석 및 하드웨어 통합

  • 감사합니다, Alastair님.

  • 이제 재료가 준비되었으니 어려운 부분으로 넘어가겠습니다. AI 에이전트를 Formula E 자동차에 실제로 통합하려면 어떻게 해야 할까요?

  • VCU(차량 제어 장치)에서 시작됩니다.

  • 이제 자동차의 모든 센서와 모든 구성 요소가 CAN 버스라는 것을 통해 다시 보고합니다.

  • 그리고 자동차는 속도, 가속, 스로틀, 제동 등 초당 수천 개의 원격 측정 포인트를 생성합니다.

  • 이 원격 분석을 읽기 위해 Raspberry Pi를 이 CAN 연결을 통해 자동차의 VCU에 직접 연결하기로 결정했습니다.

  • 이제 Raspberry Pi는 몇 가지 다른 작업을 수행합니다.

  • 먼저 원시 신호를 디코딩하고 변환한 다음 약 10Hz로 다운샘플링합니다. 이는 보조 운전자에게 충분한 정보입니다.

  • 그런 다음 Raspberry Pi는 이 정제된 데이터를 MQTT를 통해 자동차 조종석에 있는 Pixel 10 Pro에 게시합니다.

  • 이는 에이전트 애플리케이션을 호스팅하는 앱이 수락할 수 있는 입력 중 하나입니다.

  • 두 번째는 Android 음성 인식입니다.

  • 따라서 운전자가 말하면 앱이 입력을 텍스트로 변환하고 Gemini Nano는 이 두 입력을 모두 추론할 수 있습니다.

  • 이제 에이전트는 두 가지 결정을 내릴 수 있습니다. 첫째, Android의 텍스트 음성 변환 엔진을 사용하여 운전자에게 다시 말할 수 있습니다.

  • 둘째, 앞서 알라스테어가 언급한 것처럼 A2A 프로토콜을 통해 클라우드 에이전트와 다시 대화할 수 있습니다.

  • 에이전트 흐름은 매우 간단합니다. 핫워드(이 경우 "Hey, Gemma")를 말하고 질문을 하면 답변을 받습니다.

  • 에이전트는 이후 약 5초 동안 계속 듣고 있으므로 실제 레이스 엔지니어와 대화하는 것처럼 처음부터 다시 시작하지 않고도 후속 질문을 할 수 있습니다.

  • 이 앱은 멀티턴 에이전트이기도 합니다. 즉, 대화 기록에 액세스하여 더 대화형으로 작동할 수 있습니다.

  • 이 코드가 조금 복잡해 보일 수 있습니다.

ADK 및 ML Kit를 사용한 구현

  • 사실 꽤 간단합니다.

  • 처음 몇 줄은 ML Kit를 사용하여 onDeviceModel를 호출하고 Gemini Nano로 래핑합니다.

    val generativeModel: GenerativeModel = Generation.getClient()
    val onDeviceModel = GenaiPrompt.create(
        generativeModel = generativeModel,
        name = "gemini-nano",
    )
    val agent = LlmAgent(
        name = "race_engineer",
        model = onDeviceModel,
        staticInstruction = /* System prompt */,
        instruction = Instruction {
            /* Dynamic context */
        },
        tools = listOf(
            /* Custom tools */
        )
    )
  • 그런 다음 ADK로 에이전트를 정의합니다.

  • 이름과 두 가지 유형의 요청 사항을 지정합니다. 첫 번째는 정적 요청 사항으로, 성격과 정체성을 정의합니다.

  • 여기에는 운전자에게 응답하는 방식과 경주 트랙에 관한 정보 등이 포함될 수 있습니다.

  • 두 번째는 동적 안내입니다.

  • 이제 이 정보는 최신 텔레메트리 요약과 함께 모든 쿼리에서 생성되므로 상담사는 언제든지 운전자가 무엇을 하고 있는지 알 수 있습니다.

  • 앞서 언급한 것처럼 현재 대화 기록도 포함됩니다.

  • 또한 이전 세션 데이터에 다시 말하는 기능, 클라우드 에이전트에 다시 말하는 기능, 텍스트 음성 변환을 사용하여 운전자에게 다시 말하는 기능과 같은 몇 가지 도구도 정의합니다.

  • 이제 Formula E 사무실의 시뮬레이션 장비에서 에이전트가 작동하는 모습을 간단한 데모로 살펴보겠습니다.

시뮬레이터 시연

  • Gemma, 내 조향이 얼마나 공격적이야?

  • 부드럽고 절제된 느낌입니다.

  • 최대 조향각은 48도였고, 초당 평균 11도씩 핸들을 움직였습니다.

  • Gemma, 내 최대 중력 가속도는 얼마야?

  • 코너를 돌 때 최대 중력 가속도는 2.2G였습니다.

  • Gemma, 내 러닝 어땠어?

  • 댄, 잘 달렸어.

  • 최고 속도 306km/h, 35초 동안 평균 186km/h

  • 전체 시간의 58% 동안 최대 속도로 달렸으며, 최대 2.2G에 도달했습니다.

  • 자,

  • 휴대전화에서 Gemini Nano가 운전자와 대화하며 실시간으로 질문에 답변하고 있습니다.

  • 시뮬레이션 장비와 포뮬러 E 자동차는 완전히 다른 문제입니다.

굿우드 배포 및 트랙 테스트

  • 그렇다면 이 모든 것을 어떻게 통합했을까요?

  • 먼저 차량이 제작되는 파리의 Spark Racing Technology를 방문해야 했습니다.

  • 왼쪽 사진은 제가 Raspberry Pi를 Formula E 차량의 실제 VCU에 연결하는 모습입니다.

  • 지금까지 빌드한 모든 항목은 에뮬레이션된 데이터에서 실행되었고 테스트 세션에서 재생되었으므로 실제 데이터에서 작동할지 여부는 알 수 없었습니다.

  • 그래서 전원을 연결하고 켜고 기다렸습니다. 조금 더 기다렸더니 마침내 기기에서 원격 분석이 시작되어 데이터가 예상대로 시스템을 통해 이동하고 있음을 증명했습니다.

  • 오른쪽에는 완성된 시스템이 표시되며, 운전자가 앉는 자리 바로 옆에 휴대전화가 실제로 조종석에 구현되어 있는 것을 볼 수 있습니다.

  • 굿우드에 갈 준비가 모두 끝났습니다.

  • 그렇다면 그날 실제로 어떤 일이 일어났을까요?

  • 앞서 알라스테어가 언급한 네 가지 과제를 기억하시나요?

  • 굿우드에서는 이 중 두 가지를 테스트했습니다.

  • 첫 번째는 열이었습니다.

  • 영국에서는 보통 맑은 날씨를 제외한 모든 날씨에 대비합니다.

  • 그래서 당연히, 우리가 얻은 것은 기록상 가장 더운 주 중 하나였고, 폭염의 한가운데에 있었습니다.

  • 포뮬러 E 자동차에 컴퓨터를 탑재하기에 완벽한 시기입니다.

  • 하지만 반전이 있습니다.

  • 휴대전화는 실제로 괜찮았습니다.

  • Android는 전혀 영향을 받지 않았습니다.

  • 가장 어려움을 겪은 것은 Raspberry Pi였습니다.

  • 그리고 자동차에 직접 연결할 수 없었기 때문에 UPS라는 것을 사용해야 했습니다. UPS는 기본적으로 Pi의 밑면에 부착된 배터리 묶음처럼 보입니다.

  • 다행히 하루 종일 간헐적으로 충전하여 이 문제를 해결할 수 있었고, 그렇지 않았다면 AI 에이전트가 없는 상태에서 언덕을 오르지 못했을 것입니다.

  • 다음은 블루투스입니다.

  • 그 시점에는 블루투스를 통해 앱에 연결되는 운전자 헬멧을 실제로 테스트해 본 적이 없었습니다.

  • 그리고 그것은 약간의 도전이 되고 있었습니다.

  • 이 기능을 테스트하기 위해 잔디밭에 앉았는데, 정말 즐거운 시간을 보내고 있는 것처럼 보이죠?

  • 노트북을 꺼내고 즐겁게 대화를 나누고 있습니다.

  • 사실 그 시기는 제 커리어에서 가장 스트레스가 많았던 시기 중 하나였습니다.

  • 오후에 언덕을 올라가기 전에 코드를 제대로 작동시키고 블루투스 헬멧을 앱에 연결하기 위해 필사적으로 노력했습니다.

  • 하지만 막판에 긴급 수정과 Android의 뛰어난 디버깅 도구 덕분에 제때 수정할 수 있었고, AI 에이전트가 제대로 작동하면서 자동차가 언덕을 올라갔습니다.

  • 이제 알라스테어에게 다시 마이크를 넘기겠습니다. 알라스테어가 프로젝트에서 얻은 교훈에 대해 조금 더 이야기해 줄 것입니다.

  • 감사합니다.

핵심 요점 및 교훈

  • 올리, 감사합니다.

  • 이 프로젝트에서 무엇을 배웠을까요?

  • 첫째, Android는 에이전트를 위한 완벽한 호스트입니다.

  • Android의 다기능성, 사용 가능한 API, 온디바이스 모델, ADK를 활용해 보세요.

  • 이러한 간단한 기능으로 얼마나 강력한 경험을 할 수 있는지 직접 확인해 보세요.

  • 통합 지옥은 여전히 존재합니다.

  • 여기 계신 대부분의 분들이 커리어 중 어느 시점에 이런 경험을 하셨을 겁니다.

  • 모든 하위 구성요소를 개별적으로 빌드한 후 최종적으로 연결할 때 제대로 작동하지 않는 경우가 있습니다.

  • 운전자의 레이싱 헬멧이 바로 이것이었습니다.

  • 다행히 당일에 문제를 해결할 수 있었고, 이를 통해 테스트가 여전히 매우 중요하다는 것을 알 수 있었습니다.

  • 마지막으로 Gemini Nano입니다.

  • Gemini Nano가 큰 도움이 되었습니다.

  • 이 모델은 매우 효과적이며 기기에서 매우 빠르게 실행되고 복잡한 작업을 수행할 수 있지만, 바로 수행할 수 있는 것은 아닙니다.

  • 여기에는 진지한 고민이 담겨 있습니다.

  • 프롬프트 엔지니어링을 해야 합니다.

  • 테스트해 봐야 합니다.

  • 동적 요청 사항과 정적 요청 사항을 제공하는 방식을 고려해야 합니다.

  • 제공할 도구와 이를 가장 잘 지시하는 방법을 생각해야 합니다.

  • 하지만 적절한 테스트와 평가를 거치면 기기에서 바로 Gemini Nano와 같은 모델을 최대한 활용할 수 있습니다.

  • 감사합니다, 여러분.

  • 나중에 부스에 있을 예정이니 오셔서 질문해 주세요.

코드

코드 스니펫

'ADK 및 ML Kit를 사용한 구현'의 07:45에 나오는 Kotlin 스니펫
val generativeModel: GenerativeModel = Generation.getClient()
val onDeviceModel = GenaiPrompt.create(
    generativeModel = generativeModel,
    name = "gemini-nano",
)
val agent = LlmAgent(
    name = "race_engineer",
    model = onDeviceModel,
    staticInstruction = /* System prompt */,
    instruction = Instruction {
        /* Dynamic context */
    },
    tools = listOf(
        /* Custom tools */
    )
)