Building reproducible Python environments with XARs

Bài tóm tắt Jane Street 2023 4. Điều chỉnh Độ khó: Trung bình

Jane Street · 2023 · 4. Điều chỉnh · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Trader và researcher dùng Python và notebook rất nhiều, nhất là cho ML. Phần lớn code (nhiều là OCaml) nằm trong monorepo, nhưng notebook rải khắp nơi và phụ thuộc thư viện bên trong monorepo. Môi trường Python là lớp ở giữa: lý tưởng là tác giả thư viện đổi nhanh mà notebook vẫn nâng cấp theo nhịp riêng.
  • 2018: môi trường Conda dùng chung đầu tiên. Hai vấn đề: (1) đặt trên NFS, mà NFS chậm khi đọc hàng chục nghìn file liên tục; khởi động kernel kèm import mất vài phút so với dưới một giây từ đĩa local. (2) Không tái lập được: cách build ghi trên một trang wiki không đầy đủ, người dùng ngại cài thêm gói vì sợ làm hỏng mà không quay lại được. Docker không dùng được vì cần quyền trên host quá lớn.

Thay đổi chính

  • XAR (định dạng của Facebook, trên squashfs + Zstd): cả hệ file đóng trong một file, mount ra như cây thư mục. Với NFS chỉ là một file nên đọc nhanh. Bỏ Conda (khó build cô lập, khó di chuyển) và tự dựng môi trường kiểu virtualenv trong entrypoint của XAR: định dạng js-python.
  • Liên kết tĩnh: ban đầu XAR chỉ chứa interpreter và thư viện bên thứ ba; thư viện Python nội bộ và binding OCaml phát hành riêng, như liên kết động. Thay đổi trải ba thành phần khó test, khó rollback, khó tra lịch sử deploy. Họ đưa cả hai vào môi trường, thêm luật build Python vào build system để khai báo phụ thuộc giữa Python và OCaml.
  • Tag nightly và stable: nightly deploy liên tục; stable tạo theo lịch và không bao giờ đổi. Cả hai hiện ra như kernel notebook nên người dùng "du hành thời gian" giữa các phiên bản.
  • Một môi trường được mô tả đúng bằng revision code nó được build từ; roll là roll tất cả, rollback cũng vậy.

Vì sao

  • Build tập trung nên tạo môi trường mới dễ, từ đó phân tán môi trường được: một notebook quan trọng ở Hồng Kông có thể dùng môi trường riêng, không bị một lần roll ở New York làm vỡ.
  • Cái giá: hotfix chậm hơn (phải build XAR mới, 10–20 phút), một số trader cho là quá chậm với ứng dụng quan trọng. Thoả hiệp: code core nằm trong môi trường, bất biến sau deploy; code leaf (notebook, script mỏng) nằm ngoài, sửa tại chỗ được.

Bài học cho SWE

  • File nhỏ hàng loạt trên NFS là bẫy hiệu năng; đóng thành một image mount được giải quyết gọn.
  • Bài toán liên kết tĩnh hay động áp dụng cả cho môi trường Python: tĩnh cho phép test và rollback nguyên khối.
  • Vừa có bản bất biến (stable) vừa có bản liên tục (nightly) cho hai kiểu người dùng.
  • Để chỗ cho "dặm cuối" linh hoạt (leaf) thay vì bắt mọi thứ qua pipeline đầy đủ.

Liên quan