메인 콘텐츠로 건너뛰기
W&B는 W&B Multi-tenant Cloud 또는 W&B Dedicated Cloud와 같은 완전 관리형 배포 옵션을 사용할 것을 권장합니다. W&B 완전 관리형 서비스는 구성 작업이 거의 없거나 전혀 없어도 간단하고 안전하게 사용할 수 있습니다.
W&B는 AWS에 플랫폼을 배포할 때 W&B Server AWS Terraform Module을 사용할 것을 권장합니다. 시작하기 전에 Terraform의 State File을 저장하기 위해 Terraform에서 제공하는 remote backends 중 하나를 선택하는 것을 권장합니다. State File은 전체 컴포넌트를 다시 생성하지 않고도 배포를 업그레이드하거나 변경할 수 있게 해 주는 필수 리소스입니다. Terraform Module은 다음과 같은 mandatory 컴포넌트를 배포합니다:
  • Load Balancer
  • AWS Identity & Access Management (IAM)
  • AWS Key Management System (KMS)
  • Amazon Aurora MySQL
  • Amazon VPC
  • Amazon S3
  • Amazon Route53
  • Amazon Certificate Manager (ACM)
  • Amazon Elastic Load Balancing (ALB)
  • Amazon Secrets Manager
다른 배포 옵션에는 다음과 같은 선택적 컴포넌트도 포함될 수 있습니다:
  • Elastic Cache for Redis
  • SQS

사전 요구되는 권한

Terraform을 실행하는 계정은 Introduction 섹션에서 설명한 모든 구성 요소를 생성할 수 있어야 하며, IAM PoliciesIAM Roles를 생성하고 리소스에 역할을 할당할 수 있는 권한이 있어야 합니다.

일반 단계

이 항목의 단계는 이 문서에서 다루는 모든 배포 옵션에 공통적으로 적용됩니다.
  1. 개발 환경을 준비합니다.
    • Terraform을 설치합니다.
    • W&B는 버전 관리를 위해 Git 저장소를 생성할 것을 권장합니다.
  2. terraform.tfvars 파일을 생성합니다. tvfars 파일의 내용은 설치 유형에 따라 사용자 지정할 수 있지만, 최소 권장 구성은 아래 예시와 같습니다.
    namespace                  = "wandb"
    license                    = "xxxxxxxxxxyyyyyyyyyyyzzzzzzz"
    subdomain                  = "wandb-aws"
    domain_name                = "wandb.ml"
    zone_id                    = "xxxxxxxxxxxxxxxx"
    allowed_inbound_cidr       = ["0.0.0.0/0"]
    allowed_inbound_ipv6_cidr  = ["::/0"]
    eks_cluster_version        = "1.29"
    
    배포 전에 tvfars 파일에 변수를 정의했는지 확인하십시오. namespace 변수는 Terraform이 생성하는 모든 리소스 이름 앞에 붙는 문자열입니다. subdomaindomain의 조합은 W&B가 구성될 FQDN을 형성합니다. 위 예제에서 W&B FQDN은 wandb-aws.wandb.ml이며, 이 FQDN 레코드가 생성될 DNS zone_id를 사용합니다. allowed_inbound_cidrallowed_inbound_ipv6_cidr도 모두 설정해야 합니다. 이 모듈에서는 필수 입력 값입니다. 이어지는 예제는 모든 소스에서 W&B 설치로의 액세스를 허용합니다.
  3. versions.tf 파일을 생성합니다. 이 파일에는 AWS에 W&B를 배포하는 데 필요한 Terraform 및 Terraform provider 버전이 포함됩니다.
    provider "aws" {
      region = "eu-central-1"
    
      default_tags {
        tags = {
          GithubRepo = "terraform-aws-wandb"
          GithubOrg  = "wandb"
          Enviroment = "Example"
          Example    = "PublicDnsExternal"
        }
      }
    }
    
    AWS provider 구성을 위해 Terraform 공식 문서를 참고하십시오. 선택 사항이지만 강력히 권장되는 설정으로, 이 문서의 앞부분에서 언급한 원격 백엔드 구성을 추가하십시오.
  4. variables.tf 파일을 생성합니다. terraform.tfvars에서 구성한 각 옵션에 대해 Terraform은 이에 대응하는 변수 선언을 필요로 합니다.
    variable "namespace" {
      type        = string
      description = "리소스에 사용되는 이름 접두사"
    }
    
    variable "domain_name" {
      type        = string
      description = "인스턴스에 접근하는 데 사용되는 도메인 이름."
    }
    
    variable "subdomain" {
      type        = string
      default     = null
      description = "Weights & Biases UI에 접근하기 위한 서브도메인."
    }
    
    variable "license" {
      type = string
    }
    
    variable "zone_id" {
      type        = string
      description = "Weights & Biases 서브도메인을 생성할 도메인."
    }
    
    variable "allowed_inbound_cidr" {
     description = "wandb-server에 접근이 허용된 CIDR."
     nullable    = false
     type        = list(string)
    }
    
    variable "allowed_inbound_ipv6_cidr" {
     description = "wandb-server에 접근이 허용된 CIDR."
     nullable    = false
     type        = list(string)
    }
    
    variable "eks_cluster_version" {
     description = "EKS 클러스터 Kubernetes 버전"
     nullable    = false
     type        = string
    }
    
