작년에 이어 올해도 피츠버그에서 열린 PyCon US에 다녀왔다. 작년에는 발표가 선정되지 않기도 했고 미국 동부 여행까지 붙여서 정말 휴가 컨셉으로 다녀왔는데, 올해는... 너무나 바빠져서 아예 발표 신청서를 제출조차 못했다. T_T 게다가 NVIDIA GTC 기간에 우연찮게 참여하게 된 Python WheelNext 워킹그룹에 조인하여 Packaging Summit에도 참가하고, Python 3.14에 추가될 예정인 remote debugging 기능과 asyncio 디버깅 기능 관련하여 이를 aiomonitor에 통합하고 free-thread build를 테스트해보는 등 여러 스프린트에서 동시에 참여 요청이 와서 어쩐지 휴가 같았지만 출장이 되어버린 느낌이다.
작년에는 사실 거의 보지 않았는데, 올해는 NVIDIA, Meta, Pydantic, Snowflakes 등 Python을 활용하거나 지원하는 기업들의 스폰서 세션 발표 주제들이 흥미로운 게 많아서 하루종일 스폰서 세션 톡들을 들었다.
(NVIDIA) Accelerated Python: The Community and Ecosystem
(Heroku) Building Scalable AI Tool Servers with Model Context Protocol (MCP)
(Meta) High-Performance Python Type Checking and Free Threaded Execution
(Pydantic) Building AI Applications the Pydantic Way
한국이나 기타 다른 지역 파이콘에서는 거의 열리지 않지만 '본산'인 미국 파이콘에서 주로 열리는 다양한 Summit 프로그램들이 있다. Typing Summit, Education Summit처럼 사전 신청·초대 없이도 그냥 가서 참여할 수 있는 것들도 있고, Language Summit처럼 코어 개발자나 커뮤니티에서 아주 유명한(Python 사용자라면 누구나 알 만한 정도) 라이브러리를 개발하고 있다거나 한 사람들만 초대받아 갈 수 있는 것도 있다. 보통 이러한 Summit들은 해당 주제에 관심있는 사람들이 모여서 사전에 별도로 신청·선정한 주제 발표를 짧게는 3~4개, 길게는 6~7개 정도 포함하는데, 경우에 따라서는 Council 구성이나 오픈소스 조직 운영 절차·계획에 대한 논의 및 최근 진행사항 공유 등도 이루어진다. 말미에는 운영자나 모더레이터가 여러 개의 소주제 그룹으로 나누어 30분에서 1시간 정도 좀더 집중적인 자유토의를 진행하거나 기념사진을 찍는 경우도 있다.
내가 참여한 것은 이 중에서 Typing Summit과 Packaging Summit이었다.
여러 주제의 발표들이 있었지만(사실 시차 문제로 중간에 졸아서 딱 ty/pyrefly 발표 말고는 기억이 ㅠㅠ), 장안의 화제는 Astral에서 Ruff에서 분기하여 개발한 새로운 타입체커인 ty와 Meta에서 기존 Ocaml 기반으로 개발한 pyre를 Astral이 개발한 Rust 기반 parser 기반으로 재작성한 pyrefly였다. 이 둘은 같은 parser를 공유하지만 그 구현과 접근 방법이 굉장히 달랐다.
Ty는 Salsa라 불리는 incremental computation 프레임워크를 사용해서 매우 세밀하게 코드 조각과 scope들의 의존성을 바탕으로 필요한 영역만 타입검사를 실행하는 방식이고, pyrefly는 기존의 Ocaml 구현체를 Rust로 재작성하면서 그 디자인 철학을 계승하여 사용자가 타입 주석을 덜 적었더라도 공격적으로 타입추론을 실행하는 방식을 택하고 있다.
둘 다 속도는 굉장히 빨랐다. 내 M4 Pro 맥북 기준으로 Backend.AI 오픈소스 모노리포 전체 1086개 소스 파일 검사에 ty는 약 1.8초, pyrefly는 2.2초 (mypy 1.16 기준 4.3초) 정도 걸렸다. 셋 다 모두 여러 번 반복 실행하여 캐시가 적용된 상태 기준이며, ty와 pyrefly는 첫 실행과 반복된 실행이 크게 차이가 나지 않았지만 mypy는 캐시를 끄면 11~13초 정도 걸렸다. ty의 경우 아직은 typed dict 추론이 제대로 안 된다든지 하는 식으로 빠진 기능들이 있어 바로 적용은 어려워보였지만, Astral 프로젝트들 자체가 현재 파이썬 커뮤니티에서 큰 인기를 끌고 있으므로 사람들의 관심빨로 곧 해결되지 않을까 싶다.
PyPI (Python Package Index) 구축에도 오랜 기간 기여해왔고 최근에는 NVIDIA에서 Python 관련 각종 엔지니어링 총괄을 맡고 있는 Barry Warsaw (@warsaw)와 마찬가지로 CUDA Python 지원 관련 업무를 맡고 있는 Jonathan Dekhtiar (@DEKHTIARJonathan) 두 분이 주요 모더레이터로 진행한 Summit이었다.
GTC 가서 참여하게 된 WheelNext 그룹은 좀더 세부적으로 Python의 패키징 파일 형식인 wheel(.whl
확장자 파일들)의 차세대 규격을 논의하는 모임이고, Packaging Summit은 좀더 일반적으로 Python에서 다양한 패키지를 배포하거나 사용하는 사람들까지 아우르는 성격을 갖고 있다.
한국분으로는 NVIDIA에서 XGBoost 라이브러리의 maintainer를 담당하고 있는 조현수님도 WheelNext 미팅에서 이미 두 차례 이야기를 나눴는데 여기서 다시 만날 수 있기도 했다.
sys.path
를 조작하여 강제 인식시키는 트릭을 써야 했다. 나름대로 잘 동작은 하지만, 플러그인의 의존성 트리와 메인 프로그램의 의존성 트리가 동일한 패키지를 참조하되 다른 버전을 참조하는 경우 미묘한 호환성 문제가 발생할 가능성이 있다는 문제가 있다. 현재로서는 개발자가 이런 문제가 생기지 않도록 직접 손으로 검증할 수 밖에 없는데, 여기서 착안한 것이 virtualenv를 다르게 가지는 subinterpreter를 하나의 Python 프로세스 안에 두는 방식으로 플러그인과 본체의 의존성 트리를 독립적으로 만들 수 있지 않을까? 하는 아이디어였다.dlopen()
의 플래그를 임의 지정할 수 있기 때문에 항상 namespace 기반 dlmopen()
이나 RTLD_LOCAL
을 사용한다는 보장이 없다는 점이다. 즉, Python 모듈들은 subinterpreter로 격리가 된다 하더라도 native symbol들은 여전히 충돌 문제가 발생할 수 있다. 앞으로 이러한 것을 packaging 규격의 일부로 강제 또는 권장해야 할 가능성에 대해 이야기하였다.발표 신청조차 못한 대신(...) 작년 파이콘 한국에서 진행한 키노트 발표 "PyCon과 나의 10년 돌아보기"를 5분짜리 라이트닝톡으로 압축해서 발표하였다. 아무래도 길게 하고 싶은 말 다 하는 발표보다 정확히 5분 안에 맞춰야 하는 발표라 전날 미리 스크립트 써서 연습하고 분량조절도 해두고 나름 만반의 준비를 했다고 생각했는데, 정작 Arc 브라우저에서 Google Slides의 발표자보기 모드를 제대로 지원하지 않아서 AV팀과 한참 삽질하다가 결국 PowerPoint 포맷으로 다운로드해서 간신히 발표할 수 있었다. 발표 자체는 무난하게 진행하였지만 역시 발표도구는 평소에 익숙한 걸 써야 한다는 교훈을 얻었다. 사실 웬만하면 파워포인트를 쓰는 편이지만 작년 한국 파이콘 때 구글 슬라이드로 작업해둔 걸 그대로 가져왔다가... ㅠ_ㅠ 발표하는 장면을 파이콘 일본 커뮤니티의 테레다 상이 사진으로 멋지게 남겨주셨다.
Astral.sh
ty, ruff, uv로 주제를 나누어 AMA (ask me anything) 하는 시간으로 진행되었다. 나는 uv를 모노리포 같은 구조로 사용하면 단일 저장소 내에서 다른 하위 디렉토리(별도의 pyproject.toml을 가지는 workspace)의 코드를 실행할 때마다 uv가 암묵적으로 .venv
디렉토리를 매번 새로 갈아치우는 문제에 대해 물어보았는데, venv는 휘발적인 임시 파일처럼 간주하는 설계 철학 때문이라고 한다. Backend.AI처럼 대규모 코드베이스에서는 이런 방식이면 다소 쓰기 어렵고... 내부 의존성 관리 같은 것까지 깊게 지원하지 않으면 당분간 uv를 모노리포 관리도구로 고려하는 건 어려워보였다. ㅠㅠ 회사 동료분의 요청으로 ty, uv와 같이 왜 두 글자 이름을 고집하는지도 물어보았는데 그냥 짧고 타이핑하기 쉬워서라는 간단한 답변을 들었다.;;
아직도 Python 2.x를 지원해야 하는 사람들 모임
이건 왠지 제목을 보고 안 가면 안 될 것 같았다. (...) 사실 나는 다행히도(!) Python 2.x를 계속 지원해야 하는 상황은 아니지만, 나름 엔터프라이즈 솔루션을 개발하고 공급하는 입장에서 이런 종류의 이슈들을 꽤 겪어보기도 했고 실제로 이 문제를 파이썬 커뮤니티에서 어떤 사람들이 맞닥뜨리고 있는지 알고 싶기도 했다. 모임에 참여한 사람들은 대부분 대학이나 연구기관에서 연산 클러스터를 운영하는 사람들이었는데, 사실 이 문제에 대해서 뾰족한 해결책이 있는 건 아니었고 다들 동병상련의 자리에 가까웠다. 결국은 사용자들과의 소통이 중요하다는 훈훈한 마무리.
주로 asyncio, packaging, free-threading 관련 발표들을 찾아보았다. 몇몇은 직접 들어가서 보기도 했고, 몇몇은 다른 일정과 겹쳐서 나중에 온라인으로 찾아보기도 했다.
Zoom, Enhance: Asyncio's New Introspection Powers
Python 3.14에서는 remote debug 기능이 추가되어서 기존 실행 중인 파이썬 프로세스의 메모리를 인터프리터의 실행 중간에 '안전하게 실행할 수 있는 시점'에 코드를 주입하는 방법으로 원격 디버깅이 가능해진다. 기존에는 pdb 패키지를 이용해서 반드시 명시적인 tracing mode 진입을 하거나 aiomonitor처럼 별도로 라이브러리를 개발해서 inspection API를 만들어서 써야 했지만, 이제는 원본 프로그램의 변경 없이도 live inspection을 할 수 있는 길이 열린 것이다.
이 발표에서는 이걸 활용하여 aiomonitor에서 제공하는 것과 유사한 task 별 stack frame 및 task 간 호출 관계를 트리와 테이블 형태로 보여주는 python -m asyncio pstree
및 python -m asyncio ps
기능을 소개해주었다.
Reinventing the Wheel: A Community-Driven Roadmap for Python Packaging
Using Rust in Free-Threaded vs Regular Python 3.13
Unraveling Community Support For Free-Threaded Python
Building a NoGIL Load Balancer in 30 minutes
The past, present, and future of virtual environments
원래는 작년에 방문했던 필라델피아 사는 친구 준호와 캠핑까지 갈까 계획했었지만, 싱가포르 출장 일정이 잡히는 바람에 그냥 하루 집에서 묵기만 하고 뉴욕에서의 휴가도 원래 3박 예정이었던 것을 1박으로 줄여서 진행하게 되었다.
그래서 그 하루의 소중한 시간을 어떻게 알차게 보내야 하나 했는데, 결국은 2가지로 정할 수 있었다. 하나는 출장일정이 미친 듯이 잡혀버린 바람에 사전투표와 본투표 모두 못하게 된 대통령선거의 국외부재자 투표였고, 다른 하나는 아래 사진에서 보는 것처럼 UN 본부에 방문하는 것이었다. 이번에는 필라델피아에서 NJ Transit 대신 Amtrak의 고급 열차를 타고 갔더니 중간에 기차 다 내리고 바꿔태우고 하는 불상사 없이 편안하게 뉴욕에 도착해서 바로 점심 간단히 먹고 호텔에 짐 맡겨두고 뉴욕 총영사관에 투표부터 하러 갔다. 그런 다음 여유있게 유명한 카페 하나 들러서 인생 가장 맛있는 카푸치노 한잔 한 뒤(라떼류는 개인적으로 웬만한 미국·유럽 카페 모두 마음에 들게 하는 곳이 잘 없는데 뉴욕 정도 되니까 있더라...) UN 본부로 갔다.
UN 본부는 예전에 서상현님을 통해 사전에 가이드 투어 신청하면 내부 회의장들도 관람이 가능하다고 해서 미리 신청해두었는데 그 덕을 톡톡히 봤다. 사실 영화나 뉴스에서 어느 한 장면 장면 확대된 모습만 보다가, 실제로 하나의 연속된 공간으로 체험을 하니 그 느낌이 확 와닿았다고나 할까. 중세 유럽에서는 로마와 바티칸이 일종의 세계 수도에 가까운 역할을 하다가 르네상스와 대항해시대로 넘어오면서 서유럽의 다양한 도시들이 그 자리를 대체해나갔다고 할 수 있을 텐데, 종교나 특정 정치 권력에 소속되지 않은 '중립적 관점'에서의 세계 수도 역할을 하기 위해 디자인된 1950년대의 모더니즘 건축은 그 느낌이 굉장히 특이했다. 약간은 사회주의 국가들에서 보이는 대규모 국가 건축물들의 느낌도 살짝 났다. 일부러 특정 사상을 배제하고 인류애, 포용, 평화를 강조하기 위해 만들어진 공간이고, 각국에서 기증한 다양한 예술품들을 전시해놓은 것도 인상적이었다. 메인 로비에는 구소련에서 기증했을 스푸트니크 실물 모형도 걸려있었다. 스케일이나 인테리어 면에서는 이게 1950년대 지어진 건물이라는 것이 믿기지 않을 정도로 어떤 시대를 초월했다는 감각도 있었고, 한편으로는 생각보다 회의장 의자들이 닳아있다든지 이런 걸 보아 예산을 타이트하게 아껴쓰는구나 싶기도 했다.
약 1시간 정도 진행되는 영어 가이드 투어는 한국분이 진행해주셨는데, 한국어·영어·일본어·스페인어 4개 국어가 가능하다고 했다. 커버할 내용이 많아서 숨가쁘게 설명하셨는데 엄청 힘드실 듯... 투어를 통해 안전보장이사회·신탁통치이사회·경제사회이사회 및 총회 이렇게 4개의 주요 회의장을 둘러볼 수 있었는데, 세계적인 전쟁 이슈가 많은 상황이라 안보리는 비공개 회의 중이어서 직접 들어가서 볼 수는 없었다. 가이드만 잘 따라다니면 사진 촬영도 자유롭게 할 수 있었고(단, 영상 촬영은 불가) 생각보다 회원국 국민으로서(?) 대접받는다는 느낌이었다.
글을 쓰기 시작한 건 6월 초였는데, 위에서 언급한 것처럼 미쳐버린 출장 일정으로 이걸 5월 24일에 PyCon US에서 한국으로 돌아온 후 3번째(!) 해외출장 가는 비행기 안에서야 겨우겨우 마무리하고 있다. 그 사이에 싱가포르 일주일 갔다가 미국 서부 산타클라라에 일주일 갔다가 일주일 잠깐(...) 한국에 있다가 이번엔 다시 인도네시아 자카르타와 베트남 호찌민으로 출장을 와있다. 🫠
3년째 PyCon US에 참가하면서 계속 얼굴을 비추니 이제 그쪽 사람들도 "아, 이 친구는 이제 여기 오는 사람이구나-" 하고 받아들여주는 듯한 인상을 받는다. 동시에, 여러 계기로 WheelNext 그룹이나 Packaging Summit과 같은 활동에도 참여하게 되니 뭔가 단순 참관이 아니라 할일을 하러 가는 기분(시작은 분명 휴가였는데...)도 난다. ㅋㅋ
아침식사 때나 점심식사 때 테이블에 같이 앉는 랜덤한 참가자들하고 스몰톡을 해보면 아예 처음 와보는 학생이 대부분 비율을 차지했고, 간혹 나같은 고인물이나 혹은 아예 나이 지긋하신 분들이 무슨 대단한 스타트업 이런 걸 하지 않고 지역에서 소소하게 SI 비즈니스하면서 파이썬 커뮤니티에 기여·참여하는 경우들도 있었다. 이런 분들하고 이야기하다보면, 함께 갔던 배권한님이나 나동희님하고도 했던 이야기인데, 왜 이렇게 한국에서 아둥바둥 하며 살아야 하나... 싶은 현타가 살짝 온달까. 머리카락 희끗하면서도 재미있게 코드 이야기 하는 미국 사람들을 보면 그래서 부럽기도 하다. 이것이 단순히 시장 크기의 문제인지 문화적·사회적 차이인지 모르겠지만, 우리나라도 개발자나 기술자들이 나이 들도록 하고 싶은 일을 꾸준히 즐기면서 할 수 있는 환경이 마련되었으면 좋겠다는 생각이 들었다.