메뉴

OpenAI/Codex: 중요한 인프라를 Perl에서 Python으로 이동

OpenAI Codex 히어로
목차

이 페이지 공유하기

Phil Ezolt picture
Phil Ezolt

디지털 전환은 대개 디지털 혁신이라고 합니다. 수년에 걸쳐 발생했지만 그 여파로 인해 영향을 입지 않은 주요 기술 변화를 정확히 찾아내는 것은 어렵습니다. 하지만 미션 크리티컬 서비스를 비롯한 잠재적인 변화에 대응하기 위해 기술 스택을 어떻게 발전시킬 수 있을까요?

미션 크리티컬 서비스를 중단하지 않고 Perl에서 Python으로 빠르게 전환하려면 어떻게 해야 할까요?

이는 NetApp의 내부 DevOps/테스트 인프라 팀인 BAERO가 직면한 딜레마였습니다. BAERO는 개발자가 코드를 제출하기 전에 코드를 구축하고 테스트할 수 있는 툴과 서비스를 제공합니다. BAERO의 역할은 개발자가 더 빠르게 움직이고, 가능한 한 빨리 품질 문제를 파악하고, NetApp® 제품의 회귀가 발생하지 않도록 돕는 것입니다. 지난 몇 년간 우리는 이러한 임무를 지원하기 위해 많은 양의 소프트웨어를 구축했습니다. 하지만 NetApp에 새로운 제품과 기능이 추가됨에 따라 이 소프트웨어는 반드시 이러한 새로운 환경을 지원하도록 발전해야 합니다. 

예를 들어, NetApp ONTAP ®이 이제 Amazon FSX의 일부가 되었지만, 이 기능을 제공하려면 ONTAP 개발자는 AWS에서 새로운 기능을 릴리즈하기 전에 AWS에서 실행, 테스트, 디버깅할 수 있어야 합니다. 이러한 요구사항을 지원하기 위해 BAERO는 Amazon FSX와 함께 작동하도록 서비스 및 인프라를 확장했습니다. 일반적으로 BAERO가 더 빠르게 지원을 추가할수록 NetApp 개발자가 코드에서 회귀를 더 빨리 자동으로 포착할 수 있습니다.

BAERO는 까다로운 균형에 직면해 있습니다. 빠르게 움직여야 하지만 동시에 NetApp 개발 팀이 연중무휴 사용 중인 인프라를 중단할 수는 없습니다. 오늘날 BAERO 인프라 코드는 몇 년 전에 작성되었지만 필요에 맞게 확장되어 비교적 새로운 Python과 더 강화된 Perl 코드 및 라이브러리가 혼합되어 있습니다. 안타깝게도 Perl 코드는 NetApp의 새로운 기능과 제품을 지원하는 것을 더 어렵게 만들 수 있습니다. Perl의 라이브러리 에코시스템은 Python만큼 풍부하지 않고 Perl에서 작업하려는 개발자가 적기 때문입니다.

Python을 사용하면 팀이 더 빠르게 움직이고 차세대 NetApp 제품을 더 효과적으로 지원할 수 있습니다. 하지만 미션 크리티컬 서비스를 중단하지 않고 Perl 기반 코드베이스를 Python으로 변환할 수 있을까요?

NetApp의 방식

2021년 8월에 OpenAI/Codex가 공개되면서 인공 지능과 머신 러닝을 사용한 언어 간 코드 변환이 가능해졌습니다. BAERO의 경우 이는 Perl 코드베이스를 Python으로 변환하는 데 도움이 될 수 있습니다. 하지만 모든 제품이 기대에 부응하는 것은 아니기에 확실한 성능을 위해 테스트를 거쳐야 했습니다. Codex는 실제 상황에서 잘해 낼 수 있을까요? 개발자 그룹보다 더 빠르고 쉽게 코드베이스를 변환할 수 있을까요? 알아낼 수 있는 유일한 방법은 시행착오를 겪는 것이었습니다.

