İçeriğe geç

Kalıcı bir kernel’de veri keşfetme

Bu kılavuz, bir ajana pahalı bir şeyi bir kez yükletip ardından ona birkaç soru sordurmayı — her soruda yükleme bedelini ödemek yerine — nasıl yapacağınızı gösterir.

eval aracı kalıcı bir yorumlayıcı çalıştırır. Değişkenler, içe aktarmalar ve yüklenen veriler çağrılar arasında yaşamaya devam eder.

Tek atımlık bir python -c, her soruda kurulum bedelini öder. Bir dataframe yüklemek saniyeler ve yüz megabayt tutar; grafiğini çizmekse milisaniyeler. Her soru bu yüklemeyle başladığında ajan, sorması gerekenden daha az soru sorar — ve her yanıt, yeniden ayrıştırmak zorunda kaldığı metin olarak geri döner.

data/runs.csv dosyasını yükle ve bana ajan bazında p95 süresini söyle.

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

Son ifade, bir notebook’un yaptığı gibi yankılanır; böylece len(runs) satır sayısını bir print olmadan bildirir.

Ardından, ayrı bir çağrıda:

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

runs hâlâ yüklüdür. Bir pandas frame’i, bir repr yerine tablo olarak işlenmiş hâlde geri döner.

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

Şekiller hücreden sonra yakalanır ve görüntü olarak döndürülür; transkript bunları işler. Grafiği siz de görürsünüz, ajan da.

Şekiller yakalandıktan sonra kapatılır. Toplanmayan bir şekil, sonraki hücre tarafından da yeniden çizilip yeniden gönderilirdi; bu yüzden beş hücrelik bir oturum ilk grafiği beş kez yayardı.

Bunlar hata vermek yerine düz koda dönüştürülür:

Yazdığınız Ne olur
%pip install x pip’i çalıştırır, ardından modül önbelleğini temizler; böylece sonraki import onu görür
%cd path os.chdir
!command Çıktısı yakalanan bir alt süreç
%%bash Hücrenin geri kalanı, bir shell betiği olarak
%%timeit 1000 zamanlı çalıştırma

Asıl önemli olan, %pip’in önbelleği boşaltmasıdır: canlı bir yorumlayıcıya kurulum yapmak, zaten içe aktarılmış bir modül için hiçbir şey değiştirmez; bu yüzden o olmadan, az önce kurduğunuz sürüm çalışmakta olan sürüm değildir.

Kendi araçlarınızı bir hücrenin içinden çağırma

Bölüm başlığı “Kendi araçlarınızı bir hücrenin içinden çağırma”
paths = tool("find", {"pattern": "**/*.dart", "path": "lib"})
for path in paths.splitlines()[:100]:
contents = tool("read", {"path": path})
...

tool(name, args), ajanın kendi araç kaydına yeniden girer. Bu da bir hücrenin yüzlerce dosyaya dağılabileceği veya task üzerinden devredebileceği anlamına gelir; modelin her öğe için bir tur harcamasına gerek kalmaz.

Köprü üzerinden gelen bir çağrı, sürdüğü sürece hücrenin zaman aşımını askıya alır. Bütçe, duvar saatini değil hareketsizliği ölçer — alt ajanlara dağılan ve dört dakika bekleyen bir hücre takılmış sayılmaz ve onu dağıtımın ortasında öldürmek tüm kernel durumunu kaybettirirdi.

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

Yorumlayıcıyı atar ve temiz bir tane başlatır. Yüklenmiş her şey gitmiş olur; mesele de zaten bu.

Konuşmanın bir enclosure’ı varsa orada, yoksa ana makinede çalışır.

Güvenilmeyen bir depoyu okuyan bir model tarafından sürülen kalıcı bir yorumlayıcı, yalnızca enclosure içinde çalıştırmanın tam da var olma sebebidir: tek atımlık bir bash çağrısı en azından biter, oysa bir kernel hatırlayan bir kabuktur.

Bunun için bir enclosure başlatmaz — bir rig sekmesinin kendiliğinden başlamasını engelleyen kuralın aynısı. Kernel’in enclosure içinde olmasını istiyorsanız, önce konuşmanın shell’ini açın. Bkz. Bir ajana test için makine verme.

  • Kernel başına aynı anda tek hücre. Tek bir yorumlayıcıda yarışan iki hücre, iki programın iki yarısının tek bir ad alanında iç içe geçmesidir.
  • Çıktı sınırlandırılır. Döngü içinde print yapan bir hücrenin çıktısı, bağlam penceresini doldurmasına izin verilmek yerine kesilir.
  • Hücre başına dört görüntü. Bir grafik döngüsü her yinelemede bir şekil üretebilir ve her görüntü, onu taşıyan istekte büyük sabit bir maliyettir.
  • Kernel, çalıştırmayla birlikte ölür. Konuşma bittikten sonra hâlâ bir dataframe tutan kernel bir sızıntıdır.