더욱 개인적인 생성형 AI 활성화

7월 09, 2024
Krzysztof Ostrowski Research Scientist
Rene Kolga Senior Product Manager

생성형 AI(gen AI) 채택률이 빠르게 늘고 있지만, 비공개 및 기밀 유지 보장에 대한 요구 수준이 더 높은 데이터에 gen AI를 적용하여 제품을 개발할 수 있는 잠재력은 여전히 거의 미개척 상태로 남아 있습니다.

예를 들어, 이는 다음과 같은 것에 gen AI를 적용하는 것을 의미할 수 있습니다.

  • 개인 비서 앱이 사람들의 삶에서 일어나는 일에 보다 완벽하게 통합되고 인식하여 더욱 폭넓은 범위의 일상 환경에서 사람에게 도움을 줄 수 있도록 하는 데이터 처리.

  • 예컨대 생산성을 향상하고 운영 비용을 절감하기 위해 청구서 처리 또는 고객 지원 문의 처리와 같은 지루한 작업을 자동화하기 위한 기밀 비즈니스 정보.

이와 같은 특정 응용 분야에서는 개인 정보 보호/기밀 유지, 투명성, 데이터 처리의 외부 검증 가능성과 관련한 요구 사항이 높아질 수 있습니다.

Google은 더욱 철저하게 비공개 상태를 유지해야 하는 데이터를 처리하기 위해 gen AI의 잠재력을 실험하고 탐색하는 데 사용할 수 있는 다양한 기술을 개발했습니다. 이 게시물에서는 최근에 출시된 GenC 오픈소스 프로젝트를 사용하여 컨피덴셜 컴퓨팅, Gemma 오픈소스 모델, 모바일 플랫폼을 함께 결합하여 개인 정보 보호/기밀성, 투명성, 외부 검증 가능성에 관한 요구 수준이 높아진 데이터를 처리할 수 있는 자체 gen AI 기반 앱을 개발하며 다양한 실험을 시작하는 방법을 설명하겠습니다.


함께 작동하는 최종 사용자 기기와 클라우드

아래 그림과 같이 이 게시물에서 중점적으로 다룰 시나리오에는 기기의 데이터에 액세스할 수 있고 LLM을 사용하여 이 데이터에 대해 gen AI 처리를 수행하려는 모바일 앱이 등장합니다.

예를 들어, 기기에 저장된 메모, 문서 또는 녹음에 대한 질문을 요약하거나 질문에 답하도록 되어 있는 개인 비서 앱을 상상해 보세요. 콘텐츠에 다른 사람과 주고받은 메시지와 같은 개인 정보가 포함될 수 있으므로 비공개로 유지하고자 합니다.

이 예에서는 오픈소스 모델의 Gemma 제품군을 선택했습니다. 여기서는 모바일 앱에 초점을 맞추지만, 온프레미스에서 자체 데이터를 호스팅하는 기업에도 동일한 원칙이 적용됩니다.

A model cascade that spans from a mobile device to a trusted enclave in cloud.

이 예에서는 두 개의 LLM을 포함하는 '하이브리드' 설정을 보여주는데, 한 LLM은 사용자 기기에서 로컬로 실행되고 다른 LLM은 컨피덴셜 컴퓨팅으로 구동되는 Google CloudConfidential Space TEE(신뢰할 수 있는 실행 환경)에서 호스팅됩니다. 모바일 앱은 이 하이브리드 아키텍처를 통해 온디바이스와 클라우드 리소스를 모두 활용하여 다음과 같이 두 가지 모두의 고유한 이점을 누릴 수 있습니다.

  • 최대 1.5GB 패키지로 제공되며 최신 모바일 기기(예: Pixel 7)에 적합한 양자화된 Gemma 2B의 작은 인스턴스. 이 인스턴스는 더 빠른 응답 시간(네트워크 또는 데이터 전송 지연 시간을 발생시키지 않음), 네트워크 연결 없이도 쿼리를 지원하는 능력, 로컬 온디바이스 하드웨어 리소스를 활용할 수 있어 클라우드 측에서 동일한 비용으로 더 폭넓은 잠재고객에게 도달할 수 있다는 점 때문에 더 나은 비용 효율성 등의 이점을 제공할 수 있습니다.

  • 고출력 기기에도 적합하지 않고 35GB에 약간 못 미치는 양자화되지 않은 Gemma 7B의 큰 인스턴스. 클라우드에서 호스팅되므로 네트워크 연결에 따라 달라지며 비용이 더 많이 들지만, 더 나은 품질과 더 복잡하거나 비싼 쿼리(처리할 수 있는 리소스가 더 많음)를 처리하는 기능을 제공하며, 다른 이점(예: 계산을 클라우드로 오프로드하여 모바일 기기의 배터리 소비 최소화 등)도 있습니다.

