{"id":"IL-0115","org":"OpenAI","date":"2022-06-23","docs":[],"title":{"en":"One of OpenAI's three production AKS clusters went offline through a human error, and rebuilding it took 10½ hours because an AKS Kubernetes upgrade broke the ingress and AKS cannot be downgraded","ko":"OpenAI 의 운영 AKS 클러스터 세 개 중 하나가 사람의 실수로 통째로 내려가 Codex, Embeddings, 구형 GPT 모델과 파인튜닝 모델이 최대 12시간 동안 제대로 응답하지 못했다"},"domain":["kubernetes","azure","ai-infra"],"impact":{"scope":"some fine-tuned curie and davinci models, Codex beta models code-davinci-001 and code-cushman-001, legacy GPT models curie, babbage and ada, and all Embeddings models","users":"unknown","region":"unknown"},"review":{"written_by":"session","reviewed_at":null,"reviewed_by":null},"lessons":{"en":"Losing one of three clusters exhausted the GPU headroom, and GPUs could not be added on short notice, so full recovery depended on bringing the same cluster back. Rebuilding it exposed a deferred Kubernetes upgrade: the newer version broke the ingress, and because AKS cannot downgrade there was no way back except a full rebuild.\n\nRecovering many large models at once is limited by the bandwidth of the storage they load from, and the caches that normally hide this do not help when everything moves to a different cluster.","ko":"클러스터 하나를 통째로 잃으면 평소의 여유 용량이 한 번에 바닥난다. GPU 처럼 몇 시간 안에 늘릴 수 없는 자원을 쓰는 서비스는 남은 클러스터만으로 완전히 되살릴 수 없다. 운영 클러스터를 지울 수 있는 작업에는 그 영향을 분명히 보여 주는 정보와 잠금이 있어야 한다.\n\n쿠버네티스 버전이 뒤처져 있으면 급하게 하는 업그레이드가 인그레스 호환성 같은 새 문제를 만든다. AKS 는 다운그레이드가 되지 않아 되돌릴 수도 없었다. 대용량 모델을 처음부터 다시 올리는 상황에서는 스토리지 대역폭과 캐시 무효화가 복구 시간을 좌우했다."},"related":[],"sources":[{"url":"https://status.openai.com/incidents/01JMYB7YA3JVMJ2A0AAKK1SHCH/write-up","kind":"official-status","license":"unknown","archived":null}],"summary":{"en":"OpenAI ran its models on three production clusters on Azure Kubernetes Service (AKS), managed with Terraform and Kubernetes. One of them went completely offline through a mix of human error, holes in the safeguards and subtly missing information about what destructive operations would affect. The models it served were moved onto the remaining two clusters, and most of them recovered before the lost cluster came back.\n\nFine-tuned models took much longer. Losing a whole cluster used up the usual headroom, GPUs were the most constrained resource, and supply chain limits made it impossible to add GPUs at a few hours' notice. Each fine-tuned model is very large and normally only a few are loaded at a time from Azure Blob Storage; restoring all of them from scratch was bottlenecked by Blob Storage bandwidth, made worse by cross-cluster transfer, and the move invalidated the layers of caching that normally hide this. Fine-tuned Davinci did not fully recover until the cluster itself was back.\n\nRebuilding the cluster, normally fairly quick, took until about 05:30 PDT, around 10½ hours. During setup the connection to AKS was lost; with Azure support the VPN link was rebuilt. Later the connection to Azure Private Link was lost too and workarounds were built, again with Azure support; the cause of both was still unknown at the time of writing. A Kubernetes upgrade was expected to ease some of the network problems, but after the upgrade the ingress turned out to be incompatible with the new Kubernetes version, fixing it was not feasible in the time available, and AKS does not allow a Kubernetes downgrade. The team finally tore the cluster down, rebuilt it from scratch, and moved traffic back between 05:30 and 06:30 PDT.","ko":"OpenAI 는 Terraform 과 Azure Kubernetes Service, 줄여서 AKS 로 운영 클러스터 세 개를 관리했다. 장애의 주원인은 그중 하나가 완전히 오프라인이 된 일이었다. 사람의 실수, 안전장치에 있던 예상하지 못한 구멍, 파괴적인 작업이 무엇에 영향을 주는지 알려 주는 정보가 미묘하게 빠져 있던 것이 겹쳐 클러스터가 내려갔다. 클러스터가 내려가자 모델을 남은 두 클러스터에 다시 배치해야 했다.\n\n파인튜닝 모델은 복구가 특히 오래 걸렸다. 평소에는 인프라 여유분을 넉넉히 두지만, 클러스터 하나를 통째로 잃자 그 여유가 바닥났다. OpenAI 에게 가장 부족한 자원은 GPU 였고, 공급망 사정 때문에 몇 시간 안에 GPU 를 더 확보할 수 없었다. 남은 장비를 최대한 썼지만 내려간 클러스터가 돌아오기 전에는 서비스를 완전히 되살릴 수 없었다. 파인튜닝 모델은 하나하나가 매우 크고 고객마다 있어 수가 많다. 평소에는 Azure Blob Storage 에서 몇 개씩만 불러오지만, 처음부터 전부 다시 올리자 Blob Storage 대역폭이 심한 병목이 됐다. 클러스터 사이의 데이터 전송이 병목을 더 심하게 만들었고, 평소 이 문제를 덜어 주던 여러 층의 캐시는 이번 이동으로 모두 무효가 됐다.\n\n내려간 클러스터는 05시 30분 PDT 무렵, 10시간 반 만에 복구됐다. 평소에는 클러스터를 만드는 데 오래 걸리지 않지만 예상하지 못한 문제가 이어졌다. 구성 도중 AKS 연결이 끊겨 Azure 지원팀과 함께 VPN 링크를 다시 만들었다. 그 뒤 Azure Private Link 연결이 또 끊겨 Azure 지원팀과 우회 방법을 만들었다. 이 연결 문제의 근본 원인은 보고서를 쓸 때까지 밝혀지지 않았다.\n\n쿠버네티스 업그레이드가 네트워크 문제 일부를 덜어 줄 것으로 보고 업그레이드했는데, 업그레이드 뒤 인그레스가 새 쿠버네티스 버전과 호환되지 않았다. 주어진 시간 안에 인그레스를 고칠 수 없었고, AKS 는 쿠버네티스 다운그레이드를 허용하지 않았다. 결국 클러스터를 지우고 처음부터 다시 만들었고, 05시 30분부터 06시 30분 PDT 사이에 트래픽을 다시 이 클러스터로 옮겼다."},"trigger":{"en":"A destructive operation on one of the three production clusters, caused by human error that the existing safeguards did not catch, took the whole cluster offline.","ko":"사람의 실수로 운영 클러스터 하나에 파괴적인 작업이 실행돼 클러스터가 완전히 내려갔다. 안전장치에 예상하지 못한 구멍이 있었고, 그 작업이 어떤 영향을 주는지 알려 주는 정보가 미묘하게 빠져 있었다."},"severity":"unknown","symptoms":["service-unavailable","high-error-rate","intermittent-timeouts"],"timeline":{"detected_after":null,"resolved_after":"12h"},"date_kind":"incident","detection":null,"components":["ingress","model-hub"],"root_cause":"human-operation","remediation":[{"text":{"en":"re-allocated the models from the lost cluster to the remaining two clusters","ko":"내려간 클러스터가 맡던 모델을 남은 두 운영 클러스터에 다시 배치했다."}},{"text":{"en":"rebuilt the VPN link with Azure support after losing the connection to AKS during cluster setup","ko":"클러스터 구성 중 AKS 연결이 끊기자 Azure 지원팀과 함께 VPN 링크를 다시 만들었다."}},{"text":{"en":"built workarounds with Azure support after losing the connection to Azure Private Link","ko":"Azure Private Link 연결이 다시 끊기자 Azure 지원팀과 우회 방법을 만들었다."}},{"text":{"en":"tore down the cluster and rebuilt it from scratch after the upgraded Kubernetes version broke the ingress","ko":"업그레이드한 쿠버네티스 버전이 인그레스와 호환되지 않자 클러스터를 지우고 처음부터 다시 만들었다."}},{"text":{"en":"moved traffic back into the rebuilt cluster between 05:30 and 06:30 PDT","ko":"05시 30분부터 06시 30분 PDT 사이에 다시 만든 클러스터로 트래픽을 옮겼다."}}],"action_items":[{"text":{"en":"Add checks and locks so that this and similar production-critical infrastructure cannot be modified by accident","ko":"이번 클러스터처럼 운영에 꼭 필요한 인프라가 실수로 바뀌지 않도록 검사와 잠금을 더한다. 기존 보호 장치는 범위가 좁아 이번 같은 클러스터 장애를 막지 못했다."}},{"text":{"en":"Add better visibility into the operations being performed and make parts of the system more lexicographically distinct","ko":"실행 중인 작업이 더 잘 보이게 하고, 시스템 구성 요소의 이름이 글자만 봐도 서로 확실히 구별되도록 바꾼다."}},{"text":{"en":"Keep working with Azure on the AKS network connectivity issues so they do not disrupt new cluster operations","ko":"AKS 네트워크 연결 문제를 Azure 와 계속 조사해 새 클러스터 작업이 다시 방해받지 않게 한다."}},{"text":{"en":"Update playbooks with the new cluster failure modes and change the setup steps for new clusters and infrastructure","ko":"이번에 드러난 클러스터 장애 유형을 플레이북에 넣고, 새 클러스터와 인프라를 구성하는 절차를 고친다."}},{"text":{"en":"Upgrade Kubernetes systematically and set aside time so the clusters do not fall behind again","ko":"쿠버네티스를 체계적으로 업그레이드하고, 앞으로 버전이 뒤처지지 않도록 업그레이드할 시간을 따로 확보한다."}},{"text":{"en":"Shard fine-tuned models across multiple clusters and work towards more automatic cross-cluster replication","ko":"파인튜닝 모델을 여러 클러스터에 나눠 배치하고, 클러스터 사이 복제를 더 자동으로 하는 방법을 만든다."}},{"text":{"en":"Distribute and replicate Azure Blob Storage so fine-tuned models load faster and more reliably","ko":"Azure Blob Storage 를 분산하고 복제해 파인튜닝 모델을 더 빠르고 안정적으로 불러올 수 있게 한다."}},{"text":{"en":"Finish rolling out node-to-node caching to relieve Azure Blob Storage bottlenecks","ko":"Azure Blob Storage 병목을 덜어 줄 노드 간 캐시의 배포를 마무리한다."}},{"text":{"en":"Change how model weights are stored so they are more efficient and faster to load","ko":"모델 가중치를 저장하는 방식을 바꿔 더 효율적이고 빠르게 불러올 수 있게 한다."}}],"contributing":["no-safeguard-on-destructive-change","no-spare-capacity","skipped-upgrades","overlapping-failures"],"recurrence_of":null,"symptoms_text":{"en":"At 18:56 PDT on 23 June 2022 (01:56 UTC on 24 June) several models went offline at once: some fine-tuned curie and davinci models, the Codex beta models code-davinci-001 and code-cushman-001, the legacy GPT models curie, babbage and ada, and all Embeddings models.\n\nCodex, Embeddings and the legacy GPT models were completely unavailable for about an hour. Most requests to fine-tuned Curie timed out until 00:10 PDT, about five hours, and most requests to fine-tuned Davinci timed out until 06:40 PDT, about twelve hours.","ko":"2022년 6월 23일 18시 56분 PDT, UTC 로는 6월 24일 01시 56분에 여러 모델이 한꺼번에 오프라인이 됐다. 일부 파인튜닝 모델인 curie 와 davinci, 일부 Codex 베타 모델인 code-davinci-001 과 code-cushman-001, 일부 구형 GPT 모델인 curie, babbage, ada, 그리고 모든 Embeddings 모델이 응답하지 않았다.\n\nCodex, Embeddings, 구형 GPT 모델은 약 1시간 동안 완전히 쓸 수 없었다. 파인튜닝 Curie 는 00시 10분 PDT 까지 5시간 동안 대부분의 요청이 타임아웃 났다. 파인튜닝 Davinci 는 06시 40분 PDT 까지 12시간 동안 대부분의 요청이 타임아웃 났다.\n\n대부분의 모델은 남은 두 클러스터로 옮겨져 내려간 클러스터가 복구되기 전에 살아났다. 파인튜닝 Davinci 만은 클러스터가 복구된 뒤에야 완전히 돌아왔다."},"updated_at":"2026-11-10T00:00:34.048483Z","url":"https://benchlet.com/incidentlib/app/cases/IL-0115","org_slug":"openai"}