“Stable Diffusion AI Illustrator를 활용해 PHP 기반 웹 서비스 만들기”
— 백엔드 개발자 한준호(렌유) 님 사례 –
주니어 백엔드 개발자
한준호입니다
한국과 해외 도메인 등록 대행 회사에서 근무하고 있어요. 주로 시스템 내에서 발생하는 오류나 취약점을 디버깅해 문제를 해결하고 있습니다. 사내에서 사용하는 서비스를 개발하거나, 외부 고객을 대상으로 한 서비스도 만들고 있어요.
회사 밖에서는 구름IDE로 ‘렌유 AI’를 운영하고 있습니다. 좋은 기회로 구름 블로그에 소개할 수 있게 되었네요.
AI 이미지 생성 사이트
렌유 AI는 다양한 AI 기반 서비스를 제공하는 웹 앱입니다. 대표 서비스는 Stable Diffusion 기술을 활용해 이미지를 만들 수 있는 ‘AI 일러스트레이터’예요. 프롬프트에 만들고 싶은 그림의 키워드를 입력하면 애니메이션 이미지가 만들어집니다.
이외에도 해상도를 4배까지 올릴 수 있는 ‘AI 업스케일러’, AI로 피사체와 배경을 구분하는 ‘AI 배경 제거’, AI가 만든 그림인지 판독할 수 있는 ‘AI 감지기’를 제공하고 있습니다.
고등학교 졸업을 앞두고
만들기 시작했어요
졸업까지 남은 시간을 어떻게 활용할지 고민하던 찰나에 우연히 외국 회사에서 만든 이미지 생성 AI를 접했습니다. 더 높은 퀄리티로 만들 수 있을 것 같아 바로 개발하기 시작했죠.
지금은 회사 업무 외 사이드 프로젝트로 꾸준히 진행하고 있어요. 아직 주니어 단계라 개발 경험과 실력이 부족하다고 생각하는데, 렌유 AI로 창의성도 뽐내고 시도해 보지 않았던 분야에 도전하면서 새로운 기회를 만들고 있습니다.
AI 일러스트레이터 핵심 플로우는
- 사용자가 프롬프트(이미지 생성 데이터)를 입력한다.
- 사용량이 가장 적은 최적의 GPU 서버를 찾는다.
- 대기열 DB에 GPU 정보를 포함한 프롬프트 정보를 저장한다.
- 대기열 서버에서 작업 정보와 GPU 서버 정보를 읽은 후 GPU 서버에 작동 요청한다.
- GPU 서버에서 노이즈를 통해 이미지를 생성한 다음 정상적인 이미지인지 검증한다.
- 만든 이미지를 대기열 서버로 전송한다.
- S3 스토리지에 이미지를 업로드해 일반 DB에 이미지 생성 정보를 저장한다.
- 생성 완료 처리 후 프론트에 표시한다.
렌유 AI는 웹 사이트에서 AI 서비스를 제공하고 있어 이미지를 생성하는 데 생각보다 많은 과정을 거치고 있어요. 모든 과정은 5~7초 정도 걸립니다.
PHP와 Stable Diffusion 오픈 소스를
활용했어요
저는 주로 PHP로 프로젝트를 진행했는데요, 이번에는 처음으로 PHP 8과 Vue.js를 사용했습니다. 이전 프로젝트와 차별화하고 싶었거든요. 백엔드는 자체 개발한 프레임워크를 사용해 개발 속도와 동작 속도를 개선했습니다.
렌유 AI의 핵심은 Stable Diffusion 오픈 소스예요. Stable Diffusion은 이미지를 생성하는 딥러닝 기술 중 하나로 노이즈를 이미지로 변환합니다. 무작위 노이즈 이미지를 초기 이미지로 설정하고, 이 이미지를 업데이트하면서 개선하는 방식이에요.
예를 들어 Stable Diffusion이 고양이를 학습하려면 고양이 사진을 노이즈로 만들고, 이 노이즈를 복원하는 과정을 반복해야 합니다. 학습을 마친 후 고양이 사진을 그려달라고 하면 랜덤으로 노이즈를 만든 다음 사전에 학습한 노이즈 복원 알고리즘을 통해 노이즈를 고양이 사진으로 변환하는 거죠.
당시 이미지 생성 AI 중 오픈 소스는 Stability AI에서 공개한 Stable Diffusion뿐이었습니다. 이미지 생성 AI 자체도 오픈AI의 DALL·E와 구글의 Imagen 정도로 많지 않았어요. 다행히 Stable Diffusion은 누구나 쉽게 사용할 수 있어 렌유 AI에 활용할 수 있었습니다.
6개 컨테이너로
서비스를 구성했어요
렌유 AI는 ‘대기열’이라는 시스템을 사용하고 있어요. 콘서트나 뮤지컬 티켓팅을 할 때 접속 대기 중인 화면을 보셨을 텐데요. 서버가 과부하 되지 않도록 유저가 접속할 수 있을 때까지 대기하게 하는 시스템입니다. 서버 구성이 단순하지 않아 백엔드, GPU, 데이터베이스, 대기열 등으로 컨테이너를 분리해 배포하고 있어요.
- 백엔드 컨테이너 : Vue.js에서 보낸 요청을 전부 수락합니다.
- DB 컨테이너(일반) : 기본적인 회원 정보, 사용 기록 등을 저장합니다.
- DB 컨테이너(대기열) : 등록된 대기열과 서버 상태에 관한 정보를 저장합니다.
- 대기열 컨테이너 : 대기열 DB에 쌓인 작업 목록을 불러온 후 GPU 서버에 각 작업을 요청하고 작업이 끝나면 이미지와 DB를 저장합니다.
- GPU 컨테이너 : 대기열 컨테이너의 요청에 맞는 이미지를 생성합니다. 이미지 생성을 마치면 다음 요청을 기다립니다.
- 개발 컨테이너 : 실제 서비스에 반영하기 전 코드를 수정하고 테스트합니다.
개발 컨테이너에서 작업한 다음 Git으로 각 컨테이너에 업데이트 코드를 배포하고 있습니다.
Google Colab에서
구름IDE로
개발 초기에는 개인 서버에서 프론트엔드와 백엔드를 호스팅했습니다. Google Colab을 사용해 Stable Diffusion을 구동했죠. 개발이 끝나갈 때쯤 베타 테스트를 오픈했는데, 예상보다 접속자가 많아 GPU가 불안정하게 작동하거나, MySQL이 1시간마다 다운되어 DB가 손상되는 문제가 발생했어요. 안정적인 GPU, 백엔드 서버가 필요해 구글링하던 중 ‘구름IDE GPU 인스턴스 베타 오픈 아티클’을 발견했고, 이후로는 구름IDE를 사용하고 있어요.
구름IDE는 AWS EC2를 제공하고 있어 제가 소유한 개인 서버보다 속도나 안정성 부분에서 매우 만족스러웠습니다. 성능뿐만 아니라 URL로 간편하게 컨테이너를 공유할 수 있어 다른 팀원과 서비스를 운영하는 측면에서도 좋았어요.
합리적으로 GPU를 사용할 수 있는 점도 많은 도움이 됐습니다. Google Colab이나 Kaggle 등 다양한 GPU 서비스를 써봤지만, 구름IDE와 비슷한 가격대에서는 긴 런타임을 보장하고 재부팅 해도 데이터를 유지해 주는 플랫폼을 찾을 수 없었어요. 패키지 사전 설치도 다른 플랫폼에서는 제공하지 않는 기능이었고요.
Google Colab을 대체할 플랫폼을 찾고 계시거나 사이드 프로젝트를 진행하고 계신다면 구름IDE를 추천하고 싶습니다. 덕분에 이전보다 협업도 편해지고 능률도 올랐거든요.
Edit Sunny Design Lily