다음은 모든 Mandatory 구성 요소를 생성하고 Kubernetes Cluster에 최신 버전의 W&B를 설치하는 가장 간단한 배포 옵션 구성입니다.
  1. main.tf 생성 General Steps에서 파일을 생성한 것과 같은 디렉터리에 다음 내용을 포함한 main.tf 파일을 생성합니다:
    module "wandb_infra" {
      source  = "wandb/wandb/aws"
      version = "~>7.0"
    
      namespace   = var.namespace
      domain_name = var.domain_name
      subdomain   = var.subdomain
      zone_id     = var.zone_id
    
      allowed_inbound_cidr           = var.allowed_inbound_cidr
      allowed_inbound_ipv6_cidr      = var.allowed_inbound_ipv6_cidr
    
      public_access                  = true
      external_dns                   = true
      kubernetes_public_access       = true
      kubernetes_public_access_cidrs = ["0.0.0.0/0"]
      eks_cluster_version            = var.eks_cluster_version
    }
    
     data "aws_eks_cluster" "eks_cluster_id" {
       name = module.wandb_infra.cluster_name
     }
    
     data "aws_eks_cluster_auth" "eks_cluster_auth" {
       name = module.wandb_infra.cluster_name
     }
    
     provider "kubernetes" {
       host                   = data.aws_eks_cluster.eks_cluster_id.endpoint
       cluster_ca_certificate = base64decode(data.aws_eks_cluster.eks_cluster_id.certificate_authority.0.data)
       token                  = data.aws_eks_cluster_auth.eks_cluster_auth.token
     }
    
    
     provider "helm" {
       kubernetes {
         host                   = data.aws_eks_cluster.eks_cluster_id.endpoint
         cluster_ca_certificate = base64decode(data.aws_eks_cluster.eks_cluster_id.certificate_authority.0.data)
         token                  = data.aws_eks_cluster_auth.eks_cluster_auth.token
       }
     }
    
     output "url" {
       value = module.wandb_infra.url
     }
    
     output "bucket" {
       value = module.wandb_infra.bucket_name
     }
    
  2. W&B 배포 W&B를 배포하려면 다음 명령을 실행합니다.
    terraform init
    terraform apply -var-file=terraform.tfvars
    

REDIS 활성화

또 다른 배포 옵션에서는 Redis를 사용하여 SQL 쿼리를 캐싱하고, 실험 메트릭을 불러올 때 애플리케이션 응답 속도를 높일 수 있습니다. 캐시를 활성화하려면 권장 배포 섹션에서 설명한 동일한 main.tf 파일에 create_elasticache_subnet = true 옵션을 추가해야 합니다.
module "wandb_infra" {
  source  = "wandb/wandb/aws"
  version = "~>7.0"

  namespace   = var.namespace
  domain_name = var.domain_name
  subdomain   = var.subdomain
  zone_id     = var.zone_id
	**create_elasticache_subnet = true**
}
[...]

메시지 브로커(큐) 활성화

배포 옵션 3은 외부 message broker를 활성화하는 것입니다. 이는 선택 사항으로, W&B 플랫폼에 이미 브로커가 내장되어 있기 때문입니다. 이 옵션을 사용하더라도 성능상 이점은 없습니다. 메시지 브로커를 제공하는 AWS 리소스는 SQS이며, 이를 활성화하려면 권장 배포 섹션에서 설명한 동일한 main.tfuse_internal_queue = false 옵션을 추가해야 합니다.
module "wandb_infra" {
  source  = "wandb/wandb/aws"
  version = "~>7.0"

  namespace   = var.namespace
  domain_name = var.domain_name
  subdomain   = var.subdomain
  zone_id     = var.zone_id
  **use_internal_queue = false**

[...]
}

기타 배포 옵션

