
생성형 AI 기술의 급속한 발전으로 기업들은 데이터를 더 효과적으로 활용하고 혁신적인 애플리케이션을 개발할 수 있게 되었습니다. 그러나 이러한 기술을 실제 비즈니스에 적용하기 위해서는 적절한 도구와 프레임워크가 필요합니다. 이 글에서는 Hugging Face 모델과 Databricks 플랫폼을 활용해 생성형 AI 애플리케이션을 구축하는 전체 과정을 살펴보겠습니다.
생성형 AI가 비즈니스를 변화시키는 방법
생성형 AI는 텍스트, 이미지, 비디오, 코드 등 새로운 콘텐츠를 생성할 수 있는 인공지능 기술입니다. 기업들은 이 기술을 활용하여 고객 경험을 개선하고, 비즈니스 프로세스를 자동화하며, 새로운 제품과 서비스를 개발하고 있습니다.
Databricks는 지난해 Databricks Apps를 출시하여 개발자들이 Databricks 플랫폼에서 직접 애플리케이션을 개발하고 배포할 수 있는 환경을 제공했습니다. 이는 데이터와 AI를 통합하여 기업이 쉽고 안전하게 생성형 AI 애플리케이션을 구축할 수 있는 완벽한 솔루션을 제공합니다.
Databricks 생성형 AI 애플리케이션 구축 단계
생성형 AI 애플리케이션을 구축하기 위한 전체 프로세스는 다음과 같은 단계로 이루어집니다:
- Unity Catalog로 이미지를 볼륨에 로드
- Hugging Face 모델을 MLflow로 Unity Catalog에 등록
- Model Serving으로 모델 배포
- Databricks Apps 개발 및 배포
이제 각 단계를 자세히 살펴보겠습니다.
1. Unity Catalog 볼륨에 이미지 로드하기
Databricks에서 볼륨(Volume)은 Unity Catalog의 객체로, 테이블 형식이 아닌 데이터(파일, 이미지, 문서 등)를 저장하기 위한 공간입니다. 조직이 다양한 유형의 데이터를 안전하게 저장하고 공유할 수 있게 해주죠.
우리의 예제에서는 Hugging Face에서 이미지를 다운로드하여 Databricks 볼륨에 저장합니다:
import diffusers
from diffusers.utils import load_image, make_image_grid
from databricks.sdk import WorkspaceClient
from io import BytesIO
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/cat.png")
# PIL 이미지 객체를 바이트로 변환
w = WorkspaceClient()
img_byte_arr = BytesIO()
init_image.save(img_byte_arr, format='PNG')
img_byte_arr = img_byte_arr.getvalue()
# 볼륨에 목적지 경로 정의
destination_path = "/Volumes////image_submitted.PNG"
# 이미지를 볼륨에 업로드
w.files.upload(destination_path, img_byte_arr, overwrite=True)
2. MLflow를 사용하여 Hugging Face 모델을 Unity Catalog에 등록하기
다음 단계는 프롬프트와 입력 이미지를 기반으로 이미지를 생성할 수 있는 Hugging Face 모델을 선택하는 것입니다. 우리는 Kandinsky 2-2 디코더 모델을 선택했습니다.
MLflow의 pyfunc
기능을 사용하여 커스텀 클래스를 만들고, 이를 모델 래퍼로 활용합니다:
import mlflow
class StableDiffusionImgToImg(mlflow.pyfunc.PythonModel):
def __init__(self):
self.pipe = None
def load_context(self, context):
import torch
from diffusers import AutoPipelineForImage2Image
# 올바른 장치에서 모델을 초기화
self.pipe = AutoPipelineForImage2Image.from_pretrained(
"kandinsky-community/kandinsky-2-2-decoder", torch_dtype=torch.float16, use_safetensors=True
)
self.pipe = self.pipe.to("cuda")
def image_to_base64(self, image):
from io import BytesIO
import base64
buffered = BytesIO()
image.save(buffered, format="JPEG")
return base64.b64encode(buffered.getvalue()).decode('utf-8')
def base64_to_image(self, base64_string):
from io import BytesIO
import base64
import PIL
from PIL import Image
# base64 문자열 디코딩
img_data = base64.b64decode(base64_string)
# 디코딩된 데이터로 BytesIO 객체 생성
buffer = BytesIO(img_data)
# PIL을 사용하여 이미지 열기
image = Image.open(buffer)
return image
def predict(self, context, model_input):
prompt = model_input["prompt"][0]
init_image = self.base64_to_image(model_input["init_image"][0])
negative_prompt = model_input["negative_prompt"][0]
strength = model_input["strength"][0]
guidance_scale = model_input["guidance_scale"][0]
image = self.pipe(prompt, negative_prompt=negative_prompt, image=init_image, strength=strength, guidance_scale=guidance_scale).images[0]
return self.image_to_base64(image)
이 클래스에는 이미지를 인코딩하고 디코딩하기 위한 두 가지 함수(image_to_base64
와 base64_to_image
)가 추가되었습니다. 이는 배포된 모델에 입력을 제출할 때 PIL 이미지를 JSON으로 파싱할 수 없기 때문에 필요합니다.
다음으로, 모델을 Unity Catalog에 등록합니다:
mlflow.set_registry_uri('databricks-uc')
def load_image_from_volume(volume_path):
import PIL
from PIL import Image
with Image.open(volume_path) as img:
return img.convert("RGB")
def image_to_base64(image):
buffered = BytesIO()
image.save(buffered, format="JPEG")
return base64.b64encode(buffered.getvalue()).decode('utf-8')
input_schema = Schema([ColSpec(DataType.string, "prompt"),
ColSpec(DataType.string, "negative_prompt"),
ColSpec(DataType.string, "init_image"),
ColSpec(DataType.float, "strength"),
ColSpec(DataType.float, "guidance_scale")])
output_schema=Schema([ColSpec(DataType.string, "image")])
signature = ModelSignature(inputs=input_schema,outputs=output_schema)
image = image_to_base64(load_image_from_volume("/Volumes/<catalog>/<schema>/<volume_name>/image_submitted.jpg"))
# 입력 예제 정의
input_example=pd.DataFrame({
"prompt":["cat grey bearded wizard, detailed, fantasy, cute, adorable, animated, cgi, entertainment, 8K"],
"negative_prompt" : ["deformed, ugly, blurry, low-quality, low-resolution"],
"init_image" : [image],
"strength" : [0.1],
"guidance_scale" : [18.0]
})
# 모델 로깅 및 등록
with mlflow.start_run() as run:
mlflow.pyfunc.log_model(
"model",
python_model=StableDiffusionImgToImg(),
input_example=input_example,
signature=signature,
registered_model_name="<catalog>.<schema>.kandinsky-model",
pip_requirements=["transformers", "torch", "accelerate", "diffusers", "huggingface_hub==0.23.0", "invisible-watermark>=0.2.0", "transparent-background", "opencv-python-headless"]
)
3. Model Serving으로 모델 배포하기
Databricks의 Model Serving은 머신러닝 모델을 REST API로 배포할 수 있는 완전 관리형 서비스입니다. 이를 통해 인프라나 스케일링에 대한 걱정 없이 실시간 예측을 쉽게 접근할 수 있습니다.
Unity Catalog에 등록된 모델을 두 가지 방법으로 배포할 수 있습니다:
- UI를 통한 수동 배포: Unity Catalog에서 모델로 이동하여 “serve this model” 클릭
- API를 통한 배포:
from mlflow.deployments import get_deploy_client
client = get_deploy_client("databricks")
endpoint = client.create_endpoint(
name="kandinsky",
config={
"served_entities": [{
"entity_name": "<catalog>.<schema>.kandinsky-model",
"entity_version": "1",
"workload_size": "Small",
"scale_to_zero_enabled": True
}],
"traffic_config": {
"routes": [{
"served_model_name": "kandinsky-1",
"traffic_percentage": 100
}]
}
}
)
모델 서빙 엔드포인트가 구축되고 실행되면, “Model Serving” 섹션으로 이동하여 연결 세부 정보를 확인할 수 있습니다.
4. Databricks Apps 개발

