چیت‌شیت

پایپ‌لاین‌های داده‌ی پیش‌آموزش

Pre-Training Data Pipelines

پاک‌سازی، حذف موارد تکراری، دانلود، توکن‌سازی، شاردبندی و پنجره‌بندی پیکره متنی پیش‌آموزش. کدهای پایتون از درس‌ها.

  • ۱۲ بخش
  • ۴ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. وظایف
  2. تبدیل پیکره متنی به دسته
  3. پاک‌سازی و فیلتر
  4. مراحل پاک‌سازی
  5. مجموعه‌داده‌ی پنجره‌ی لغزان
  6. ازسرگیری یک دانلود
  7. پیش‌فرض‌های حذف تکرار و فیلتر
  8. پیش‌فرض‌های ذخیره‌سازی
  9. اعداد و فرمول‌ها
  10. عیب‌یابی
  11. پرسش و پاسخ
  12. نکات

وظایف

کار و کد
وظیفهکد
اجرای دموی درسpython3 code/main.py
اجرای تست‌هاpython3 -m unittest discover code/tests -v
حذف موارد تقریباً تکراریdeduplicate(filtered_docs, threshold=0.8)
بسته‌بندی شناسه‌ها درون توالی‌هاpack_sequences(token_ids, seq_length, pad_id=0)
دانلود یک شاردprocess_shard(plan, downloader, dedup, manifest)
نوشتن شاردهای HDF5pipeline.write_corpus(shards)
بررسی هش‌های شاردvalidate_corpus(entries)
خواندن یک بازه از توکن‌هاstore.get_slice(start, stop)

تبدیل پیکره متنی به دسته

معماری
GETبایت‌هااسناداحکام ارزیابیشاردهای JSONLshards.jsonget_sliceنشانی‌های وب شاردهاShardPlannerStreamingDownloaderازسرگیری با RangeZstdDocIteratorیک سند در هر خطحذف موارد تکراریMinHasher + LSHIndexmanifest.jsonهش sha256 شاردHDF5ShardWriterیک فایل .h5 به ازای هر شاردMmapTokenStoreخوانش‌های swmrSlidingWindowDataloaderinput, target

پاک‌سازی و فیلتر

کد
python
def clean_text(text):
    text = re.sub(r"<[^>]+>", "", text)         # حذف تگ‌های HTML
    text = re.sub(r"http\S+", "", text)         # حذف نشانی‌های وب
    text = re.sub(r"[^\x20-\x7E\n]", "", text)  # فقط کاراکترهای اسکی قابل چاپ
    text = re.sub(r"\n{3,}", "\n\n", text)      # ادغام خطوط خالی
    text = re.sub(r" {2,}", " ", text)          # ادغام فاصله‌ها
    return text.strip()

def quality_filter(text, min_words=50, max_ratio_caps=0.3, max_ratio_special=0.1):
    ...                                         # خروجی False برای استاب‌ها، هرزنامه‌های تمام‌بزرگ، نویز نمادها

مراحل پاک‌سازی

گام‌به‌گام
  1. حذف HTMLفقط متن نمایان حفظ شود.
  2. تشخیص زبانمدل fastText با نام lid.176.bin. اطمینان زیر 0.8 به معنای انگلیسی غیرتمیز است.
  3. فیلتر کیفیتپرپلکسیتی بالا نسبت به مدل ویکی‌پدیا نشانه هرزنامه است.
  4. حذف موارد تکراریروش MinHash به همراه LSH. یک نسخه در ژاکارد بالای 0.8 حذف شود.
  5. حذف PIIرجکس برای اطلاعات هویتی ساخت‌یافته، مدل‌های NER برای اسامی.
  6. توکن‌سازی و بسته‌بندیدرج tokenizer.eos_id در انتهای هر سند.

مجموعه‌داده‌ی پنجره‌ی لغزان

کد
python
ds = SlidingWindowDataset(ids, context_length=16, stride=8)          # مقدار None برای استراید یعنی context_length
SlidingWindowDataset.count_windows(num_ids, context_length, stride)  # 1 + usable // stride
x, y = ds[0]                                                         # window[:-1], window[1:]
loader = make_dataloader(ds, batch_size=4, base_seed=7, epoch=0)
generator.manual_seed(base_seed + epoch)                             # سید یکسان، ترتیب یکسان

ازسرگیری یک دانلود

گام‌به‌گام
  1. StreamingDownloaderفایل <shard_id>.partial.json را از کنار <shard_id>.zst می‌خواند.
  2. _verify_partialحجم فایل باید برابر با verified_bytes باشد. هش sha256 باید برابر با sha256_prefix_hex باشد.
  3. عدم تطابقشارد و چک‌پوینت حذف شوند. شروع مجدد از بایت صفر.
  4. تطابقهدر Range به شکل bytes={resume_from}- ارسال شده و شارد در حالت ab باز شود.
  5. بررسی پاسخوضعیت باید 206 همراه با Content-Range منطبق باشد. در غیر این صورت، یک GET کامل ارسال شود.
  6. در هر چانکاجرای _write_checkpoint با os.replace و سپس out.write(buf).

پیش‌فرض‌های حذف تکرار و فیلتر