세 가지 배포 옵션을 모두 결합해 모든 구성을 하나의 파일에 추가할 수 있습니다. Terraform Module은 표준 옵션과 Deployment - Recommended에 나와 있는 최소 구성과 함께 조합해 사용할 수 있는 여러 옵션을 제공합니다.

수동 구성

W&B의 파일 스토리지 백엔드로 Amazon S3 버킷을 사용하려면 다음을 수행해야 합니다: 버킷을 생성하고, 해당 버킷에서 객체 생성 알림을 수신하도록 구성된 SQS 대기열도 함께 생성해야 합니다. 인스턴스에는 이 대기열에서 메시지를 읽을 수 있는 권한이 필요합니다.

S3 버킷 생성 및 버킷 알림 설정

아래 절차를 따라 Amazon S3 버킷을 생성하고 버킷 알림을 활성화합니다.
  1. AWS 콘솔에서 Amazon S3로 이동합니다.
  2. Create bucket을 선택합니다.
  3. Advanced settings에서 Events 섹션의 Add notification을 선택합니다.
  4. 모든 객체 생성 이벤트가 앞에서 구성한 SQS 큐로 전송되도록 설정합니다.
엔터프라이즈 파일 스토리지 설정
CORS 액세스를 활성화합니다. CORS 설정은 다음과 같이 구성해야 합니다:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>http://YOUR-W&B-SERVER-IP</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

SQS 큐 생성

아래 절차에 따라 SQS 큐를 생성합니다:
  1. AWS 콘솔에서 Amazon SQS로 이동합니다.
  2. Create queue를 선택합니다.
  3. Details 섹션에서 큐 유형으로 Standard를 선택합니다.
  4. Access policy 섹션에서 다음 주체에 대한 권한을 추가합니다:
  • SendMessage
  • ReceiveMessage
  • ChangeMessageVisibility
  • DeleteMessage
  • GetQueueUrl
필요한 경우 Access Policy 섹션에서 고급 액세스 정책을 추가합니다. 예를 들어, 단일 statement를 사용하는 Amazon SQS 액세스 정책은 다음과 같습니다:
{
    "Version" : "2012-10-17",
    "Statement" : [
      {
        "Effect" : "Allow",
        "Principal" : "*",
        "Action" : ["sqs:SendMessage"],
        "Resource" : "<sqs-queue-arn>",
        "Condition" : {
          "ArnEquals" : { "aws:SourceArn" : "<s3-bucket-arn>" }
        }
      }
    ]
}

W&B를 실행하는 노드에 권한 부여

W&B 서버가 실행 중인 노드는 Amazon S3와 Amazon SQS에 액세스할 수 있도록 구성되어야 합니다. 선택한 서버 배포 유형에 따라, 노드 역할에 다음 정책 구문을 추가해야 할 수도 있습니다:
{
   "Statement":[
      {
         "Sid":"",
         "Effect":"Allow",
         "Action":"s3:*",
         "Resource":"arn:aws:s3:::<WANDB_BUCKET>"
      },
      {
         "Sid":"",
         "Effect":"Allow",
         "Action":[
            "sqs:*"
         ],
         "Resource":"arn:aws:sqs:<REGION>:<ACCOUNT>:<WANDB_QUEUE>"
      }
   ]
}

W&B 서버 구성

마지막으로 W&B Server를 구성합니다.
  1. http(s)://YOUR-W&B-SERVER-HOST/system-admin에서 W&B 설정 페이지로 이동합니다.
  2. **외부 파일 스토리지 백엔드 사용 옵션을 활성화합니다.
  3. Amazon S3 버킷, 리전, Amazon SQS 큐 정보를 다음 형식으로 입력합니다:
  • File Storage Bucket: s3://<bucket-name>
  • File Storage Region (AWS only): <region>
  • Notification Subscription: sqs://<queue-name>
AWS 파일 스토리지 구성
  1. 새 설정을 적용하려면 Update settings를 선택합니다.

W&B 버전 업그레이드

