reafactor: 使用h5 文件格式存储

This commit is contained in:
2026-02-27 17:31:54 +08:00
parent 617ef7164d
commit c32784bf9f
2 changed files with 43 additions and 7 deletions
View File
+43 -7
View File
@@ -1,11 +1,12 @@
from typing import Dict, List, Callable, Union from typing import Dict, List, Callable, Tuple, Union
from datasets import DatasetDict from datasets import DatasetDict
from .tokenizer import BpeTokenizer import numpy as np
from modules.tokenizer import BpeTokenizer
from tqdm import tqdm from tqdm import tqdm
from torch import Tensor from torch import Tensor
import pickle as pkl
import torch import torch
import h5py
import json import json
import os import os
import re import re
@@ -25,6 +26,42 @@ def fetch_folders(root_dir, filter_func=None):
folders.append(folder_path) folders.append(folder_path)
return folders return folders
def save_h5(file_path: str, tensor_group: Dict[str, List[Tensor]]):
os.makedirs(os.path.dirname(file_path), exist_ok=True)
with h5py.File(file_path, 'w') as f:
for key, tensors in tensor_group.items():
grp = f.create_group(key)
grp.attrs['num_tensors'] = len(tensors)
for idx, tensor in enumerate(tensors):
arr = tensor.cpu().numpy()
dset = grp.create_dataset(
f'data_{idx}',
data=arr,
compression='gzip',
compression_opts=4,
shuffle=True
)
dset.attrs['numel'] = tensor.numel()
def load_h5(file_path: str) -> Tuple[Dict[str, List[Tensor]], int]:
tensor_group: Dict[str, List[Tensor]] = {}
total_samples = 0
with h5py.File(file_path, 'r') as f:
for key in f.keys():
grp = f[key]
dsets = []
for dset_name in grp.keys():
dset = grp[dset_name]
dsets.append(torch.from_numpy(dset[:]).share_memory_())
total_samples += dset.attrs.get('numel', np.prod(dset.shape))
tensor_group[key] = dsets
num_keys = max(len(tensor_group), 1)
sample_per_key = total_samples // num_keys
return tensor_group, sample_per_key
def comprehensive_normalization(text): def comprehensive_normalization(text):
replacements = { replacements = {
@@ -62,7 +99,7 @@ def pack_sequences(sequences: List[Tensor], pack_size: int, pad_value: int) -> L
return packages return packages
def dump_pkl_files( def dump_files(
files: List[str], files: List[str],
base_out_dir: str, base_out_dir: str,
process_func: Callable[[dict], dict], process_func: Callable[[dict], dict],
@@ -101,8 +138,7 @@ def dump_pkl_files(
sequence = torch.cat(package[key]) sequence = torch.cat(package[key])
output_package[key] = sequence output_package[key] = sequence
with open(out_file_path, "wb") as f: save_h5(out_file_path, output_package)
pkl.dump(output_package, f)
def get_pt_processor(tokenizer: BpeTokenizer): def get_pt_processor(tokenizer: BpeTokenizer):
@@ -151,7 +187,7 @@ def cache_files(tokenizer, files, base_out_dir, cache_type, packing_size: int =
else: else:
raise ValueError("Invalid cache type") raise ValueError("Invalid cache type")
dump_pkl_files(files, base_out_dir, processor, keys, packing_size, pad_value) dump_files(files, base_out_dir, processor, keys, packing_size, pad_value)
def process_dataset( def process_dataset(