رفتن به محتوا

کاوش داده در یک کرنل پایدار

این راهنما نشان می‌دهد چطور کاری کنید که یک عامل چیزی پرهزینه را یک بار بارگذاری کند و بعد چند پرسش را روی آن بپرسد، به‌جای اینکه هزینهٔ بارگذاری را برای هر پرسش بپردازد.

ابزار eval یک مفسر پایدار را اجرا می‌کند. متغیرها، ماژول‌های واردشده و داده‌های بارگذاری‌شده میان فراخوانی‌ها باقی می‌مانند.

یک python -c یک‌باره، هزینهٔ راه‌اندازی را برای هر پرسش می‌پردازد. بارگذاری یک دیتافریم چند ثانیه و صد مگابایت هزینه دارد و رسم نمودارش میلی‌ثانیه. وقتی هر پرسش هزینهٔ بارگذاری را داشته باشد، عامل پرسش‌های کمتری از آنچه باید می‌پرسد — و هر پاسخ به‌صورت متنی برمی‌گردد که بعداً باید دوباره تجزیه شود.

data/runs.csv را بارگذاری کن و مدت p95 را به تفکیک عامل به من بگو.

import pandas as pd
runs = pd.read_csv("data/runs.csv")
len(runs)

آخرین عبارت همان‌طور که یک نوتبوک بازتاب می‌دهد، چاپ می‌شود؛ بنابراین len(runs) بدون print تعداد سطرها را گزارش می‌کند.

سپس، در یک فراخوانی جداگانه:

runs.groupby("agent")["duration_ms"].quantile(0.95).sort_values()

runs هنوز بارگذاری‌شده است. یک دیتافریم pandas به‌جای repr به‌صورت جدول بازگردانده می‌شود.

import matplotlib.pyplot as plt
runs.groupby("agent")["duration_ms"].mean().plot.bar()

شکل‌ها پس از اجرای سلول ثبت و به‌صورت تصویر بازگردانده می‌شوند و رونوشت آن‌ها را نمایش می‌دهد. شما نمودار را می‌بینید؛ عامل هم می‌بیند.

شکل‌ها پس از ثبت بسته می‌شوند. شکل جمع‌نشده‌ای دوباره رسم می‌شد و سلول بعدی هم آن را دوباره می‌فرستاد؛ بنابراین یک نشست پنج‌سلولی اولین نمودار را پنج بار منتشر می‌کرد.

اصطلاحاتی که به‌هرحال تایپ می‌کردید

بخش با عنوان “اصطلاحاتی که به‌هرحال تایپ می‌کردید”

این‌ها به‌جای خطا دادن، به کد ساده بازنویسی می‌شوند:

چیزی که تایپ می‌کنید اتفاقی که می‌افتد
%pip install x pip را اجرا می‌کند و سپس کش ماژول را پاک می‌کند تا import بعدی آن را ببیند
%cd path os.chdir
!command یک زیرفرایند ثبت‌شده
%%bash بقیهٔ سلول به‌عنوان یک اسکریپت شل
%%timeit ۱۰۰۰ اجرای زمان‌سنجی‌شده

پاک‌کردن کش %pip همان چیزی است که اهمیت دارد: نصب‌کردن در یک مفسر زنده برای ماژولی که قبلاً وارد شده هیچ کاری نمی‌کند؛ بنابراین بدون آن، نسخه‌ای که تازه نصب کرده‌اید همان نسخه‌ای نیست که اجرا می‌شود.

صدا زدن ابزارهای خودتان از داخل یک سلول

بخش با عنوان “صدا زدن ابزارهای خودتان از داخل یک سلول”
paths = tool("find", {"pattern": "**/*.dart", "path": "lib"})
for path in paths.splitlines()[:100]:
contents = tool("read", {"path": path})
...

tool(name, args) دوباره به رجیستری ابزارهای خودِ عامل وارد می‌شود. یعنی یک سلول می‌تواند روی صدها فایل پخش شود، یا کار را از طریق task واگذار کند، بدون اینکه مدل برای هر مورد یک نوبت صرف کند.

یک فراخوانی پل‌شده تا وقتی در جریان است، مهلت سلول را معلق می‌کند. این بودجه عدم فعالیت را می‌سنجد، نه ساعت دیواری — سلولی که کار را به زیرعامل‌ها پخش می‌کند و چهار دقیقه منتظر می‌ماند معلق نیست، و کشتن آن در میانهٔ پخش، کل وضعیت کرنل را از دست می‌دهد.

eval(code: "…", reset: true, description: "Start a clean interpreter")

مفسر را دور می‌ریزد و یکی تمیز شروع می‌کند. هر چیزی که بارگذاری شده از دست می‌رود، که همین هدف است.

اگر گفتگو محفظه‌ای داشته باشد، در آن؛ در غیر این صورت روی میزبان.

یک مفسر پایدار که مدلی در حال خواندن یک مخزن نامعتبر آن را می‌راند، دقیقاً همان چیزی است که اجرای صرفاً در محفظه برای آن وجود دارد: یک فراخوانی bash یک‌باره دست‌کم پایان می‌یابد، در حالی که کرنل شلی است که به یاد می‌آورد.

برای رسیدن به آن، محفظه‌ای را راه‌اندازی نمی‌کند — همان قاعده‌ای که جلوی خودکار شروع شدن تب ریگ را می‌گیرد. اگر می‌خواهید کرنل در محفظه باشد، ابتدا شل گفتگو را باز کنید. به به عامل ماشینی برای تست بدهید نگاه کنید.

  • هر کرنل در هر لحظه یک سلول. دو سلول که در یک مفسر مسابقه بدهند، دو نیمه از دو برنامه‌اند که در یک فضای‌نام در هم بافته شده‌اند.
  • خروجی سقف دارد. سلولی که در حلقهٔ print است، به‌جای اینکه پنجرهٔ بافت را پر کند، بریده می‌شود.
  • چهار تصویر در هر سلول. یک حلقهٔ رسم می‌تواند در هر تکرار یک شکل منتشر کند، و هر تصویر در درخواستی که آن را حمل می‌کند یک هزینهٔ ثابت سنگین است.
  • کرنل با پایان اجرا می‌میرد. کرنلی که پس از پایان گفتگو هنوز دیتافریمی را نگه داشته باشد، یک نشت است.