개발 알다가도 모르겠네요

Stable Diffusion 을 서버와 연동해보자 본문

Stable Diffusion

Stable Diffusion 을 서버와 연동해보자

이재빵 2023. 7. 17. 14:41
728x90

Stable Diffusion

자연어 설명으로부터 이미지를 생성해내는 딥러닝 생성형 AI로 Text to Image 모델, 즉 텍스트로부터 이미지를 뽑아내는 것이다.

 

아무튼 회사에서 운영중인 앱에 Stable Diffusion 기술을 탑재시켜야 했다.

그림을 잘 못 그리는 사용자들을 위해, 텍스트를 입력하면 그 텍스트를 stable diffusion을 이용해 이미지를 출력해서 그림에 흥미를 갖도록 하기 위한 의도였다.

 

Situation : 외부서버에서 접근 가능하도록 만들자

 

동작 구조는 [클라이언트] <---이미지 생성 요청/응답---> [WAS서버] <---이미지 생성---> [Stable Diffusion서버]프로세스가 이뤄져야 했다. 

 

 

아래의 깃헙은 Stable Diffusion을 web ui형태로 구현해낸 소스코드다.

 

GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI

Stable Diffusion web UI. Contribute to AUTOMATIC1111/stable-diffusion-webui development by creating an account on GitHub.

github.com

 

실행하면 web ui 형태의 stable diffusion 이미지 생성 페이지가 뜬다.

저 코드를 Stable Diffusion 전용 서버 안에 탑재하는 것이 필요했다.

전용 서버는 Ncloud 플랫폼을 통해 구축 및 호스팅이 되고 있었고, Window Server 환경이었다.

깃헙의 공식문서를 보면 윈도우 환경에서 실행하는 법은 다음과 같았다.

코드를 살펴보니 REST API를 구축한 프레임워크는 FAST API였다.

서버를 실행시키면 아래와 같이 http://127.0.0.1:7861 주소로 실행이 되었다는 것을 알 수 있다.

 

Problem1: 로컬 주소에다가 api호출을 할 순 없다

메인서버와 Stable Diffusion서버가 REST api 통신을 하기 위해서는 로컬주소가 아닌 외부주소가 필요하다.

 

일단 8080포트를 쓰기로 했고, cmd를 통해 현재 쓰이고 있는 8080포트를 살펴보니 아래와 같이 아무것도 뜨지 않는다. 즉 닫혀 있다.

생각보다 해결법은 무척 간단했는데, 소스코드 내에서

server_name=server_name,
server_port=cmd_opts.port,

이 부분을 아래와 같이 바꿔주면 바로 해결이 됐다.

server_name='0.0.0.0',
server_port=8080,

 

여기서 '0.0.0.0' 이 하는 역할은, 0.0.0.0로 접근하면 로컬 호스트의 모든 IPv4로 되어있는 호스트에 접근이 가능하다는 것을 뜻한다.

 

Problem2: 방화벽 정책을 설정하자

단순히 포트만 뚫었다고 외부서버와 연결 가능한 것이 아니다.

엄연히 방화벽이라는게 존재하고, 특정 ip&port는 통과 가능하게 방화벽 정책을 설정하는 것이 필요했다.

 

방화벽은 전달되는 패킷의 정보(프로토콜, 포트, IP 주소 정보)를 바탕으로 전송을 허용 또는 거부하는 시스템이다.

이때 외부 네트워크에서 발생해 내부 네트워크로 패킷이 전달되는 것을 Inbound 라고 하며,

내부 네트워크에서 발생해 외부 네트워크로 패킷이 전달되는 것을 Outbound 트래픽이라고 한다.


이때 방화벽의 Inbound, Outbound 규칙은 패킷의 전달 방향(내부, 외부)과 통신 프로토콜, 포트, IP 주소를 기준으로

트래픽을 허용하거나 거부하는 규칙을 의미한다.

 

가비아: 국내 1위

 

customer.gabia.com

 

일단 Stable Diffusion 서버에서 먼저 작업을 해줬다.

 

인바운드 규칙으로 아래와 같이 8080번 포트가 열렸음을 알 수 있다.

 

그 다음으로 Ncloud Platform Console 에서 ACG 라는 것을 설정해줘야 한다.

 

ACG(Access Control Group)는 서버 간 네트워크 접근 제어 및 관리를 할 수 있는 IP/Port 기반 필터링 방화벽 서비스 를 말한다.

 

ACG

 

guide.ncloud-docs.com

보안상 캡처는 안했지만 프로토콜(TCP), 접근소스(접근할 WAS ip), 허용포트(port) 를 설정해주면 됐다.

 

 

Result: curl로 api를 쏴보자

curl -X POST -H "Content-Type: application/json" \
-d '{"prompt": "cute snake cartoon style", "negative_prompt": "cute", "steps": 25, "sampler_index": "Euler", "width": 512, "height": 512, "cfg_scale": 7, "seed": -1}' \
http://{stable diffusion server ip}/sdapi/v1/txt2img

위 코드를 was서버 내부에서 curl 호출하니 성공적으로 base64형태의 response를 받는 것을 알 수 있다!

 

 

Insight

방화벽 정책을 다루게 되면서, 서로 다른 서버 간 통신을 수립할 때 보안 측면이 얼마나 중요한지 깨달았다. 이번 경험을 통해, ACG의 개념과 인바운드와 아웃바운드 규칙을 설정하고 방법을 배웠고 네트워크 통신을 이해하는 것이 정말 중요함을 다시 한번 느꼈다.
외부와 통신이 가능하도록 로컬 주소를 외부 주소로 변환 가능하게 하기 위해서는, 당연히 IIS와 같은 웹서버 프로그램을 통해 구축해야 한다고 생각했지만
 적절한 방화벽 설정 등으로도 외부와 통신이 가능하다는 것을 알게 되었다.

 stable diffusion이라는 기술을 서버에 탑재해서, 외부 서버와 http통신 가능하도록 해 curl을 통해 base64 형태의 응답을 성공적으로 받았을 때는 기울인 노력이 확인되는 뜻 깊은 순간이었다.