이 예에서 두 모델은 함께 작동하며, 더 작고 저렴하며 빠른 Gemma 2B가 첫 번째 계층 역할을 하고 더 간단한 쿼리를 처리하는 모델 캐스케이드에 연결되는 반면, 더 큰 Gemma 7B는 Gemma 2B가 스스로 처리할 수 없는 쿼리에 대한 백업 역할을 합니다. 예를 들어, 아래의 추가 코드 스니펫에서, 먼저 각 입력 쿼리를 분석하여 두 모델 중 가장 적절한 모델을 결정하는 온디바이스 라우터로 작동하도록 Gemma 2B를 설정한 다음, 그 결과에 따라 쿼리를 온디바이스에서 로컬로 처리하거나 클라우드 기반 TEE에 있는 Gemma 7B로 릴레이합니다.


기기를 논리적으로 확장한 TEE

이 아키텍처에서는 클라우드의 TEE를 투명성, 암호화 보장, 신뢰할 수 있는 하드웨어로 구동되는 사용자 모바일 기기를 사실상 논리적으로 확장한 것으로 생각할 수 있습니다.

  • Gemma 7B가 있는 비공개 컨테이너와 TEE에 호스팅된 GenC 런타임은 암호화된 메모리로 실행되고, 기기와 TEE 간의 통신도 암호화되며, 아무런 데이터도 유지되지 않습니다(필요한 경우 휴면 상태에서 암호화될 수도 있음).

  • 상호 작용이 발생하기 전에 기기는 TEE에서 실행되는 컨테이너 이미지의 SHA256 다이제스트가 포함된 증명 보고서를 요청하여 기기에서 위임된 쿼리를 처리할 TEE 내 코드의 ID와 무결성을 확인합니다. 기기는 이 다이제스트를 개발자가 앱과 함께 번들로 제공한 다이제스트와 비교합니다. (이 간단한 시나리오에서 사용자는 순수한 온디바이스 앱과 마찬가지로 여전히 앱 개발자를 신뢰하며, 더 복잡한 설정도 가능하지만 이 기사의 범위를 벗어납니다.)

  • 이 시나리오에서 컨테이너 이미지에서 실행되는 모든 코드는 100% 오픈소스입니다. 따라서 개발자나 기타 외부 당사자는 이미지에 들어가는 코드를 독립적으로 검사하여 사용자 또는 데이터 소유자의 기대치, 규제 또는 계약상 의무 등에 부합하는 방식으로 데이터를 처리하는지 확인한 다음, 스스로 이미지를 빌드하고 결과 이미지 다이제스트가 앱 내에서 번들로 제공되고 이후에 TEE가 반환하는 증명 보고서에서 앱이 예상하는 다이제스트와 일치하는지 확인할 수 있습니다.

한눈에 봐도 이 설정은 복잡해 보일 수 있으며, 처음부터 모든 것을 완전히 설정해야 한다면 실제로도 그렇게 될 것입니다. 그래서 프로세스를 더 쉽게 만들려고 GenC를 정교하게 개발했습니다.


개발자 환경 간소화

다음은 GenC에서 위와 같은 시나리오를 설정하기 위해 실제로 작성해야 하는 코드의 예입니다. Java 및 C++ 저작 API도 제공하지만, 여기서는 Python을 널리 선택해 사용하는 것으로 보고 기본적으로 제공합니다. 이 예에서는 더 민감한 주제의 존재를 (더 신중한 응답을 만들 수 있는) 더 강력한 모델로 쿼리를 처리해야 한다는 신호로 사용합니다. 이 예는 설명의 목적상 간소화된 것이라는 점을 유념하세요. 실제로는 라우팅 논리가 보다 정교하고 애플리케이션에 따라 달라질 수 있으며, 특히 작은 모델에서는 신중한 프롬프트 엔지니어링이 우수한 성능 달성에 필수적입니다.

@genc.authoring.traced_computation
def cascade(x):
  gemma_2b_on_device = genc.interop.llamacpp.model_inference(
    '/device/llamacpp', '/gemma-2b-it.gguf', num_threads=16, max_tokens=64)
 
  gemma_7b_in_a_tee = genc.authoring.confidential_computation[
    genc.interop.llamacpp.model_inference(
      '/device/llamacpp', '/gemma-7b-it.gguf', num_threads=64, max_tokens=64),
    {'server_address': /* server address */, 'image_digest': /* image digest */ }]
 
  router = genc.authoring.serial_chain[
    genc.authoring.prompt_template[
      """Read the following input carefully: "{x}".
      Does it touch on political topics?"""],
    gemma_2b_on_device,
    genc.authoring.regex_partial_match['does touch|touches']]
 
  return genc.authoring.conditional[
    gemma_2b_on_device(x), gemma_7b_in_a_tee(x)](router(x))