다음 단계를 따라 W&B 버전을 업그레이드하세요:
  1. wandb_app 모듈의 설정에 wandb_version을 추가합니다. 업그레이드하려는 W&B 버전을 지정합니다. 예를 들어, 다음 줄은 W&B 버전 0.48.1을 지정합니다:
  module "wandb_app" {
      source  = "wandb/wandb/kubernetes"
      version = "~>1.0"

      license       = var.license
      wandb_version = "0.48.1"
또는 terraform.tfvarswandb_version을 추가하고 동일한 이름의 변수를 만든 다음, 리터럴 값 대신 var.wandb_version을 사용해도 됩니다.
  1. 구성을 업데이트한 후, 권장 배포 섹션에 설명된 단계를 완료합니다.

operator 기반 AWS Terraform 모듈로 마이그레이션

이 섹션에서는 terraform-aws-wandb 모듈을 사용하여 pre-operator 환경을 post-operator 환경으로 마이그레이션하는 데 필요한 단계를 설명합니다.
Kubernetes operator 패턴으로의 전환은 W&B 아키텍처에 필수적입니다. 자세한 내용은 아키텍처 변경에 대한 설명을 참조하세요.

변경 전후 아키텍처

이전 W&B 아키텍처에서는 다음을 사용했습니다.
module "wandb_infra" {
  source  = "wandb/wandb/aws"
  version = "1.16.10"
  ...
}
인프라를 제어하려면:
pre-operator-infra
그리고 이 모듈을 사용하여 W&B Server를 배포합니다:
module "wandb_app" {
  source  = "wandb/wandb/kubernetes"
  version = "1.12.0"
}
pre-operator-k8s
전환 이후 아키텍처는 다음 구성 요소를 사용합니다:
module "wandb_infra" {
  source  = "wandb/wandb/aws"
  version = "4.7.2"
  ...
}
Kubernetes 클러스터에 대한 인프라 및 W&B Server의 설치를 모두 관리하므로, post-operator.tf에서 module "wandb_app"가 더 이상 필요하지 않습니다.
post-operator-k8s
이러한 아키텍처적 전환을 통해 SRE/인프라 팀이 수동으로 Terraform 작업을 수행하지 않고도 OpenTelemetry, Prometheus, HPA, Kafka, 이미지 업데이트와 같은 추가 기능을 사용할 수 있습니다. W&B Pre-Operator의 기본 설치를 시작하려면, post-operator.tf의 파일 확장자가 .disabled인지, 그리고 pre-operator.tf는 활성 상태(즉, .disabled 확장자가 없음)인지 확인하십시오. 해당 파일은 여기에서 찾을 수 있습니다.

사전 준비 사항

마이그레이션을 시작하기 전에 다음 사전 준비 사항을 충족했는지 확인하세요:
  • Egress: 배포 환경은 에어갭(air-gapped)일 수 없습니다. Release Channel에 대한 최신 사양을 가져오기 위해 deploy.wandb.ai에 접근할 수 있어야 합니다.
  • AWS 자격 증명: AWS 리소스와 상호 작용할 수 있도록 올바른 AWS 자격 증명이 구성되어 있어야 합니다.
  • Terraform 설치: 시스템에 최신 버전의 Terraform이 설치되어 있어야 합니다.
  • Route53 호스티드 존: 애플리케이션이 제공될 도메인에 해당하는 기존 Route53 호스티드 존이 있어야 합니다.
  • Pre-Operator Terraform 파일: pre-operator.tfpre-operator.tfvars와 같은 관련 변수 파일이 올바르게 설정되어 있는지 확인하세요.

Operator 이전 설정

Pre-Operator 설정 구성을 초기화하고 적용하려면 다음 Terraform 명령을 실행하십시오:
terraform init -upgrade
terraform apply -var-file=./pre-operator.tfvars
pre-operator.tf 파일은 다음과 유사해야 합니다:
namespace     = "operator-upgrade"
domain_name   = "sandbox-aws.wandb.ml"
zone_id       = "Z032246913CW32RVRY0WU"
subdomain     = "operator-upgrade"
wandb_license = "ey..."
wandb_version = "0.51.2"
pre-operator.tf 구성 파일은 두 개의 모듈을 호출합니다:
module "wandb_infra" {
  source  = "wandb/wandb/aws"
  version = "1.16.10"
  ...
}
이 모듈은 인프라를 프로비저닝합니다.
module "wandb_app" {
  source  = "wandb/wandb/kubernetes"
  version = "1.12.0"
}
이 모듈은 애플리케이션을 배포하는 역할을 합니다.

Post-Operator 설정

pre-operator.tf 파일에 .disabled 확장자가 붙어 있고, post-operator.tf 파일이 활성화되어 있는지 확인합니다. post-operator.tfvars에는 추가 변수들이 포함되어 있습니다:
...
# wandb_version = "0.51.2"은 이제 Release Channel을 통해 관리되거나 User Spec에서 설정됩니다.

# 업그레이드에 필요한 Operator 변수:
size                 = "small"
enable_dummy_dns     = true
enable_operator_alb  = true
custom_domain_filter = "sandbox-aws.wandb.ml"
다음 명령을 실행해 Post-Operator 구성을 초기화하고 적용하세요:
terraform init -upgrade
terraform apply -var-file=./post-operator.tfvars
planapply 단계에서는 다음 리소스가 업데이트됩니다:
actions:
  create:
    - aws_efs_backup_policy.storage_class
    - aws_efs_file_system.storage_class
    - aws_efs_mount_target.storage_class["0"]
    - aws_efs_mount_target.storage_class["1"]
    - aws_eks_addon.efs
    - aws_iam_openid_connect_provider.eks
    - aws_iam_policy.secrets_manager
    - aws_iam_role_policy_attachment.ebs_csi
    - aws_iam_role_policy_attachment.eks_efs
    - aws_iam_role_policy_attachment.node_secrets_manager
    - aws_security_group.storage_class_nfs
    - aws_security_group_rule.nfs_ingress
    - random_pet.efs
    - aws_s3_bucket_acl.file_storage
    - aws_s3_bucket_cors_configuration.file_storage
    - aws_s3_bucket_ownership_controls.file_storage
    - aws_s3_bucket_server_side_encryption_configuration.file_storage
    - helm_release.operator
    - helm_release.wandb
    - aws_cloudwatch_log_group.this[0]
    - aws_iam_policy.default
    - aws_iam_role.default
    - aws_iam_role_policy_attachment.default
    - helm_release.external_dns
    - aws_default_network_acl.this[0]
    - aws_default_route_table.default[0]
    - aws_iam_policy.default
    - aws_iam_role.default
    - aws_iam_role_policy_attachment.default
    - helm_release.aws_load_balancer_controller

  update_in_place:
    - aws_iam_policy.node_IMDSv2
    - aws_iam_policy.node_cloudwatch
    - aws_iam_policy.node_kms
    - aws_iam_policy.node_s3
    - aws_iam_policy.node_sqs
    - aws_eks_cluster.this[0]
    - aws_elasticache_replication_group.default
    - aws_rds_cluster.this[0]
    - aws_rds_cluster_instance.this["1"]
    - aws_default_security_group.this[0]
    - aws_subnet.private[0]
    - aws_subnet.private[1]
    - aws_subnet.public[0]
    - aws_subnet.public[1]
    - aws_launch_template.workers["primary"]

  destroy:
    - kubernetes_config_map.config_map
    - kubernetes_deployment.wandb
    - kubernetes_priority_class.priority
    - kubernetes_secret.secret
    - kubernetes_service.prometheus
    - kubernetes_service.service
    - random_id.snapshot_identifier[0]

  replace:
    - aws_autoscaling_attachment.autoscaling_attachment["primary"]
    - aws_route53_record.alb
    - aws_eks_node_group.workers["primary"]
다음과 비슷한 화면이 보여야 합니다:
post-operator-apply
post-operator.tf 파일에는 다음 한 가지만 있다는 점에 유의하세요:
module "wandb_infra" {
  source  = "wandb/wandb/aws"
  version = "4.7.2"
  ...
}

오퍼레이터 이후 구성의 변경 사항:

  1. 필수 프로바이더 업데이트: 프로바이더 호환성을 위해 required_providers.aws.version 값을 3.6에서 4.0으로 변경합니다.
  2. DNS 및 로드 밸런서 구성: Ingress를 통해 DNS 레코드와 AWS Load Balancer 구성을 관리할 수 있도록 enable_dummy_dnsenable_operator_alb를 사용합니다.
  3. 라이선스 및 사이즈 구성: 새로운 운영 요구 사항에 맞추기 위해 licensesize 파라미터를 그대로 wandb_infra 모듈로 전달합니다.
  4. 커스텀 도메인 처리: 필요한 경우 kube-system 네임스페이스 내 External DNS 파드의 로그를 확인해 DNS 문제를 해결하기 위해 custom_domain_filter를 사용합니다.
  5. Helm 프로바이더 구성: Kubernetes 리소스를 효과적으로 관리할 수 있도록 Helm 프로바이더를 활성화하고 구성합니다:
provider "helm" {
  kubernetes {
    host                   = data.aws_eks_cluster.app_cluster.endpoint
    cluster_ca_certificate = base64decode(data.aws_eks_cluster.app_cluster.certificate_authority[0].data)
    token                  = data.aws_eks_cluster_auth.app_cluster.token
    exec {
      api_version = "client.authentication.k8s.io/v1beta1"
      args        = ["eks", "get-token", "--cluster-name", data.aws_eks_cluster.app_cluster.name]
      command     = "aws"
    }
  }
}
이 포괄적인 설정은 Pre-Operator 구성에서 Post-Operator 구성으로의 원활한 전환을 보장하며, operator 모델로 가능해진 새로운 효율성과 기능을 활용할 수 있도록 해줍니다.