테스트 목적으로, 단위 테스트를 실행하고 결과를 해석하고 반환하는 유틸리티인 'run_utest.pl'를 선택했습니다. 이는 원래 설계된 방식 이상으로 발전한 스크립트이기도 합니다. 원래 코드가 필요에 따라 확장되었으며, 코어 덤프 분석, 퍼지 지원, 코드 적용 범위 지원 또는 드물게 특정 오류 발생 시 발생 지점 진단 등의 기능이 추가되었습니다. 그 결과, 수년간의 실제 런타임을 포함하는 크고 복잡한 Perl 스크립트가 되었기 때문에 테스트 대상으로 삼기에 다소 두려웠습니다. 새로운 언어로 변환하는 경우, 스크립트는 단위 테스트를 실행하여 품질을 강화하고 모든 개발자가 내부적으로 하루에 수백 번 사용하기 때문에 스크립트의 정확성을 저해하지 않는 방식으로 변환해야 합니다. 

당면 과제

Codex 변환을 처음 사용했을 때 Codex에는 장단점이 있다는 것이 분명해졌습니다. 일부 변환에서는 훌륭했지만, 다른 변환에서는 매우 형편없었습니다. 이를 사용하려면 중간에 개발자가 변환이 올바른지 확인하고 잘못된 단계를 수정해야 했습니다. 하지만 처음부터 작성하는 것보다 새로운 Python 스크립트를 검증하는 것이 더 쉽기 때문에 효과적인 결과를 얻을 수 있었습니다.

본질적으로, Codex는 매우 빠르지만 불완전한 변환기입니다. 변환 프로젝트 속도를 높이기 위해 안전하게 사용할 수 있는 방법을 찾아내야 했습니다. 작업이 끝나면 변환된 코드가 처음부터 완벽하게 작동해야 했습니다. 'run_utest.pl'은 일반 빌드에서 꽤 많이 사용되기 때문에 '정상 작동' 상황을 검증하는 것은 간단했습니다. 그러나 Perl 버전이 처리하는(그리고 작성 시 검증된) 많은 특수 사례와 오류 경로는 훨씬 더 어렵습니다. 배포 시 Python 변환에서 작동해야 하기 때문입니다. 오류가 발생할 여지를 없애야 합니다. 

문제 해결

우리는 새로운 Python 변환의 위험을 줄이거나 제거하는 데 집중했습니다. 다행히 오류 경로와 정상 작동 상황을 모두 연출할 수 있는 일련의 테스트가 있었습니다. 하지만 원래 코드에 대한 백업 테스트는 없었으며, 새 코드를 수동으로 테스트한 다음 새 버전을 배포한 후 문제를 지켜보면서 안정성을 강화했습니다. 

다음과 같은 방식으로 변환 위험을 제기했습니다.

  • 코드를 리팩토링하지 않고 직접 변환했습니다. 이렇게 하면 검토자가 두 언어에서 코드가 동일하게 수행되는지 보다 쉽게 확인할 수 있습니다. 또한, 기능 테스트 및 기능별 성능 테스트를 나란히 수행할 수 있습니다.
  • 변환 및 테스트를 한 번에 조금씩 진행한 후 검토 및 제출했습니다. 검토 양이 적을수록 검토자는 문제를 쉽게 파악할 수 있고 개발자는 느리지만 꾸준한 진행 상황을 확인할 수 있습니다. 
  • 같은 입력으로 이전 코드와 새 코드를 테스트했습니다. 새 코드는 이전 코드와 동일한 방식으로 동작해야 하므로 출력 차이를 조사했습니다.
  • 미친 듯이 단위 테스트를 마쳤습니다. 우리는 각 코드 줄을 실행하는 데 집중했습니다. 모든 오류 경로에 자연스럽게 도달하는 것은 어려울 수 있지만 pytest의 풍부한 모의 기능을 사용하면 각 코드 줄을 테스트하는 것이 가능한 경우가 많습니다.

결국, 새 버전은 원본보다 훨씬 더 나은 테스트를 거쳤으며 모든 코드를 테스트하는 과정에서 정상 작동 상황에서는 나타나지 않던 많은 오류 경로 변환 문제가 발견되었습니다.

