Trong hướng dẫn này, chúng ta sẽ làm việc với tập dữ liệu Nemotron-Pretraining-Code-v3 của NVIDIA, được sử dụng như một chỉ mục siêu dữ liệu quy mô lớn cho nghiên cứu tiền huấn luyện mã nguồn. Thay vì tải xuống toàn bộ tập dữ liệu nhiều gigabyte, chúng ta sẽ truyền trực tuyến, kiểm tra lược đồ của nó và xây dựng một mẫu có thể quản lý được để phân tích. Sau đó, chúng ta khám phá tập dữ liệu bằng cách nghiên cứu các ngôn ngữ, phần mở rộng tệp, tần suất kho lưu trữ và độ sâu thư mục, điều này giúp chúng ta hiểu cấu trúc của chỉ mục. Tiếp theo, chúng ta tái tạo các URL GitHub thô từ siêu dữ liệu, cố gắng tìm nạp các tệp nguồn thực tế và ước tính quy mô token của mã nguồn đã tìm nạp.
Trong hướng dẫn này, chúng tôi làm việc với tập dữ liệu Nemotron-Pretraining-Code-v3 của NVIDIA như một chỉ mục siêu dữ liệu quy mô lớn cho nghiên cứu tiền huấn luyện mã. Thay vì tải xuống toàn bộ tập dữ liệu nhiều gigabyte, chúng tôi truyền trực tuyến, kiểm tra lược đồ của nó và xây dựng một mẫu có thể quản lý để phân tích. Sau đó, chúng tôi khám phá tập dữ liệu bằng cách nghiên cứu các ngôn ngữ, phần mở rộng tệp, tần suất kho lưu trữ và độ sâu thư mục, điều này giúp chúng tôi hiểu cách chỉ mục được cấu trúc. Sau đó, chúng tôi tái tạo các URL GitHub thô từ siêu dữ liệu, cố gắng tìm nạp các tệp nguồn thực tế và ước tính quy mô mã thông báo của mã đã tìm nạp. Đến cuối quy trình làm việc, chúng tôi tạo một mẫu được lọc có thể tái sử dụng và lưu các đầu ra đã xử lý để thử nghiệm thêm.
Truyền trực tuyến tập dữ liệu NVIDIA Nemotron-Pretraining-Code-v3 và kiểm tra lược đồ của nó
Sao chép mãĐã sao chépSử dụng trình duyệt khác
!pip -q install -U "datasets>=2.19" huggingface_hub tiktoken pyarrow 2>/dev/null
import os, io, time, itertools, collections, textwrap, math
import pandas as pd
import requests
import matplotlib.pyplot as plt
from datasets import load_dataset, get_dataset_config_names
REPO_ID = "nvidia/Nemotron-Pretraining-Code-v3"
pd.set_option("display.max_colwidth", 80)
configs = get_dataset_config_names(REPO_ID)
CONFIG = configs[0]
print(f"Configs available : {configs}")
print(f"Using config : {CONFIG}")
stream = load_dataset(REPO_ID, CONFIG, split="train", streaming=True)
print("\nFeatures / schema:")
print(stream.features)
print("\nFirst raw record:")
print(next(iter(stream)))
Chúng tôi thiết lập môi trường Colab bằng cách cài đặt các thư viện cần thiết và nhập các công cụ cần thiết để truyền trực tuyến, phân tích và trực quan hóa tập dữ liệu. Chúng tôi xác định ID tập dữ liệu NVIDIA Nemotron-Pretraining-Code-v3, khám phá cấu hình tập dữ liệu có sẵn và tải phân tách huấn luyện ở chế độ truyền trực tuyến. Chúng tôi cũng kiểm tra lược đồ tập dữ liệu và in bản ghi đầu tiên để hiểu cấu trúc trước khi tiến hành phân tích sâu hơn.
Xây dựng một mẫu ngẫu nhiên và phân tích các tính năng siêu dữ liệu mã
Sao chép mãĐã sao chépSử dụng trình duyệt khác
N_SAMPLE = 30_000
shuffled = stream.shuffle(seed=42, buffer_size=20_000)
t0 = time.time()
rows = list(itertools.islice(shuffled, N_SAMPLE))
df = pd.DataFrame(rows)
print(f"\nPulled {len(df):,} rows in {time.time()-t0:,.1f}s")
print(df.head(10))
print("\nColumns:", list(df.columns), "| memory:",
f"{df.memory_usage(deep=True).sum()/1e6:,.1f} MB")
df["ext"] = df["rel_path"].str.extract(r"\.([A-Za-z0-9_]+)$")[0].str.lower()
df["depth"] = df["rel_path"].str.count("/")
df["fname"] = df["rel_path"].str.rsplit("/", n=1).str[-1]
print("\n--- Top 15 languages (sample) ---")
lang_counts = df["language"].value_counts()
print(lang_counts.head(15))
print("\n--- Top 15 file extensions (sample) ---")
print(df["ext"].value_counts().head(15))
print("\n--- Most frequent repositories (sample) ---")
print(df["repo"].value_counts().head(10))
print("\n--- Path-depth summary ---")
print(df["depth"].describe())
print(f"\nUnique repos in sample : {df['repo'].nunique():,}")
print(f"Unique languages : {df['language'].nunique():,}")
Chúng tôi tạo một mẫu ngẫu nhiên từ tập dữ liệu được truyền trực tuyến để không chỉ dựa vào các hàng được nhóm đầu tiên. Chúng tôi chuyển đổi các bản ghi được lấy mẫu thành DataFrame của Pandas và tạo ra các tính năng hữu ích như phần mở rộng tệp, độ sâu đường dẫn và tên tệp. Sau đó, chúng tôi kiểm tra các ngôn ngữ, phần mở rộng tệp, kho lưu trữ và thống kê độ sâu đường dẫn phổ biến nhất để hiểu rõ hơn về siêu dữ liệu được lấy mẫu.
Trực quan hóa ngôn ngữ, phần mở rộng tệp, độ sâu thư mục và tần suất kho lưu trữ
Sao chép mãĐã sao chépSử dụng trình duyệt khác
fig, ax = plt.subplots(2, 2, figsize=(14, 9))
lang_counts.head(12).iloc[::-1].plot.barh(ax=ax[0, 0], color="#76b900")
ax[0, 0].set_title("Top 12 languages (sample)"); ax[0, 0].set_xlabel("files")
df["ext"].value_counts().head(12).iloc[::-1].plot.barh(ax=ax[0, 1], color="#5b8def")
ax[0, 1].set_title("Top 12 file extensions (sample)"); ax[0, 1].set_xlabel("files")
df["depth"].clip(upper=12).plot.hist(bins=range(0, 14), ax=ax[1, 0],
color="#f4a261", edgecolor="white")
ax[1, 0].set_title("Directory nesting depth"); ax[1, 0].set_xlabel("'/' count in path")
(df["repo"].value_counts().head(10).iloc[::-1]
.plot.barh(ax=ax[1, 1], color="#9b5de5"))
ax[1, 1].set_title("Most common repos (sample)"); ax[1, 1].set_xlabel("files")
plt.tight_layout(); plt.show()
Chúng tôi trực quan hóa các mẫu chính được tìm thấy trong siêu dữ liệu mẫu bằng nhiều biểu đồ. Chúng tôi so sánh các ngôn ngữ hàng đầu, phần mở rộng tệp hàng đầu, độ sâu lồng thư mục và các kho lưu trữ thường xuyên nhất trong mẫu. Chúng tôi sử dụng các biểu đồ này để làm cho tập dữ liệu dễ hiểu hơn và nhanh chóng xác định các cấu trúc nổi bật trong chỉ mục siêu dữ liệu.
Tái tạo URL GitHub thô và tìm nạp tệp nguồn thực
Sao chép mãĐã sao chépSử dụng trình duyệt khác
def raw_url(repo: str, commit_id: str, rel_path: str) -> str:
from urllib.parse import quote
return (f"https://raw.githubusercontent.com/{repo}/{commit_id}/"
f"{quote(rel_path)}")
df["raw_url"] = df.apply(lambda r: raw_url(r.repo, r.commit_id, r.rel_path), axis=1)
print("\nExample reconstructed URLs:")
for u in df["raw_url"].head(5):
print(" ", u)
def fetch_code(url: str, max_bytes: int = 200_000, timeout: int = 10):
try:
resp = requests.get(url, timeout=timeout)
if resp.status_code == 200 and len(resp.content) <= max_bytes:
return resp.text
return None
except requests.RequestException:
return None
print("\n--- Attempting to fetch a few real files ---")
fetched, attempts = [], 0
for _, r in df.sample(frac=1, random_state=1).iterrows():
if len(fetched) >= 5:
break
attempts += 1
code = fetch_code(r["raw_url"])
status = "OK " if code else "MISS"
print(f"[{status}] {r['language']:<12} {r['repo']}/{r['rel_path']}")
if code:
fetched.append({**r.to_dict(), "code": code, "n_chars": len(code)})
print(f"\nFetched {len(fetched)} files in {attempts} attempts "
f"(misses are normal — repos get deleted/renamed).")
if fetched:
ex = fetched[0]
print(f"\n----- PREVIEW: {ex['repo']}/{e
Nguồn tin: MarkTechPost — Tác giả: Sana Hassan. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.