Cloud Run 작업에서 FFmpeg를 사용한 GPU 가속 동영상 트랜스코딩

이 튜토리얼에서는 Cloud Run 작업을 사용하여 우선순위가 낮은 오프라인 동영상을 트랜스코딩하는 방법을 설명합니다.

목표

이 튜토리얼에서 학습할 내용은 다음과 같습니다.

비용

이 문서에서는 비용이 청구될 수 있는 Google Cloud구성요소( )를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용합니다.

Google Cloud 신규 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.

  3. 외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.

  4. gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.

    gcloud init
  5. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Install the Google Cloud CLI.

  8. 외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.

  9. gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.

    gcloud init
  10. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  11. Verify that billing is enabled for your Google Cloud project.

  12. Enable the Cloud Run, Artifact Registry, and Cloud Build APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable run.googleapis.com cloudbuild.googleapis.com artifactregistry.googleapis.com
  13. 리전을 환경 변수로 설정합니다.
    export REGION=REGION
  14. 서비스 계정을 만듭니다.
    gcloud iam service-accounts create video-encoding
  15. 이 튜토리얼을 완료하려면 할당량 및 시스템 한도 페이지의 Cloud Run Admin API 아래에서 Total Nvidia L4 GPU allocation without zonal redundancy, per project per region을 요청합니다. 또는 Cloud Run 서비스를 배포하여 리전에 3개의 nvidia-l4 GPU 할당량(영역 중복 사용 안함)을 자동으로 부여받을 수 있습니다.
  16. 필요한 역할

    튜토리얼을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

    역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

    커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

    역할 부여

    콘솔

    1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

      IAM으로 이동
    2. 프로젝트를 선택합니다.
    3. 액세스 권한 부여를 클릭합니다.
    4. 새 주 구성원 필드에 사용자 식별자를 입력합니다. 일반적으로 Cloud Run 서비스를 배포하는 데 사용되는 이메일 주소입니다.

    5. 역할 선택 목록에서 역할을 선택합니다.
    6. 역할을 추가로 부여하려면 다른 역할 추가를 클릭하고 각 역할을 추가합니다.
    7. 저장을 클릭합니다.

    gcloud

    프로젝트에서 계정에 필요한 IAM 역할을 부여하려면 다음 안내를 따르세요.

         gcloud projects add-iam-policy-binding PROJECT_ID \
             --member=PRINCIPAL \
             --role=ROLE
         

    다음과 같이 바꿉니다.

    • PROJECT_NUMBER를 Google Cloud 프로젝트 번호로 바꿉니다.
    • PROJECT_ID를 Google Cloud 프로젝트 ID로 바꿉니다.
    • PRINCIPAL을 바인딩을 추가할 계정으로 바꿉니다. 일반적으로 Cloud Run 서비스를 배포하는 데 사용되는 이메일 주소입니다.
    • ROLE을 배포자 계정에 추가할 역할로 바꿉니다.

    애플리케이션 준비

    사용할 코드 샘플을 검색하려면 다음 안내를 따르세요.

    1. 샘플 저장소를 로컬 머신에 클론합니다.

      git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
      
    2. Cloud Run 샘플 코드가 포함된 디렉터리로 변경합니다.

      cd cloud-run-samples/jobs-video-encoding
      

    Cloud Storage 버킷 만들기

    처리할 동영상을 저장하고 인코딩 결과를 저장하려면 다음 두 개의 Cloud Storage 버킷을 만듭니다.

    1. 처리하기 전에 동영상을 저장할 버킷을 만듭니다.

      gcloud storage buckets create gs://preprocessing-PROJECT_ID \
        --location LOCATION
      

      다음을 바꿉니다.

      • PROJECT_ID: 프로젝트 ID입니다.
      • LOCATION: Cloud Storage 위치입니다.
    2. 서비스 계정에 이 버킷에서 읽을 수 있는 액세스 권한을 부여합니다.

      gcloud storage buckets add-iam-policy-binding gs://preprocessing-PROJECT_ID \
        --member="serviceAccount:video-encoding@PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/storage.objectViewer"
      

      PROJECT_ID를 프로젝트 ID로 바꿉니다.

    3. 처리 후 트랜스코딩된 동영상을 저장할 버킷을 만듭니다.

      gcloud storage buckets create gs://transcoded-PROJECT_ID \
        --location LOCATION
      

      다음을 바꿉니다.

      • PROJECT_ID: 프로젝트 ID입니다.
      • LOCATION: Cloud Storage 위치입니다.
    4. 서비스 계정에 이 버킷에서 읽고 쓸 수 있는 액세스 권한을 부여합니다.

      gcloud storage buckets add-iam-policy-binding gs://transcoded-PROJECT_ID \
        --member="serviceAccount:video-encoding@PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/storage.objectAdmin"
      

      PROJECT_ID를 프로젝트 ID로 바꿉니다.

    Cloud Run 작업 배포

    샘플 저장소의 Dockerfile을 사용하여 Cloud Run 작업을 만들고 만든 버킷을 마운트합니다.

    1. 샘플 디렉터리로 이동합니다.

      cd cloud-run-samples/jobs-video-encoding
      

    1. 기본 Cloud Run 레지스트리가 아직 없으면 Artifact Registry를 만듭니다.

      gcloud artifacts repositories create cloud-run-source-deploy \
        --repository-format=docker \
        --location LOCATION
      

      LOCATION을 레지스트리 위치의 이름으로 바꿉니다.

    2. 컨테이너 이미지를 빌드합니다.

      gcloud builds submit \
        --tag LOCATION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/IMAGE_NAME \
        --machine-type E2-HIGHCPU-32
      

      다음을 바꿉니다.

      • PROJECT_ID: 프로젝트 ID입니다.
      • LOCATION: 레지스트리 위치의 이름입니다.
      • IMAGE_NAME: 컨테이너 이미지의 이름입니다(예: ffmpeg-image).

      Cloud Run은 더 큰 머신 유형을 사용하여 빌드 시간을 줄입니다.

    3. 작업을 배포합니다.

      gcloud run jobs create video-encoding-job \
          --image LOCATION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/IMAGE_NAME \
          --region REGION \
          --memory 32Gi \
          --cpu 8 \
          --gpu 1 \
          --gpu-type nvidia-l4 \
          --no-gpu-zonal-redundancy \
          --max-retries 1 \
          --service-account video-encoding@PROJECT_ID.iam.gserviceaccount.com \
          --add-volume=name=input-volume,type=cloud-storage,bucket=preprocessing-PROJECT_ID,readonly=true \
          --add-volume-mount=volume=input-volume,mount-path=/inputs \
          --add-volume=name=output-volume,type=cloud-storage,bucket=transcoded-PROJECT_ID \
          --add-volume-mount=volume=output-volume,mount-path=/outputs
      

      다음을 바꿉니다.

      • PROJECT_ID: 프로젝트 ID입니다.
      • REGION: 리전의 이름입니다. 참고: GPU 할당량이 있는 리전과 동일해야 합니다.
      • IMAGE_NAME: 컨테이너 이미지의 이름입니다(예: ffmpeg-image).

      이 프로젝트에서 소스를 처음 배포하는 경우 Cloud Run에서 기본 Artifact Registry 저장소를 만들라는 메시지가 표시됩니다.

    작업 실행

    작업을 실행하려면 다음 단계를 따르세요.

    1. 인코딩할 예시 동영상을 업로드합니다.

      gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
      
    2. 작업을 실행합니다.

      gcloud run jobs execute video-encoding-job  \
          --region REGION \
          --wait \
          --args="cat.mp4,encoded_cat.mp4,-vcodec,h264_nvenc,-cq,21,-movflags,+faststart"
      

      entrypoint.sh 파일에는 입력 파일, 출력 파일, FFmpeg에 전송할 인수가 필요합니다.

    3. Cloud Run 로그를 검토하여 동영상이 트랜스코딩되었는지 확인합니다.

      gcloud run jobs logs read video-encoding-job --region REGION
      
    4. 트랜스코딩된 동영상을 다운로드합니다.

      gcloud storage cp gs://transcoded-PROJECT_ID/encoded_cat.mp4 .
      

    삭제

    Google Cloud 계정에 추가 비용이 청구되지 않도록 하려면 이 빠른 시작으로 배포한 모든 리소스를 삭제합니다.

    저장소 삭제

    Cloud Run은 작업이 실행되는 시간에 대해서만 비용을 청구합니다. 하지만 Artifact Registry에 컨테이너 이미지를 저장하는 요금이 청구될 수 있습니다. Artifact Registry 저장소를 삭제하려면 Artifact Registry 문서의 저장소 삭제 단계를 따르세요.

    작업 삭제

    Cloud Run 작업은 작업 태스크가 실행될 때만 비용이 발생합니다. Cloud Run 작업을 삭제하려면 다음 단계 중 하나를 따르세요.

    콘솔

    작업을 삭제하려면 다음 안내를 따르세요.

    1. Google Cloud 콘솔에서 Cloud Run으로 이동합니다.

      Cloud Run으로 이동

    2. 작업 목록에서 삭제할 작업을 찾은 다음 체크박스를 클릭하여 선택합니다.

    3. 삭제를 클릭합니다. 그러면 진행 중인 모든 작업 실행과 실행 중인 모든 컨테이너 인스턴스가 종료됩니다.

    gcloud

    작업을 삭제하려면 다음 명령어를 실행하세요.

    gcloud run jobs delete JOB_NAME

    JOB_NAME을 작업 이름으로 바꿉니다.

    테스트 프로젝트 삭제

    Google Cloud 프로젝트를 삭제하면 해당 프로젝트의 모든 리소스에 대한 청구가 중단됩니다. 프로젝트의 모든 Google Cloud 리소스를 해제하려면 다음 단계를 따르세요.

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    다음 단계