Emoji generative AI


서두

  • (08:42) 오늘은 이모지를 만들어내는 AI에 대해 얘기해볼거에요
  • (08:42) 일단 초기 버전을 Python으로 덕지덕지 만들어봤어요
# %%
import promptlib as pl
from emoji import EMOJI_DATA
import json

# %%
AICI_API_BASE=""
aici = pl.AICI(base_url=AICI_API_BASE, wasm_runner_id="declctrl-latest")

# %%
program = pl.PromptProgram(aici)

p = program + "Please suggest emoji representing the text provided:\n"
p += "Q:Dance\nA:"
p = p.choose(EMOJI_DATA.keys())

result = program.run()
  • (08:44) 이제 Q:와 A: 사이에 사용자 텍스트를 집어넣으면 이모지를 팍팍 만들어주겠지?
  • (08:51) promptlib는 aici에서 제공하는 라이브러리인데 간단히 말해서 LLM이 생성하는 데이터를 제어하는 코드를 쉽게 만들어줘요.
  • (08:52) 여기선 유니코드 emoji에 해당하는 값만 허용하게 해줘요.
  • (09:17) 조금 더 설명하자면 모델이 다음 토큰을 예측할 때 먼저 모든 토큰에 대해 확률을 계산하고 그중 가장 그럴듯한 (가장 높은 확률) 후보를 다음 토큰으로 생성해내는 건데, 아예 내가 원하지 않는 토큰들을 싹 무시하도록 하고 나머지 중에 제일 좋은 후보를 선택하도록 하면 모델이 헛소리를 하고 싶어도 할 방법이 없어지는 원리죠.
  • (09:21) 다만 이렇게 하려면 모델이 계산해내는 확률값을 접근하고, 거기다가 내가 원하는 후처리 작업을 할 수 있어야 하니까 AI 생성 작업에 감시자 프로세스를 붙일 수 있는 환경이 필요한데… 그게 바로 Microsoft의 aici
  • (09:59) 하여튼 이모지가 나오긴 나오는데 여기서 프롬프트 뒷부분만 꺼내오는게 좀 라이브러리 지원이 별로네요.
  • (10:00) 킹쩔수없이 aici README를 참조해서 다시 만들어보겠습니다.
  • (10:22) 그치만 aici는 jupyter notebook에서 바로 쓰기 어렵네요… 다시 promptlib를 가지고 어떻게 해 보겠습니다.
  • (10:23) 아 역시 README를 안읽으면 바보… promptlib tutorial을 보니 storage에 뭔가 저장할 수 있네요.
  • (10:24) 그래서 결과값 부분을 저장하게 하니까 쨘! 뾰로롱!

서비스

  • (10:50) 아이고 시간없다 일단 Flask로 그냥 python API 하나만 쨘
  • (10:51) 애들이 옆에서 컴퓨터 내놓으라고 성화중

컨테이너

  • (10:52) 서버를 컨테이너에 좀 우겨넣어야 여기저기 옮길 수 있지 않을까나…
  • (10:59) 애들이 컴퓨터 내놓으라고 해서 뺏김ㅠ
  • (13:24) 돌아왔다
  • (13:25) aici/에는 아직 제대로 된 Dockerfile이 없는듯? 일단 내가 만들어봄
  • (13:54) 빌드가 작지 않아서 곤란하다…
# Use the official Rust image as the base image
FROM rust:latest

RUN rustup target add wasm32-wasi

RUN apt-get update && apt-get install -y cmake ccache clang

# Set the working directory inside the container
WORKDIR /usr/src/app

COPY . .

WORKDIR /usr/src/app/llama-cpp-low/

RUN cargo build --release

WORKDIR /usr/src/app/rllm-cpp/

RUN cargo build --release

ENTRYPOINT [ "rllm-cpp/cpp-server.sh", "phi2" ]
  • (13:59) 한글자만 바꿔도 풀빌드해야하는 미친 설정이지만 어쨌든 돌아가게 만드는 게 1순위라…
  • (21:57) docker-compose에서 버벅이고 있다
  • (22:02) 아직 코드가 배포 환경을 신경쓰지 않았는지 서버에 하드코드로 host = “127.0.0.1”이 박혀있었다…
  • (22:02) docker에서 쓰려면 외부 접속이 되어야 하는데!
  • (22:05) 아… docker-compose에 expose랑 ports는 별개의 설정이었다. 네이놈 copilot!
  • (22:14) 됐다 됐다 이제 대충 로컬에서 API 접근 된다.
version: '3'
services:
  base-image:
    image: base-image
    build:
      context: .
      dockerfile: ./base-image.Dockerfile
    deploy:
      replicas: 0
  server:
    build:
      dockerfile: ./server.Dockerfile
    expose:
      - "4242"
    healthcheck:
      test: curl --fail http://localhost:4242/v1/models || exit 1
      interval: 60s
      retries: 5
      start_period: 20s
      timeout: 10s
    volumes:
      - cache:/root/.cache
      - buildcache:/usr/src/app/target
  runtime:
    build:
      dockerfile: ./declctrl.Dockerfile
    depends_on:
      server:
        condition: service_healthy
    environment:
      - AICI_API_BASE=http://server:4242/v1
  app:
    build:
      dockerfile: ./app.Dockerfile
    depends_on:
      server:
        condition: service_healthy
      # runtime:
      #   condition: service_completed_successfully
    stop_signal: SIGINT
    environment:
      - AICI_API_BASE=http://server:4242/v1
    ports:
      - "127.0.0.1:18080:8080"
volumes:
  cache:
    driver: local
  buildcache:
    driver: local
  • (22:56) 실제 배포해 보니까 base-image를 docker-compose에서 빌드 안해주는지? 라벨 이름을 다르게 붙이는지? 여튼 다른 Dockerfile에서 가져가질 못하더라.
  • (22:56) 일단 서버에서 손으로 빌드 땜빵땜빵. 사펑하러 가야해
  • (23:00) 오늘은 여기까지, 모두들 안녕!