Python (Gradio)으로 Cloud Run 시작

1. 소개

96d07289bb51daa7.png

Cloud Run은 HTTP 요청을 사용하여 호출 가능한 스테이트리스(Stateless) 컨테이너를 실행할 수 있는 관리형 컴퓨팅 플랫폼입니다. Cloud Run은 Knative 오픈소스 프로젝트를 기반으로 빌드되므로 여러 플랫폼에 워크로드를 자유롭게 이동할 수 있습니다. Cloud Run은 서버리스이므로 인프라 관리가 필요 없습니다. 따라서 개발자가 본연의 업무인 애플리케이션 개발에 집중할 수 있습니다.

이 튜토리얼의 목표는 간단한 Gradio 웹 애플리케이션을 만들어 Cloud Run에 배포하는 것입니다.

학습할 내용

  • Gradio 'Hello World' 애플리케이션을 만드는 방법
  • 배포 전에 Gradio 앱을 실행하여 애플리케이션을 테스트합니다.
  • Cloud 빌드팩과 requirements.txtgradio가 있으면 Dockerfile이 필요하지 않은 이유
  • Gradio 애플리케이션을 Cloud Run에 배포하는 방법

2. 설정 및 요건

자습형 환경 설정

  1. Google Cloud 콘솔에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로 PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다.
  • 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 프로젝트를 삭제하면 됩니다. Google Cloud 신규 사용자는 300달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 튜토리얼에서는 Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다.

Cloud Shell 활성화

  1. Cloud 콘솔에서 Cloud Shell 활성화를 클릭합니다.

3c1dabeca90e44e5.png

Cloud Shell을 처음 시작하는 경우 Cloud Shell에 대한 설명이 포함된 중간 화면이 표시됩니다. 중간 화면이 표시되면 계속을 클릭합니다.

9c92662c6a846a5c.png

Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.

9f0e51b578fecce5.png

이 가상 머신에는 필요한 개발 도구가 모두 로드되어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저로 수행할 수 있습니다.

Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 설정된 것을 확인할 수 있습니다.

  1. Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list

명령어 결과

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project

명령어 결과

[core]
project = <PROJECT_ID>

또는 다음 명령어로 설정할 수 있습니다.

gcloud config set project <PROJECT_ID>

명령어 결과

Updated property [core/project].

3. API 사용 설정

Cloud Shell에서 Artifact Registry, Cloud Build, Cloud Run API를 사용 설정합니다.

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com

그러면 다음과 비슷한 성공 메시지가 출력됩니다.

Operation "operations/..." finished successfully.

이제 작업을 시작하고 애플리케이션을 작성할 준비가 되었습니다.

4. 애플리케이션 작성

이 단계에서는 HTTP 요청에 응답하는 간단한 Gradio Python 애플리케이션을 빌드합니다.

작업 디렉터리

Cloud Shell을 사용하여 helloworld-gradio라는 작업 디렉터리를 만들고 전환합니다.

mkdir ~/helloworld-gradio && cd ~/helloworld-gradio

app.py

app.py이라는 파일을 만듭니다.

touch app.py

원하는 명령줄 편집기 (nano, vim, emacs)를 사용하거나 Cloud Shell 편집기 버튼을 클릭하여 파일을 수정합니다.

10af7b1a6240e9f4.gif

Cloud Shell 편집기로 파일을 직접 수정하려면 다음 명령어를 사용하세요.

cloudshell edit app.py

app.py

import gradio as gr

def hello(name, intensity):
    """Return a friendly greeting."""
    return "Hello " + name + "!" * int(intensity)

demo = gr.Interface(
    fn=hello,
    inputs=["text", "slider"],
    outputs=["text"],
    title="Hello World 👋🌎",
    description=("Type your name below and hit 'Submit', and try the slider to "
                 "make the greeting louder!"),
    theme="soft",
    flagging_mode="never",
)

demo.launch(server_port=8080)

이 코드는 HTTP GET 요청에 친근한 메시지로 응답하는 기본 웹 서비스를 만듭니다.

requirements.txt

requirements.txt라는 파일을 추가하여 종속 항목을 정의합니다.

touch requirements.txt

Cloud Shell 편집기로 파일을 직접 수정하려면 다음 명령어를 사용하세요.

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/gradio
gradio==5.39.0

Gradio 애플리케이션을 배포할 준비가 되었지만 먼저 테스트해 보겠습니다.

5. 애플리케이션 테스트

애플리케이션을 테스트하려면 Cloud Shell에 사전 설치된 uv (Python의 매우 빠른 패키지 및 프로젝트 관리자)를 사용하세요.

애플리케이션을 테스트하려면 가상 환경을 만드세요.

uv venv

종속 항목 설치

uv pip install -r requirements.txt

uv run gradio app.py를 사용하여 Gradio CLI로 개발 모드에서 애플리케이션을 시작합니다.

uv run gradio app.py

기본적으로 이 기능은 코드를 변경하고 저장할 때마다 브라우저에서 인터페이스를 자동으로 새로고침하는 핫 리로드 기능을 사용 설정합니다.

로그에 Gradio 앱이 실행 중인 것으로 표시됩니다.

Watching: '/home/user/helloworld-gradio'