پیش‌فرض‌ها
تنظیمپیش‌فرضیادداشت
min_words50رد صفحات استاب
max_ratio_caps0.3رد هرزنامه‌های تمام‌بزرگ
max_ratio_special0.1رد نویز نمادها
threshold0.8ژاکارد برای حذف نسخه تکراری
num_hashes128طول امضا
bands16درس 03. در درس 42 از DEFAULT_BANDS = 32 استفاده می‌شود
DEFAULT_SHINGLE_WIDTH5دمو از shingle_width=3 استفاده می‌کند
CHUNK_BYTES1 << 16اندازه‌ی خواندن دانلود

پیش‌فرض‌های ذخیره‌سازی

پیش‌فرض‌ها
تنظیمپیش‌فرضیادداشت
DEFAULT_CHUNK_SIZE8192دمو از chunk_size=512 استفاده می‌کند
DEFAULT_WINDOW_SIZE64خواندن window_size + 1 توکن
BOUNDARY_TOKEN_ID0جداکننده بین اسناد
TOKEN_DTYPEnp.uint16شناسه‌های بایتی با یک واحد جابه‌جایی
maxshape(None,)مجموعه‌داده با اندازه متغیر
libver"latest"برای SWMR روی نویسنده ضروری است

اعداد و فرمول‌ها

مفهوم‌ها
تعداد پنجره‌ها
max(0, 1 + (N - (T + 1)) // S) برای N شناسه، طول زمینه T، استراید S.
استراید
مقدار T // 2 حجم مجموعه‌داده را دو برابر می‌کند. مقدار 1 آن را به ضریب T می‌رساند.
تصادم LSH
فرمول 1 - (1 - s^r)^b با k = b * r.
آستانه LSH
نزدیک به (1/b)^(1/r). برای b=32 و r=4 نزدیک به s = 0.42 است.
فشرده‌سازی
انگلیسی حدود 3-4 کاراکتر به ازای هر توکن است.
بهره‌وری توالی
زیر 90% یعنی بسته‌بندی توان محاسباتی را هدر می‌دهد.
بازده حذف تکرار
تیم Llama حدود 38% از داده‌های وب را حذف کرد.
چینچیلا
پارامترها و توکن‌ها را تقریباً به یک اندازه مقیاس‌دهی کنید.

عیب‌یابی

عیب‌یابی
  • شارد ازسرگرفته‌شده داده‌ی نامعتبر دارد

    علت
    آفست و فایل هم‌خوانی ندارند
    راه‌حل
    ابتدا پیشوند sha256 را بررسی کنید
  • سرور هدر Range را نادیده می‌گیرد

    علت
    وضعیت 206 نیست
    راه‌حل
    آن را ببندید و یک GET کامل انجام دهید
  • پسوند تکراری پس از قطع برق

    علت
    بایت‌ها قبل از چک‌پوینت نوشته شده‌اند
    راه‌حل
    ابتدا چک‌پوینت، سپس نوشتن داده
  • مدل یاد می‌گیرد صفر را پیش‌بینی کند

    علت
    خواننده پدینگ‌های صفر را می‌خواند
    راه‌حل
    برش داده در مرز token_count
  • خطای «file is locked»

    علت
    عدم وجود libver="latest" یا فعال‌سازی دیرهنگام SWMR
    راه‌حل
    مجموعه‌داده‌ها را بسازید، سپس swmr_mode را فعال کنید
  • نرخ پردازش نصف می‌شود

    علت
    چانک با پنجره هم‌خوانی ندارد
    راه‌حل
    چانک مضربی از window_size باشد
  • اجراها بدون دلیل مشخص دچار واگرایی می‌شوند

    علت
    عدم تنظیم سید بر زدن داده‌ها
    راه‌حل
    ارسال base_seed به ازای هر اپوک
  • خطای ValueError از سوی LSHIndex

    علت
    مقدار bands بر num_hashes بخش‌پذیر نیست
    راه‌حل
    انتخاب اعدادی برای bands که 128 بر آن‌ها بخش‌پذیر باشد

پرسش و پاسخ

پرسش و پاسخ
چرا به‌جای پدینگ از بسته‌بندی استفاده کنیم؟
پدینگ توان محاسباتی را روی توکن‌هایی که آموزنده نیستند تلف می‌کند.
چرا ماسک بلوکی-قطری؟
توکن‌های سند A نباید به توکن‌های سند B توجه کنند.
برش‌دهنده با انتهای کوتاه داده چه می‌کند؟
پنجره‌ی آخر را دور می‌اندازد.
چرا حذف تکرار پیش از توکن‌سازی؟
توکن‌سازی سنگین و گران است. نباید هزینه‌ی آن را دو بار پرداخت.
چرا برای موارد تکراری سنگ مزار ثبت شود؟
مانیفست پیوند با سند نگه‌داری‌شده را حفظ می‌کند.
چرا یک HDF5 به ازای هر شارد مبدأ؟
در صورت کرش، حداکثر یک شارد از دست می‌رود.

نکات

نکته‌ها
  • فرایندهای آموزش shards.json را می‌خوانند، نه لیست محتویات دایرکتوری را.
  • پیش از اعتماد به ردیف‌های شارد، هش sha256 مانیفست را در manifest.lock بررسی کنید.
  • بعد از هر تغییر اندازه در حالت SWMR متد dataset.flush() را فراخوانی کنید.
  • توکن‌ها را تا حجم چانک بافر کنید، سپس اندازه را تغییر دهید. هرگز اسناد را تک‌تک ننویسید.
  • بیشتر اجراها از استراید برابر با طول زمینه استفاده می‌کنند.