GitHub의 튜토리얼에서 이러한 예제 코드를 빌드하고 실행하는 방법에 대한 자세한 단계별 내역을 확인할 수 있습니다. 보시다시피, 추상화 수준은 LangChain과 같이 인기 있는 SDK에서 찾을 수 있는 것과 일치합니다. Gemma 2B 및 7B에 대한 모델 추론 호출은 프롬프트 템플릿 및 출력 파서와 함께 여기에 배치되며 체인으로 결합됩니다. (참고로, 저희는 확장하고자 하는 LangChain 상호 운용성을 제한적으로 제공합니다.)

Gemma 2B 모델 추론 호출은 온디바이스로 실행되는 체인 내에서 직접 사용되는 반면, Gemma 7B 호출은 confidential_computation 문 내에 명시적으로 삽입됩니다.

여기서 중요한 건 놀랄 일이 없다는 점입니다. 프로그래머는 온디바이스로 수행할 처리와 클라우드에서 기기에서 TEE로 위임할 사항에 대한 결정을 항상 완벽히 통제할 수 있습니다. 이 결정은 코드 구조에 명시적으로 반영됩니다. (이 예제에서는 신뢰할 수 있는 단일 백엔드에만 Gemma 7B 호출을 위임하지만, 저희가 제공하는 메커니즘은 포괄적이며 이를 사용하여 전체 에이전트 루프 등 더 큰 처리 청크를 개수에 관계없이 백엔드에 위임할 수 있습니다.)


프로토타입 제작부터 유연한 배포까지

위에 표시된 코드는 친숙한 Python 구문을 사용하여 표현되지만 내부적으로는 Intermediate Representation(또는 줄여서 'IR')이라고 하는 휴대용 플랫폼과 언어에 독립적인 형태로 변환됩니다.

이 접근 방식에는 다음을 비롯한 여러 가지 이점이 있습니다.

  • 이 접근 방식을 통해 Jupyter 노트북과 같이 빠르게 진행되는 반복을 지원하는 사용하기 쉽고 신속한 개발 환경에서 gen AI 논리를 프로토타입으로 만들어 테스트한 다음, 예컨대 모바일 기기의 Java 앱에서 실행되는 것과 같이 최소한의 것만 변경되거나 전혀 변경되지 않은 동일한 gen AI 코드를 배포할 수 있습니다. 튜토리얼에서는 IR이 포함된 파일을 모바일 기기로 복사하여 앱에 로드하기만 하면 되는 간단한 과정으로 소개되어 있습니다.

  • 이 접근 방식을 통해 여러 언어와 플랫폼에 걸쳐(예: Linux 기반에서 모바일 플랫폼까지, Python에서 Java 및 C++까지) 일관된 동작으로 동일한 논리를 배포하고 실행할 수 있습니다. 다양한 제품 표면을 타겟팅할 계획이라면 이 접근 방식이 제격입니다.

  • 이 접근 방식을 통해 프로세스 및 시스템 경계 전반에 걸쳐 gen AI 논리 중 어떤 부분이든 역동적으로 위임할 수 있습니다. 이는 모바일 기기가 클라우드의 TEE에 위임하는 시나리오에서 암시적으로 일어나는 일입니다. 이 간단한 예제에서도 마찬가지인데, 단일 작업(Gemma 7B 추론 호출)만 위임합니다. 저희가 제공하는 메커니즘은 훨씬 더 일반적입니다.

현실적인 배포에서는 성능이 결정적으로 중요한 요소인 경우가 많습니다. 현재 저희가 게시한 예제는 CPU 전용으로 제한되어 있으며, GenC는 현재 TEE에 있는 모델의 드라이버로 llama.cpp만 제공할 뿐입니다. 그러나 컨피덴셜 컴퓨팅 팀은 기밀 모드에서 작동하는 Nvidia H100 GPU의 예정된 미리보기와 함께 Intel AMX 기본 제공 가속기Intel TDX에 대한 지원을 확대하고 있으며, 저희는 사용 가능한 소프트웨어 및 하드웨어 옵션의 범위를 확장하여 최상의 성능과 더욱 광범위한 모델에 대한 지원을 제공하려고 적극적으로 노력하고 있습니다. 향후 업데이트를 기대해 주세요!


여러분의 이야기를 듣고 싶습니다!

흥미를 느끼시길 바라며, 이 게시물을 통해 저희가 도입한 몇 가지 기술을 사용하여 자신만의 gen AI 애플리케이션을 개발해 보시기 바랍니다. GenC는 실험 및 연구 목적으로 개발된 실험용 프레임워크라는 점을 유념하시기 바랍니다. 즉, 무엇이 가능할지 보여주고 개발자 여러분이 저희와 함께 이 흥미진진한 분야를 탐구하고 싶은 영감을 드리고자 GenC를 만들었습니다. 더욱 발전하도록 기여하고 싶으시면 저자에게 연락하거나 GitHub에서 저희와 함께하시기 바랍니다. 함께 활발히 교류하고 협력하고 싶습니다!