Gemini 로 embedded device 에서 실행해보기 (Raspberry Pi pico)

안녕하세요 미남홀란드입니다.

오늘은 AI 분야에서 AIoT 분야로의 확장을 위한 게시글을 준비해봤습니다.

라즈베리파이 피코라고 생소하실텐데요. 5천원짜리 미니컴퓨터라고 생각하시면 쉬울 것 같습니다. 워낙 저용량 이고 python 이 지원됨으로써 iot 분야에서 aiot 분야로 확장을 시키기 위해 쉽게 써 볼 수 있는 디바이스 입니다.


준비물 :

라즈베리파이 피코(W6100_EVB_PICO) ← 회사 물건이라 그냥 썼습니다 저는

마이크로파이썬 - Thony

ethernet 환경 구성


소프트웨어

본인이 쓸 Device 에 펌웨어관련을 설치해줍니다. 일반 Pico 는 이더넷이 지원이 되지 않음으로 따로 보드나, 이더넷 모듈을 장착해야해서 번거로울 수 있습니다. 그건 고려부탁드립니다.

펌웨어를 설치해주면 이더넷 환경은 셋팅이 끝이 납니다.

Google API keys 셋팅


https://makersuite.google.com

Studio site 에서 API key 를 발급 받아줍니다

현재 제미니의 요금제를 참고 바랍니다. GPT-3.5 turbo 보다 매우 적은 비용으로 토큰을 할당 할 수 있고 openAI 와 다르게 토큰 비용 계산이 조금 다르다고 합니다.

# Quickly test the API by running a cURL command
curl \
  -H 'Content-Type: application/json' \
  -d '{"contents":[{"parts":[{"text":"Write a story about a magic backpack"}]}]}' \
  -X POST https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=YOUR_API_KEY


GPT와
달리 엔드포인트 주소에는 api_key가 포함되어 있으므로 그에 따라 기존 OpenAI 코드와는 다르게 수정을 해야합니다.

GPT 와 또 다르게 response 받는 형태 또한 조금 다르기 때문에 나중에 위 형식을 Docs 에서 참고해서 내용을 추출 해주시면 됩니다.

Source Code(main)

Gemini.py

import json
import urequests


gemini_api_key = "your_api_key"
gemini_url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key={gemini_api_key}"

def send_prompt_to_gemini(prompt):
    headers = {"Content-Type": "application/json"}
    data = {
        "contents": [{
            "parts": [{"text": prompt}]
        }]
    }
    
    response = urequests.post(gemini_url, headers=headers, data=json.dumps(data))
    if response.status_code == 200:
        response_data = json.loads(response.text)
        return response_data["candidates"][0]["content"]["parts"][0]["text"]
    else:
        raise Exception(f"API error ({response.status_code}): {response.text}")

위 gemin.py 를 모듈로 사용해서 리스폰을 받아야합니다.

Send.py

from machine import Pin, SPI
import network
import utime
import gemini

#init Ethernet code
def init_ethernet(timeout=10):
    spi = SPI(0, 2_000_000, mosi=Pin(19), miso=Pin(16), sck=Pin(18))
    nic = network.WIZNET5K(spi, Pin(17), Pin(20))   # spi, cs, reset pin
    # DHCP
    nic.active(True)

    start_time = utime.ticks_ms()
    while not nic.isconnected():
        utime.sleep(1)
        if utime.ticks_ms() - start_time > timeout * 1000:
            raise Exception("Ethernet connection timed out.")
        print('Connecting ethernet...')

    print(f'Ethernet connected. IP: {nic.ifconfig()}')

def main():
    init_ethernet()

    while True:
        prompt = input("User: ")
        if prompt.lower() == "exit":  
            print("Exiting...")
            break

        try:
            response = gemini.send_prompt_to_gemini(prompt)  
            print("Gemini: ", response)
        except Exception as e:
            print("Error: ", e)

if __name__ == "__main__":
    main()

간단한 이더넷 통신코드와 루프문을 통해서 gemini 와 통신하는 코드 입니다.


결과

제미니에게 뉴진스를 아냐고 물어봤는데 생각보다 자세하게 설명을 해주더라구요. 그래서 더 딥하게 민지를 아냐? 라고 하니깐 자세한 정보를 출력해주었습니다. 현재 Google 의 Gemini 는 어떻게 학습하였고 어떤데이터, 학습 시점 이 공개가 되지 않았는데 그래도 왠만한 open Source LLM 보다는 성능이 좋아 보입니다. 그러나 계속 뉴스에 나오지만 아직 GPT 만큼 성능이 안나온다라고 하기 때문에 계속 지켜봐야 할 것 같습니다.

위 코드가 되게 기본적인 코드라서 라이브러리가 깔리지 않는 임베디드 환경에서 URequest 를 통하여 호출해오는 기본 코드입니다. IoT 분야에서는 센싱 데이터를 가지고 추론을 api 를 통해서 보통하는 경우가 많은데 이렇게 LLM 들이 성능이 좋아질수록 AIOT 분야가 더욱 발전하지 않을까 조심스럽게 생각하고 있습니다.

긴글 읽어주셔서 감사합니다.


5
2개의 답글

👉 이 게시글도 읽어보세요

모집 중인 AI 스터디