Databricks Apps는 Databricks 플랫폼 내에서 웹 애플리케이션을 쉽게 생성하고 배포할 수 있는 새로운 기능입니다. 이를 통해 개발자들은 별도의 인프라 관리 없이 Databricks에 이미 존재하는 데이터, 모델 및 거버넌스를 활용하여 애플리케이션을 구축할 수 있습니다.
Databricks Apps를 사용하면 Dash, Shiny, Gradio, Streamlit, Flask 등 선호하는 프레임워크를 사용하여 앱 프론트엔드를 구축할 수 있습니다.
앱 생성 과정:
- Databricks 플랫폼의 Compute > Apps로 이동
- “Create App” 클릭
- 사용자 프로필로 이동하여 앱용 새 폴더 생성
- 이 폴더에 다음을 생성:
- main.py: 모델 서빙 엔드포인트 액세스를 위한 PAT(개인 액세스 토큰)을 사용
- requirements.txt: 코드 실행에 필요한 외부 라이브러리와 패키지 목록
백엔드: Unity Catalog 볼륨과의 상호작용 처리
다음 코드는 Databricks 볼륨에서 이미지 파일을 검색하는 query_image_from_volume()
함수를 정의합니다:
import io
import os
import PIL
from io import BytesIO
from databricks.sdk import WorkspaceClient
VOLUME_URI = os.getenv("VOLUME_URI", "/Volumes/<catalog>/<schema>/<volume>")
w = WorkspaceClient()
def query_image_from_volume():
image_name="image_submitted.JPG"
image_path = os.path.join(VOLUME_URI, image_name)
# 환경 변수 설정
os.environ["TOKEN"] = w.dbutils.secrets.get(scope="<scope-name>", key="<scope-secret>")
response = w.files.download(image_path)
image_data = io.BytesIO(response.contents.read())
with Image.open(image_data) as img:
return img.convert("RGB")
모델 엔드포인트 통합: AI 모델에 예측 쿼리하기
다음으로, 우리는 모델 엔드포인트에 요청을 준비하고 전송하는 query_model_endpoint
함수를 정의합니다:
def query_model_endpoint(prompt):
img_base64 = image_to_base64(query_image_from_volume())
input_example=pd.DataFrame({
"prompt":[description_prompt],
"negative_prompt" : [""],
"init_image" : [img_base64],
"strength" : [0.1],
"guidance_scale" : [18]
})
# Model Serving Endpoint용:
url = 'https://<your-workspace-url>/serving-endpoints/kandinsky/invocations'
headers = {'Authorization': f'Bearer {os.environ.get("TOKEN")}', 'Content-Type': 'application/json'}
ds_dict = {'dataframe_split': input_example.to_dict(orient='split')}
data_json = json.dumps(ds_dict, allow_nan=True)
response = requests.request(method='POST', headers=headers, url=url, data=data_json)
final_img = base64_to_image(response.json()['predictions'])
return final_img.convert("RGB")
모델의 URL은 배포된 모델을 클릭하여 Model Serving UI에서 찾을 수 있습니다.
프론트엔드 개발: 사용자 인터페이스 구축
이 섹션에서는 사용자 입력을 기반으로 이미지를 변환하는 Gradio 인터페이스를 생성합니다:
import gradio as gr
with gr.Blocks() as demo:
with gr.Row():
gr.set_static_paths(paths=["static/DatabricksLogo_full3.png"])
gr.HTML(value='<img src="/file=static/DatabricksLogo_full3.png", width="450", class="Databricks_logo"">', elem_id="Databricks Logo")
gr.Markdown(value="# Picture Yourself in Generative AI")
with gr.Row():
inp = gr.Textbox(label="Character", placeholder="Enter the Character:")
with gr.Row():
image_ouput1 = gr.Image(value=query_image_from_volume, interactive=False, label="Before")
image_output2 = gr.Image(label="After", show_download_button=True)
with gr.Row():
btn = gr.Button("Run")
clear_button = gr.ClearButton([image_ouput1, image_output2, inp])
btn.click(fn=query_model_endpoint, inputs=[inp], outputs=image_output2)
웹앱에 이미지나 로고를 추가하려면 같은 디렉토리 내에 “static” 폴더를 만들어 이미지를 저장할 수 있습니다.
배포: 앱 실행하기
Gradio 애플리케이션 스크립트 끝에 다음 코드를 추가합니다:
if __name__ == "__main__":
demo.launch()
이 코드는 스크립트가 직접 실행될 때(__name__ == "__main__"
) Gradio 인터페이스를 실행합니다. 초기에는 로컬 호스트에 배포되지만, 공개 URL을 통해 접근하려면 launch()
에 share=True
를 추가하면 됩니다.
Databricks Apps 권한 설정
앱 배포 전에 서비스 프린시펄에 필요한 권한을 부여해야 합니다. 서비스 프린시펄 이름은 앱 UI의 “App resources” 섹션에서 확인할 수 있습니다.
서비스 프린시펄에 다음 권한을 부여합니다:
- 개인 액세스 토큰:
- 서비스 프린시펄이 등록된 토큰에 액세스할 수 있도록 Can Read 권한 부여
- 볼륨 액세스:
- 볼륨에 저장된 이미지에 액세스할 수 있도록 READ_VOLUME 권한 할당
- 모델 서빙 엔드포인트:
- Model Serving에서 이전에 배포된 모델에 대한 CAN USE 권한 제공
WebApp을 배포하려면 WebApp UI로 이동하여 Deploy를 클릭한 다음, main.py가 있는 폴더를 선택합니다. 이렇게 하면 코드가 격리된 컨테이너에 배포됩니다.
배포 과정이 완료되고 상태 표시기에 “Running“이 표시되면 애플리케이션이 완전히 배포되고 작동합니다.
시작하세요
이처럼 Databricks Apps를 활용한 생성형 AI 애플리케이션 구축 과정은 명확하고 간단합니다. 대부분의 작업이 Databricks Intelligence Platform 내에서 이루어지므로 복잡성과 개발 시간이 크게 줄어듭니다. 이 접근 방식을 통해 전통적인 인프라 관리의 어려움 없이 모델을 서버리스 웹 애플리케이션으로 빠르고 간단하게 배포할 수 있습니다.
이 튜토리얼이 도움이 되었기를 바랍니다. 이러한 기능을 더 탐색하고 AI 이니셔티브를 가속화하는 방법을 확인해 보세요. 또한 모델을 미세 조정하여 앱을 다음 단계로 발전시키고, 특정 요구 사항에 맞게 앱을 더욱 개인화할 수 있습니다. 이러한 사용자 지정을 통해 조직의 특정 요구에 맞는 진정한 맞춤형 AI 솔루션을 만들 수 있으며, 이는 비즈니스 프로세스를 혁신하고 혁신을 주도할 수 있습니다.
여러분만의 생성형 AI 웹 앱을 구축하는 데 성공하시길 바라며, 여러분이 만들 멋진 생성형 AI 웹 앱을 볼 날을 기대합니다!
개인적인 견해와 심층 분석
생성형 AI는 기업의 디지털 트랜스포메이션을 가속화하는 중요한 촉매제가 되고 있습니다. 하지만 많은 기업들이 이 기술을 실제 비즈니스 환경에 적용하는 데 어려움을 겪고 있습니다. 데이터 과학자들은 모델 개발에 집중하지만, 그 모델을 실제 애플리케이션으로 전환하는 과정은 복잡하고 많은 리소스가 필요합니다.
Databricks와 Hugging Face의 통합은 이러한 문제를 해결하는 데 큰 도움이 됩니다. 데이터 레이크하우스 아키텍처와 최첨단 ML 모델의 결합은 생성형 AI의 개발부터 배포까지 전체 라이프사이클을 간소화합니다. 특히 주목할 만한 점은 Databricks Apps가 데이터 과학자와 ML 엔지니어가 복잡한 웹 개발 지식 없이도 직관적인 사용자 인터페이스를 구축할 수 있게 해준다는 것입니다.
기업들이 생성형 AI 전략을 수립할 때 고려해야 할 몇 가지 핵심 사항은 다음과 같습니다:
- 거버넌스와 보안: Unity Catalog는 모델과 데이터에 대한 중앙 집중식 거버넌스를 제공하여 규정 준수 및 데이터 프라이버시 요구 사항을 충족할 수 있게 합니다.
- 확장성: Databricks의 클라우드 기반 인프라는 수요 증가에 따라 원활하게 확장할 수 있습니다.
- 협업: 데이터 엔지니어, 데이터 과학자, 비즈니스 분석가가 모두 같은 플랫폼에서 작업할 수 있어 협업이 향상됩니다.
- 지속적인 모니터링 및 업데이트: 생성형 AI 모델은 시간이 지남에 따라 품질이 저하될 수 있으므로, MLflow와 같은 도구를 사용한 모니터링과 정기적인 업데이트가 중요합니다.
앞으로 생성형 AI는 더욱 발전하여 많은 산업에 혁신을 가져올 것입니다. Databricks와 Hugging Face와 같은 도구의 조합은 기업이 이러한 기술의 잠재력을 최대한 활용할 수 있도록 도와줄 것입니다. 이미 많은 기업들이 이러한 기술을 활용하여 고객 경험을 개선하고, 운영 효율성을 높이며, 새로운 비즈니스 모델을 개발하고 있습니다.
생성형 AI의 미래는 흥미롭고 무한한 가능성으로 가득 차 있습니다. 이 기술을 빠르게 도입하고 적응하는 기업들이 디지털 경제에서 우위를 점할 것입니다.
답글 남기기