결과

현재 이 포트는 기능이 완벽하며 전체 단위 테스트 워크플로를 실행할 수 있습니다. 배포 전까지 단위 테스트 적용 범위(이전 0% 대비 80% 초과)를 높이는 작업이 계속됩니다. 한 가지 놀라운 사실은 원래 Perl 구현의 버그였습니다. Perl 코드가 특정 유형의 종료 코드를 묵살하고 있었습니다. 문제는 현재 단위 테스트 인프라에 숨어 있습니다. 이는 매우 드물지만 실제적인 문제입니다. 원래는 변환 문제처럼 보였지만, 조사해 보니 Python 버전이 Perl 버전보다 더 엄격했습니다. 이 문제를 발견하는 것만으로도 변환 프로젝트의 정당성은 충분할 것입니다.

높은 단위 테스트 적용 범위, 철저한 통합 테스트(Perl 출력과 나란히 검증) 및 여러 번의 실행 반복을 통해 단위 테스트 대상의 약 5%에 대해 run_utest의 Python 버전을 배포했습니다.

run_utest의 원래 Perl 버전에 숨겨진 오류가 있는 단위 테스트를 수정한 후 이 숫자를 천천히 늘려 100%로 이동할 예정입니다.

다음 단계

OpenAI/Codex에 대해 매우 긍정적인 경험을 한 후 우리는 모든 것을 내걸 준비가 되었습니다. OpenAI/Codex는 BAERO 개발 팀이 할 수 있다고 믿는 것을 말 그대로 바꾸었습니다. 예전에는 새 프로젝트를 Python으로 작성하고, Perl 인프라는 특정 부분이 지원 불가능해질 때까지 유지했다가 문제가 불거지면 Python으로 다시 작성했습니다. 개발 툴박스에 OpenAI/Codex를 포함하면 이제 프로젝트 성공을 위한 청사진과 함께 사전에 변환할 인프라 소프트웨어 목록이 상당히 많아집니다.

결국,

OpenAI/Codex는 BAERO의 신속한 발전을 지원합니다.
OpenAI/Codex는 NetApp 개발자가 새로운 기능을 더욱 빠르게 테스트할 수 있도록 도와줍니다.
OpenAI/Codex는 NetApp이 보다 빠른 속도로 고객에게 고품질 소프트웨어를 제공할 수 있도록 지원합니다. 

Perl에서 Python으로의 변환은 시작에 불과합니다. OpenAI/Codex는 NetApp 제품의 새로운 NetApp 기능, 확장성 및 성능을 활용하고 높일 수 있는 잠재력을 가지고 있습니다.

OpenAI/Codex는 이제 막 시작되었지만 여기에서 곧 실험을 시작해야 합니다. OpenAI/Codex는 적절한 테스트/프로세스로 위험 요인을 관리함으로써 레거시 코드를 새로운 언어로 더욱 빠르게 변환할 수 있습니다.

Phil Ezolt picture

Phil Ezolt

Phil Ezolt는 NetApp 피츠버그 지사의 선임 소프트웨어 엔지니어/설계자입니다. NetApp에서 16년간 다양한 직무를 수행해 왔으며, 현재 그의 팀은 AIOps/DevOps/Quality 툴을 NetApp 소프트웨어 개발에 적극적으로 활용하고 있습니다. 카네기 멜론 대학교에서 전기 컴퓨터 공학 학사 학위를 받았고 하버드 대학교에서 컴퓨터 과학 석사 학위를 취득했으며, Linux 성능 최적화 툴에 관한 책(Optimizing Linux Performance)을 저술했습니다. 피츠버그에서 아내 Sarah, 자녀 3명, 개 2마리와 함께 살고 있습니다. 여가 시간에는 보드게임, 3D 프린트 작업을 즐기며, Sarah와 함께 STEAM 수업을 진행하고 비영리 단체인 SteamStudio의 Odyssey of the Mind 코칭을 담당합니다.

https://www.thesteamstudio.com/

Phil Ezolt의 모든 게시물 보기

다음 단계

Drift chat loading