* Running on local URL:  http://127.0.0.1:8080
* To create a public link, set `share=True` in `launch()`.

Cloud Shell 창에서 Web Preview 아이콘을 클릭하고 Preview on port 8080을 선택합니다.

6c9ff9e5c692c58e.gif

그러면 브라우저 창이 열리고 Hello World 👋🌎 제목이 표시됩니다.

helloworld-gradio-app.png

왼쪽 텍스트 영역에 이름을 입력하고 제출 버튼을 클릭해 보세요.

슬라이더를 조정하고 '제출' 버튼을 클릭하여 더 큰 인사말을 확인해 보세요.

완료되면 기본 Cloud Shell 세션으로 돌아가 CTRL+C를 사용하여 Gradio 앱을 중지합니다.

애플리케이션이 예상대로 작동합니다. 이제 배포할 시간입니다.

6. Cloud Run에 배포

Cloud Run은 리전을 기반으로 합니다. 즉, Cloud Run 서비스를 실행하는 인프라가 특정 리전에 위치해 있으며, 해당 리전 내의 모든 영역에서 중복으로 사용할 수 있도록 Google이 관리합니다. 배포에 사용할 리전을 정의합니다. 예를 들면 다음과 같습니다.

REGION=europe-west1

아직 작업 디렉터리에 있는지 확인합니다.

ls

그러면 다음 파일이 표시됩니다.

app.py  requirements.txt

배포하기 전에 .venv/이 포함된 .gcloudignore 파일을 만듭니다. 이렇게 하면 로컬 테스트 중에 uv에서 생성된 가상 환경이 Cloud Run 배포에 포함되지 않습니다.

다음 명령어를 사용하여 .gcloudignore을 만듭니다.

echo ".venv/" > .gcloudignore

Cloud Run에 애플리케이션을 배포합니다.

gcloud run deploy helloworld-gradio \
  --source . \
  --region $REGION \
  --allow-unauthenticated
  • --allow-unauthenticated 옵션을 사용하면 서비스를 공개적으로 사용할 수 있습니다. 인증되지 않은 요청을 방지하려면 대신 --no-allow-unauthenticated을 사용하세요.

처음에는 Artifact Registry 저장소를 만들라는 메시지가 표시됩니다. Enter를 탭하여 확인합니다.

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

이렇게 하면 소스 코드가 Artifact Registry 저장소에 업로드되고 컨테이너 이미지가 빌드됩니다.

Building using Buildpacks and deploying container ...
* Building and deploying new service... Building Container.           
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

그런 다음 배포가 완료될 때까지 잠시 기다립니다. 성공하면 명령줄에 다음과 같은 서비스 URL이 표시됩니다.

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

다음 명령어를 사용하여 서비스 URL을 가져올 수 있습니다.

SERVICE_URL=$( \
  gcloud run services describe helloworld-gradio \
  --region $REGION \
  --format "value(status.address.url)" \
)
echo $SERVICE_URL

다음과 같이 표시됩니다.

https://helloworld-gradio-PROJECTHASH-REGIONID.a.run.app

이제 웹브라우저에서 서비스 URL을 열어 애플리케이션을 사용할 수 있습니다.

helloworld-gradio.gif

축하합니다. Cloud Run에 애플리케이션을 배포했습니다. Cloud Run은 수신된 요청을 처리하기 위해 컨테이너 이미지를 자동 및 수평 확장한 다음 수요가 감소하면 축소합니다. 이 Cloud Run 서비스의 요청 처리 중에 소비된 CPU, 메모리, 네트워킹에 대해서만 비용을 지불하면 됩니다.

7. 삭제

Cloud Run에서는 서비스를 사용하지 않을 때 비용이 청구되지 않지만 Artifact Registry에 컨테이너 이미지를 저장하는 데 요금이 부과될 수 있습니다. 비용이 청구되지 않도록 저장소를 삭제하거나 Cloud 프로젝트를 삭제할 수 있습니다. Cloud 프로젝트를 삭제하면 해당 프로젝트 내에서 사용되는 모든 리소스에 대한 청구가 중단됩니다.

컨테이너 이미지 저장소를 삭제하려면 다음 단계를 따르세요.

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

Cloud Run 서비스를 삭제하려면 다음 단계를 따르세요.

gcloud run services delete helloworld-gradio \
  --region $REGION

Google Cloud 프로젝트를 삭제하려면 다음 단계를 따르세요.

  1. 현재 프로젝트 ID를 가져옵니다.
PROJECT_ID=$(gcloud config get-value core/project)
  1. 삭제하려는 프로젝트가 맞는지 확인하세요.
echo $PROJECT_ID
  1. 프로젝트를 삭제합니다.
gcloud projects delete $PROJECT_ID

8. 축하합니다.

96d07289bb51daa7.png

'Hello World' Gradio 웹 애플리케이션을 만들어 Cloud Run에 배포했습니다.

학습한 내용

  • Gradio 'Hello World' 애플리케이션을 만드는 방법
  • 배포 전에 Gradio 앱을 실행하여 애플리케이션을 테스트합니다.
  • Cloud 빌드팩과 requirements.txtgradio가 있으면 Dockerfile이 필요하지 않은 이유
  • Gradio 애플리케이션을 Cloud Run에 배포합니다.

자세히 알아보기