AKS 또는 Arc Kubernetes 클러스터에 Azure Machine Learning 익스텐션 배포
AKS 또는 Arc Kubernetes 클러스터가 학습 작업 또는 유추 워크로드를 실행할 수 있도록 하려면 먼저 AKS 또는 Arc Kubernetes 클러스터에 Azure Machine Learning 확장을 배포해야 합니다. Azure Machine Learning 확장은 AKS용 클러스터 확장 및 Arc Kubernetes용 클러스터 확장을 기반으로 하며, Azure CLI k8s-extension을 사용하여 수명 주기를 쉽게 관리할 수 있습니다.
이 문서에서는 다음에 대해 알아봅니다.
- 필수 조건
- 제한 사항
- Azure Machine Learning 익스텐션 구성 설정 검토
- Azure Machine Learning 익스텐션 배포 시나리오
- Azure Machine Learning 익스텐션 배포 확인
- Azure Machine Learning 익스텐션 구성 요소 검토
- Azure Machine Learning 익스텐션 관리
필수 조건
- Azure에서 AKS 클러스터가 실행됩니다. 이전에 클러스터 확장을 사용하지 않은 경우 KubernetesConfiguration 서비스 공급자를 등록해야 합니다.
- 또는 Arc Kubernetes 클러스터가 가동 중입니다. Azure Arc에 기존 Kubernetes 클러스터 연결의 지침을 따릅니다.
- 클러스터가 ARO(Azure RedHat OpenShift) 서비스 클러스터 또는 OCP(OpenShift Container Platform) 클러스터인 경우 Kubernetes 클러스터 구성에 대한 참조 문서에 설명된 대로 다른 필수 구성 요소 단계를 충족해야 합니다.
- 프로덕션을 위해 Kubernetes 클러스터에는 최소 4개의 vCPU 코어와 14GB의 메모리가 있어야 합니다. 리소스 세부 정보 및 클러스터 크기 권장 사항에 대한 자세한 내용은 권장 리소스 계획을 참조하세요.
- 아웃바운드 프록시 서버 또는 방화벽 뒤에서 실행되는 클러스터는 추가 네트워크 구성이 필요합니다.
- Azure CLI를 버전 2.24.0 이상으로 설치하거나 업그레이드합니다.
- Azure CLI 확장(
k8s-extension
)을 버전 1.2.3 이상으로 설치하거나 업그레이드합니다.
제한 사항
- AKS와 함께 서비스 주체를 사용하는 것은 Azure Machine Learning에서 지원되지 않습니다. 대신 AKS 클러스터는 관리 ID를 사용해야 합니다. 시스템이 할당한 관리 ID와 사용자가 할당한 관리 ID가 모두 지원됩니다. 자세한 내용은 Azure Kubernetes Service에서 관리 ID 사용을 참조하세요.
- AKS 클러스터에서 사용한 서비스 주체가 관리 ID를 사용하도록 변환된 경우 확장을 설치하기 전에 직접 업데이트하는 대신 모든 노드 풀을 삭제하고 다시 만들어야 합니다.
- AKS에 대한 로컬 계정 사용 안 함은 Azure Machine Learning에서 지원되지 않습니다. AKS 클러스터가 배포될 때 로컬 계정이 기본적으로 사용하도록 설정됩니다.
- AKS 클러스터에 API 서버에 액세스할 수 있는 권한 있는 IP 범위가 사용하도록 설정된 경우 Azure Machine Learning 컨트롤 플레인 IP 범위를 AKS 클러스터에 사용하도록 설정합니다. Azure Machine Learning 컨트롤 플레인은 쌍을 이루는 지역에 배포됩니다. API 서버에 대한 액세스 권한이 없으면 기계 학습 Pod를 배포할 수 없습니다. AKS 클러스터에서 IP 범위를 사용하도록 설정하는 경우 IP 범위를 쌍으로 연결된 두 지역 모두에 사용합니다.
- Azure Machine Learning은 AKS 클러스터 구독 간 연결을 지원하지 않습니다. 다른 구독에 AKS 클러스터가 있는 경우 먼저 Azure-Arc에 연결하고 Azure Machine Learning 작업 영역과 동일한 구독에서 지정해야 합니다.
- Azure Machine Learning은 AKS의 모든 미리 보기 단계 기능 지원을 보장하지 않습니다. 예를 들어 Microsoft Entra Pod ID는 지원되지 않습니다.
- Azure Machine Learning AKS v1 문서의 단계에 따라 AKS를 유추 클러스터로 만들거나 연결한 경우 다음 링크를 사용해서 다음 단계를 계속하기 전 레거시 Azure Machine Learning-fe 관련 리소스를 정리하세요.
Azure Machine Learning 확장 구성 설정 검토
Azure Machine Learning CLI 명령 k8s-extension create
를 사용하여 Azure Machine Learning 확장을 배포할 수 있습니다. CLI k8s-extension create
를 통해 --config
또는 --config-protected
매개 변수를 사용하여 key=value
형식으로 구성 설정 세트를 지정할 수 있습니다. 다음은 Azure Machine Learning 확장을 배포할 때 지정할 수 있는 구성 설정 목록입니다.
구성 설정 키 이름 | 설명 | 학습 | 유추 | 학습 및 유추 |
---|---|---|---|---|
enableTraining |
True 또는 False 이며, 기본값은 False 입니다. Machine Learning 모델 학습 및 일괄 처리 채점 지원이 포함된 Azure Machine Learning 확장 배포에 대해 반드시 True 로 설정해야 합니다. |
✓ | 해당 없음 | ✓ |
enableInference |
True 또는 False 이며, 기본값은 False 입니다. Machine Learning 모델 유추 지원이 포함된 Azure Machine Learning 확장 배포에 대해 반드시 True 로 설정해야 합니다. |
해당 없음 | ✓ | ✓ |
allowInsecureConnections |
True 또는 False 이며, 기본값은 False 입니다. 개발 또는 테스트 목적으로 유추 HTTP 엔드포인트를 사용하도록 True 로 설정할 수 있습니다. |
해당 없음 | 선택 사항 | 선택 사항 |
inferenceRouterServiceType |
loadBalancer , nodePort 또는 clusterIP . enableInference=True 인 경우 필수 |
해당 없음 | ✓ | ✓ |
internalLoadBalancerProvider |
이 구성은 현재 AKS(Azure Kubernetes Service) 클러스터에만 적용할 수 있습니다. 추론 라우터가 내부 부하 분산 장치를 사용할 수 있도록 허용하려면 azure 로 설정합니다. |
해당 없음 | 선택 사항 | 선택 사항 |
sslSecret |
azureml 네임스페이스에 있는 Kubernetes 비밀의 이름입니다. 이 구성은 allowInsecureConnections 가 False 로 설정된 경우 유추 HTTPS 엔드포인트 지원에 필요한 cert.pem (PEM 인코딩 TLS/SSL 인증서) 및 key.pem (PEM 인코딩 TLS/SSL 키)를 저장하는 데 사용됩니다. sslSecret 의 샘플 YAML 정의는 sslSecret 구성을 참조하세요. 이 구성 또는 sslCertPemFile 및 sslKeyPemFile 보호된 구성 설정 조합을 사용합니다. |
해당 없음 | 선택 사항 | 선택 사항 |
sslCname |
추론 HTTPS 엔드포인트에서 사용하는 TLS/SSL CNAME입니다. allowInsecureConnections=False 인 경우 필수 |
해당 없음 | 선택 사항 | 선택 사항 |
inferenceRouterHA |
True 또는 False 이며, 기본값은 True 입니다. 기본적으로 Azure Machine Learning 확장은 클러스터에 3개 이상의 작업자 노드가 필요한 고가용성을 위해 3개의 유추 라우터 복제본을 배포합니다. 클러스터에 3개 미만의 작업자 노드가 있는 경우 False 로 설정합니다. 이 경우 하나의 유추 라우터 서비스만 배포됩니다. |
해당 없음 | 선택 사항 | 선택 사항 |
nodeSelector |
기본적으로 배포된 Kubernetes 리소스 및 기계 학습 워크로드는 하나 이상의 클러스터 노드에 임의로 배포되고 daemonset 리소스는 모든 노드에 배포됩니다. 확장 배포 및 학습/유추 워크로드를 key1=value1 및 key2=value2 레이블이 있는 특정 노드로 제한하려면 각각 nodeSelector.key1=value1 , nodeSelector.key2=value2 를 사용합니다. |
선택 사항 | 선택 사항 | 선택 사항 |
installNvidiaDevicePlugin |
True 또는 False 이며, 기본값은 False 입니다. Nvidia GPU 하드웨어의 ML 워크로드에는 Nvidia 디바이스 플러그 인이 필요합니다. 기본적으로 Azure Machine Learning 확장 배포는 Kubernetes 클러스터에 GPU 하드웨어가 있는지 여부에 관계없이 NVIDIA 디바이스 플러그 인을 설치하지 않습니다. 사용자는 이 설정을 True 로 지정하여 설치할 수 있지만 필수 구성 요소를 충족해야 합니다. |
선택 사항 | 선택 사항 | 선택 사항 |
installPromOp |
True 또는 False 이며, 기본값은 True 입니다. Azure Machine Learning 확장은 prometheus를 관리하기 위해 prometheus 연산자가 필요합니다. 기존 prometheus 연산자를 다시 사용하려면 False 로 설정합니다. 기존 prometheus 연산자를 다시 사용하는 방법에 대한 자세한 내용은 prometheus 연산자 다시 사용을 참조하세요. |
선택 사항 | 선택 사항 | 선택 사항 |
installVolcano |
True 또는 False 이며, 기본값은 True 입니다. Azure Machine Learning 확장은 작업을 예약하기 위해 화산 스케줄러가 필요합니다. 기존 화산 스케줄러를 재사용하려면 False 로 설정합니다. 기존 화산 스케줄러를 다시 사용하는 방법에 대한 자세한 내용은 화산 스케줄러 다시 사용을 참조하세요. |
선택 사항 | 해당 없음 | 선택 사항 |
installDcgmExporter |
True 또는 False 이며, 기본값은 False 입니다. Dcgm-exporter는 Azure Portal에서 모니터링할 수 있는 Azure Machine Learning 워크로드에 대한 GPU 메트릭을 노출할 수 있습니다. dcgm-exporter를 설치하려면 installDcgmExporter 를 True 로 설정합니다. 그러나 사용자 고유의 dcgm-exporter를 활용하려면 DCGM 내보내기를 참조하세요. |
선택 사항 | 선택 사항 | 선택 사항 |
구성 보호된 설정 키 이름 | 설명 | 학습 | 유추 | 학습 및 유추 |
---|---|---|---|---|
sslCertPemFile , sslKeyPemFile |
TLS/SSL 인증서 및 키 파일(PEM 인코딩)에 대한 경로이며, allowInsecureConnections 가 False로 설정된 경우 추론 HTTPS 엔드포인트 지원이 포함된 Azure Machine Learning 확장 배포에 필요합니다. 참고 암호로 보호된 PEM 파일은 지원되지 않습니다. |
해당 없음 | 선택 사항 | 선택 사항 |
구성 설정 표에서 볼 수 있듯이, 다음과 같이 다양한 구성 설정의 조합을 통해 다양한 ML 워크로드 시나리오에 필요한 Azure Machine Learning 확장을 배포할 수 있습니다.
- 학습 작업 및 일괄 처리 유추 워크로드에는
enableTraining=True
를 지정합니다. - 유추 워크로드 전용에는
enableInference=True
를 지정합니다. - 모든 종류의 ML 워크로드에는
enableTraining=True
및enableInference=True
를 모두 지정합니다.
실시간 유추 워크로드용 Azure Machine Learning 확장을 배포할 생각이고 enableInference=True
를 지정하려는 경우 실시간 유추 워크로드와 관련된 다음 구성 설정에 주의하세요.
azureml-fe
라우터 서비스는 실시간 유추 지원에 필요하며azureml-fe
에 대한inferenceRouterServiceType
구성 설정을 지정해야 합니다.azureml-fe
는 다음inferenceRouterServiceType
중 하나로 배포할 수 있습니다.LoadBalancer
. 클라우드 공급자의 부하 분산 장치를 사용하여azureml-fe
를 외부에 노출합니다. 이 값을 지정하려면 클러스터가 부하 분산 장치 프로비저닝을 지원하는지 확인합니다. 대부분의 온-프레미스 Kubernetes 클러스터는 외부 부하 분산 장치를 지원하지 않을 수 있습니다.NodePort
. 고정 포트에서 각 노드의 IP에 대한azureml-fe
를 노출합니다.<NodeIP>:<NodePort>
를 요청하여 클러스터 외부에서azureml-fe
에 연락할 수 있습니다.NodePort
를 사용하면azureml-fe
에 대한 자체 부하 분산 솔루션 및 TLS/SSL 종료를 설정할 수도 있습니다.ClusterIP
. 클러스터 내부 IP에서azureml-fe
를 노출하고 클러스터 내에서만azureml-fe
에 연결할 수 있도록 합니다.azureml-fe
가 클러스터 외부에서 들어오는 유추 요청을 처리하려면azureml-fe
에 대한 자체 부하 분산 솔루션과 TLS/SSL 종료를 설정해야 합니다.
azureml-fe
라우팅 서비스의 고가용성을 보장하기 위해 Azure Machine Learning 확장 배포는 기본적으로 3개 이상의 노드가 있는 클러스터에 대해 3개의azureml-fe
복제본을 만듭니다. 클러스터에 3개 미만의 노드가 있는 경우inferenceRouterHA=False
를 설정합니다.- HTTPS를 사용하여 모델 엔드포인트에 대한 액세스를 제한하고 클라이언트가 제출하는 데이터를 보호하는 것도 고려할 수 있습니다. 이를 위해서는
sslSecret
구성 설정 또는sslKeyPemFile
및sslCertPemFile
구성 보호 설정 조합을 지정해야 합니다. - 기본적으로 Azure Machine Learning 확장 배포는 HTTPS 지원에 대한 구성 설정을 예상합니다. 개발 또는 테스트 목적으로 HTTP 지원은
allowInsecureConnections=True
구성 설정을 통해 편리하게 제공됩니다.
Azure Machine Learning 확장 배포 - CLI 예 및 Azure Portal
CLI를 사용하여 Azure Machine Learning 확장을 배포하려면 필수 매개 변수에 대한 값을 전달하는 az k8s-extension create
명령을 사용합니다.
참조를 위한 4개의 일반적인 확장 배포 시나리오를 나열할 것입니다. 프로덕션 사용에 대한 확장을 배포하려면 구성 설정의 전체 목록을 주의 깊게 읽어 보세요.
개념을 신속하게 증명하기 위해 Azure에서 AKS 클러스터를 사용하여 모든 종류의 ML 워크로드를 실행. 즉, 학습 작업을 실행하거나 모델을 온라인/일괄 처리 엔드포인트로 배포
Azure Machine Learning 확장을 AKS 클러스터에 배포하려면
--cluster-type
매개 변수에 대해managedClusters
값을 지정해야 합니다. 다음 Azure CLI 명령을 실행하여 Azure Machine Learning 확장을 배포합니다.az k8s-extension create --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config enableTraining=True enableInference=True inferenceRouterServiceType=LoadBalancer allowInsecureConnections=True InferenceRouterHA=False --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
Azure 외부에서 빠른 개념 증명을 위해 Arc Kubernetes 클러스터를 사용하여 학습 작업만 실행
Azure Machine Learning 확장을 Arc Kubernetes 클러스터에 배포하려면
--cluster-type
매개 변수에 대해connectedClusters
값을 지정해야 합니다. 다음 Azure CLI 명령을 실행하여 Azure Machine Learning 확장을 배포합니다.az k8s-extension create --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config enableTraining=True --cluster-type connectedClusters --cluster-name <your-connected-cluster-name> --resource-group <your-RG-name> --scope cluster
Azure에서 프로덕션 학습 및 유추 워크로드를 위해 AKS 클러스터 사용 Azure Machine Learning 확장을 AKS 클러스터에 배포하려면
--cluster-type
매개 변수에 대해managedClusters
값을 지정해야 합니다. 클러스터에 3개가 넘는 노드가 있다고 가정하고, 유추 워크로드 지원을 위해 Azure 퍼블릭 부하 분산 장치 및 HTTPS를 사용합니다. 다음 Azure CLI 명령을 실행하여 Azure Machine Learning 확장을 배포합니다.az k8s-extension create --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config enableTraining=True enableInference=True inferenceRouterServiceType=LoadBalancer sslCname=<ssl cname> --config-protected sslCertPemFile=<file-path-to-cert-PEM> sslKeyPemFile=<file-path-to-cert-KEY> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
NVIDIA GPU를 사용하는 프로덕션 학습 및 유추 워크로드를 위해 어디서나 Arc Kubernetes 클러스터 사용
Azure Machine Learning 확장을 Arc Kubernetes 클러스터에 배포하려면
--cluster-type
매개 변수에 대해connectedClusters
값을 지정해야 합니다. 클러스터에 3개가 넘는 노드가 있다고 가정하고, 유추 워크로드 지원을 위해 NodePort 서비스 형식 및 HTTPS를 사용하고 Azure Machine Learning 확장을 배포하기 위해 다음 Azure CLI 명령을 실행합니다.az k8s-extension create --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config enableTraining=True enableInference=True inferenceRouterServiceType=NodePort sslCname=<ssl cname> installNvidiaDevicePlugin=True installDcgmExporter=True --config-protected sslCertPemFile=<file-path-to-cert-PEM> sslKeyPemFile=<file-path-to-cert-KEY> --cluster-type connectedClusters --cluster-name <your-connected-cluster-name> --resource-group <your-RG-name> --scope cluster
Azure Machine Learning 익스텐션 배포 확인
다음 CLI 명령을 실행하여 Azure Machine Learning 확장 세부 정보를 확인합니다.
az k8s-extension show --name <extension-name> --cluster-type connectedClusters --cluster-name <your-connected-cluster-name> --resource-group <resource-group>
응답에서 "name" 및 "provisioningState": "Succeeded"를 찾습니다. 처음 몇 분 동안 "provisioningState": "Pending"이 표시될 수 있습니다.
provisioningState에 Succeeded가 표시되면 클러스터를 가리키는 kubeconfig 파일로 컴퓨터에서 다음 명령을 실행하여 "azureml" 네임스페이스 아래의 모든 Pod가 "실행 중" 상태인지 확인합니다.
kubectl get pods -n azureml
Azure Machine Learning 확장 구성 요소 검토
Azure Machine Learning 확장 배포가 완료되면 kubectl get deployments -n azureml
을 사용하여 클러스터에서 만든 리소스 목록을 볼 수 있습니다. 이 목록은 일반적으로 지정된 구성 설정에 따라 다음과 같은 리소스의 하위 집합으로 구성됩니다.
리소스 이름 | 리소스 종류 | 학습 | 유추 | 학습 및 유추 | 설명 | 클라우드와 통신 |
---|---|---|---|---|---|---|
relayserver | Kubernetes 배포 | ✓ | ✓ | ✓ | 릴레이 서버는 Arc Kubernetes 클러스터에 대해서만 만들어지고 AKS 클러스터에는 만들어지지 않습니다. 릴레이 서버는 Azure Relay와 함께 작동하여 클라우드 서비스와 통신합니다. | 클라우드 서비스에서 작업 만들기, 모델 배포 요청을 수신합니다. 작업 상태를 클라우드 서비스와 동기화합니다. |
gateway | Kubernetes 배포 | ✓ | ✓ | ✓ | 게이트웨이는 통신하고 데이터를 보내고 받는 데 사용됩니다. | 노드 및 클러스터 자원 정보를 클라우드 서비스로 보냅니다. |
aml-operator | Kubernetes 배포 | ✓ | 해당 없음 | ✓ | 학습 작업의 수명 주기를 관리합니다. | Azure Container Registry의 인증 및 권한 부여를 위한 클라우드 토큰 서비스와 토큰 교환. |
metrics-controller-manager | Kubernetes 배포 | ✓ | ✓ | ✓ | Prometheus 구성을 관리합니다. | 해당 없음 |
{EXTENSION-NAME}-kube-state-metrics | Kubernetes 배포 | ✓ | ✓ | ✓ | 클러스터 관련 메트릭을 Prometheus로 내보냅니다. | 해당 없음 |
{EXTENSION-NAME}-prometheus-operator | Kubernetes 배포 | 선택 사항 | 선택 사항 | 선택 사항 | Prometheus 및 관련 모니터링 구성 요소의 Kubernetes 네이티브 배포 및 관리를 제공합니다. | 해당 없음 |
amlarc-identity-controller | Kubernetes 배포 | 해당 없음 | ✓ | ✓ | 관리 ID를 통해 Azure Blob/Azure Container Registry 토큰을 요청하고 갱신합니다. | 유추/모델 배포에 사용되는 Azure Container Registry 및 Azure Blob의 인증 및 권한 부여를 위한 클라우드 토큰 서비스와의 토큰 교환. |
amlarc-identity-proxy | Kubernetes 배포 | 해당 없음 | ✓ | ✓ | 관리 ID를 통해 Azure Blob/Azure Container Registry 토큰을 요청하고 갱신합니다. | 유추/모델 배포에 사용되는 Azure Container Registry 및 Azure Blob의 인증 및 권한 부여를 위한 클라우드 토큰 서비스와의 토큰 교환. |
azureml-fe-v2 | Kubernetes 배포 | 해당 없음 | ✓ | ✓ | 들어오는 유추 요청을 배포된 서비스로 라우팅하는 프런트 엔드 구성 요소입니다. | Azure Blob에 서비스 로그를 보냅니다. |
inference-operator-controller-manager | Kubernetes 배포 | 해당 없음 | ✓ | ✓ | 유추 엔드포인트의 수명 주기를 관리합니다. | 해당 없음 |
volcano-admission | Kubernetes 배포 | 선택 사항 | 해당 없음 | 선택 사항 | 화산 허용 웹후크입니다. | 해당 없음 |
volcano-controllers | Kubernetes 배포 | 선택 사항 | 해당 없음 | 선택 사항 | Azure Machine Learning 학습 작업 Pod의 수명 주기를 관리합니다. | 해당 없음 |
volcano-scheduler | Kubernetes 배포 | 선택 사항 | 해당 없음 | 선택 사항 | 클러스터 내 작업 스케줄링을 수행하는 데 사용됩니다. | 해당 없음 |
fluent-bit | Kubernetes daemonset | ✓ | ✓ | ✓ | 구성 요소의 시스템 로그를 수집합니다. | 구성 요소의 시스템 로그를 클라우드에 업로드합니다. |
{EXTENSION-NAME}-dcgm-exporter | Kubernetes daemonset | 선택 사항 | 선택 사항 | 선택 사항 | dcgm-exporter는 Prometheus에 대한 GPU 메트릭을 노출합니다. | 해당 없음 |
nvidia-device-plugin-daemonset | Kubernetes daemonset | 선택 사항 | 선택 사항 | 선택 사항 | nvidia-device-plugin-daemonset은 클러스터의 각 노드에 GPU를 노출합니다. | 해당 없음 |
prometheus-prom-prometheus | Kubernetes statefulset | ✓ | ✓ | ✓ | 작업 메트릭을 수집하여 클라우드로 보냅니다. | cpu/gpu/메모리 사용률과 같은 작업 메트릭을 클라우드로 보냅니다. |
Important
- Azure Relay 리소스는 Arc 클러스터 리소스와 동일한 리소스 그룹에 있습니다. Kubernetes 클러스터와 통신하는 데 사용되며 이를 수정하면 연결된 컴퓨팅 대상이 중단됩니다.
- 기본적으로 Kubernetes 배포 리소스는 1개 이상의 클러스터 노드에 임의로 배포되고 daemonset 리소스는 모든 노드에 배포됩니다. 확장 배포를 특정 노드로 제한하려면 구성 설정 테이블에 설명된
nodeSelector
구성 설정을 사용합니다.
참고 항목
- {EXTENSION-NAME}:은
az k8s-extension create --name
CLI 명령으로 지정된 확장 이름입니다.
Azure Machine Learning 익스텐션 관리
Azure Machine Learning 확장을 업데이트, 나열, 표시, 삭제합니다.
- Azure Arc가 연결되지 않은 AKS 클러스터의 경우 클러스터 확장 배포 및 관리를 참조하세요.
- Azure Arc 지원 Kubernetes의 경우 Azure Arc 지원 Kubernetes 클러스터 확장 배포 및 관리를 참조하세요.