ModerRAS commited on
Commit
be6a29a
·
1 Parent(s): 8c50d16

Train augmented anime filename parser

Browse files
.gitignore CHANGED
@@ -16,3 +16,5 @@ data/**/*.jsonl
16
  !data/test_smoke.jsonl
17
  data/**/*.db
18
  data/**/*.sqlite
 
 
 
16
  !data/test_smoke.jsonl
17
  data/**/*.db
18
  data/**/*.sqlite
19
+ data/generated/
20
+ reports/generated/
README.md CHANGED
@@ -142,15 +142,15 @@ Current published checkpoint:
142
  | --- | --- |
143
  | Fixed regression, model-only / 固定回归,纯模型聚合 | 25/26 full match = `96.15%` |
144
  | Fixed regression, default thin runtime / 固定回归,默认薄层运行时 | 26/26 full match = `100%` |
145
- | Focus held-out, model-only / 困难抽样,纯模型聚合 | 1014/1024 full match = `99.02%` |
146
- | Focus held-out, default thin runtime / 困难抽样,默认薄层运行时 | 1017/1024 full match = `99.32%` |
147
- | Token/entity eval / token/entity 评估 | F1 `0.9972`, token accuracy `0.9995` |
148
- | ONNX parity / ONNX 误差 | max abs diff `4.0531e-05` |
149
- | CPU thin-runtime latency / CPU 薄层运行时延迟 | ONNX avg `13.18 ms`, P95 `16.70 ms` |
150
 
151
- **中文**:当前发布模型是“两阶段训练”产物:先在 `datasets/AnimeName/dmhy_weak_char.jsonl` 上全量 CUDA 重训,再做 thin hard-case focus 微调。细节见 `reports/training_lineage.json`。README 主指标以 `model-only` 和默认薄层 `normalized-only` 为准;旧版结构规则辅助层已移除,不再作为运行时或质量对照。
152
 
153
- **English**: The published checkpoint was trained in two stages: a full CUDA fine-tune on `datasets/AnimeName/dmhy_weak_char.jsonl`, followed by a thin hard-case focus fine-tune. See `reports/training_lineage.json` for details. README quality numbers prioritize `model-only` and the default thin `normalized-only` runtime; structural filename assists have been removed from the runtime and quality reports.
154
 
155
  Run regression:
156
 
@@ -177,8 +177,8 @@ decoding, entity aggregation, and light string/number normalization:
177
 
178
  | Backend / 后端 | Load ms / 加载 ms | Avg ms / 平均 ms | P50 ms | P95 ms | P99 ms | files/s |
179
  | --- | ---: | ---: | ---: | ---: | ---: | ---: |
180
- | PyTorch | 76.56 | 16.85 | 16.21 | 22.84 | 28.31 | 59.4 |
181
- | ONNX Runtime | 49.74 | 13.18 | 12.86 | 16.70 | 18.06 | 75.9 |
182
 
183
  **中文**:这是完整薄层 parser 的端到端延迟,不是只测模型 forward。移动端实现应复用 ONNX session,并保持 tokenizer/BIO/薄规范化逻辑一致。
184
 
@@ -188,27 +188,33 @@ decoding, entity aggregation, and light string/number normalization:
188
 
189
  Training uses the dataset submodule at `datasets/AnimeName`.
190
 
191
- Recommended full character-token run:
192
 
193
  ```powershell
194
- uv run python -m anifilebert.train --tokenizer char `
195
  --data-file datasets/AnimeName/dmhy_weak_char.jsonl `
196
- --vocab-file datasets/AnimeName/vocab.char.json `
197
- --save-dir checkpoints/dmhy-char-full `
198
  --init-model-dir . `
199
- --epochs 2 `
200
- --batch-size 256 `
201
- --learning-rate 0.00008 `
202
- --warmup-steps 300 `
203
  --max-seq-length 128 `
204
  --train-split 0.98 `
205
- --num-workers 4 `
206
  --checkpoint-steps 1000 `
207
  --save-total-limit 3 `
208
  --parse-eval-limit 2048 `
209
  --case-eval-file data/parser_regression_cases.json `
210
- --seed 52 `
211
- --experiment-name dmhy-char-full
 
 
 
 
 
 
212
  ```
213
 
214
  `python -m anifilebert.train` writes:
@@ -218,6 +224,7 @@ uv run python -m anifilebert.train --tokenizer char `
218
  - `final/trainer_eval_metrics.json`,
219
  - `final/parse_eval_metrics.json`,
220
  - `final/case_metrics.json` unless `--no-case-eval` is used,
 
221
  - TensorBoard logs unless `--no-tensorboard` is used.
222
 
223
  Full workflow: [`docs/training.md`](docs/training.md).
 
142
  | --- | --- |
143
  | Fixed regression, model-only / 固定回归,纯模型聚合 | 25/26 full match = `96.15%` |
144
  | Fixed regression, default thin runtime / 固定回归,默认薄层运行时 | 26/26 full match = `100%` |
145
+ | Held-out parse, model-only / held-out 解析,纯模型聚合 | 1947/2048 full match = `95.07%` |
146
+ | Held-out parse, default thin runtime / held-out 解析,默认薄层运行时 | 1966/2048 full match = `96.00%` |
147
+ | Token/entity eval / token/entity 评估 | F1 `0.9847`, token accuracy `0.9962` |
148
+ | ONNX parity / ONNX 误差 | max abs diff `1.9073e-05` |
149
+ | CPU thin-runtime latency / CPU 薄层运行时延迟 | ONNX avg `11.61 ms`, P95 `13.52 ms` |
150
 
151
+ **中文**:当前发布模型是“两阶段训练”产物:先在 `datasets/AnimeName/dmhy_weak_char.jsonl` 上 10 epoch CUDA 全量重训,并在训练时动态生成不完整文件名、BIO 块重排/子集和 special 片段样本;再做 thin hard-case focus 微调。细节见 `reports/training_lineage.json`。README 主指标以 `model-only` 和默认薄层 `normalized-only` 为准;旧版结构规则辅助层已移除,不再作为运行时或质量对照。
152
 
153
+ **English**: The published checkpoint was trained in two stages: a 10-epoch CUDA fine-tune on `datasets/AnimeName/dmhy_weak_char.jsonl` with dynamic in-memory augmentation for incomplete filenames, BIO-block subsets/permutations, and special-code fragments, followed by a thin hard-case focus fine-tune. See `reports/training_lineage.json` for details. README quality numbers prioritize `model-only` and the default thin `normalized-only` runtime; structural filename assists have been removed from the runtime and quality reports.
154
 
155
  Run regression:
156
 
 
177
 
178
  | Backend / 后端 | Load ms / 加载 ms | Avg ms / 平均 ms | P50 ms | P95 ms | P99 ms | files/s |
179
  | --- | ---: | ---: | ---: | ---: | ---: | ---: |
180
+ | PyTorch | 44.84 | 16.42 | 14.77 | 26.31 | 32.62 | 60.9 |
181
+ | ONNX Runtime | 40.70 | 11.61 | 11.43 | 13.52 | 15.20 | 86.2 |
182
 
183
  **中文**:这是完整薄层 parser 的端到端延迟,不是只测模型 forward。移动端实现应复用 ONNX session,并保持 tokenizer/BIO/薄规范化逻辑一致。
184
 
 
188
 
189
  Training uses the dataset submodule at `datasets/AnimeName`.
190
 
191
+ Recommended optimized character-token run on the Windows RTX 5070 Ti worker:
192
 
193
  ```powershell
194
+ .\.venv\Scripts\python.exe -m anifilebert.train --tokenizer char `
195
  --data-file datasets/AnimeName/dmhy_weak_char.jsonl `
196
+ --vocab-file vocab.json `
197
+ --save-dir checkpoints/dmhy-char-aug-fragments-optimized-10epoch `
198
  --init-model-dir . `
199
+ --epochs 10 `
200
+ --batch-size 1792 `
201
+ --learning-rate 0.00002 `
202
+ --warmup-steps 500 `
203
  --max-seq-length 128 `
204
  --train-split 0.98 `
205
+ --num-workers 0 `
206
  --checkpoint-steps 1000 `
207
  --save-total-limit 3 `
208
  --parse-eval-limit 2048 `
209
  --case-eval-file data/parser_regression_cases.json `
210
+ --augment-partial-samples 200000 `
211
+ --augment-permutation-samples 400000 `
212
+ --augment-special-samples 80000 `
213
+ --bf16 `
214
+ --no-periodic-eval `
215
+ --perf-log-steps 200 `
216
+ --seed 105 `
217
+ --experiment-name dmhy-char-aug-fragments-optimized-10epoch
218
  ```
219
 
220
  `python -m anifilebert.train` writes:
 
224
  - `final/trainer_eval_metrics.json`,
225
  - `final/parse_eval_metrics.json`,
226
  - `final/case_metrics.json` unless `--no-case-eval` is used,
227
+ - `final/perf_metrics.json` when `--perf-log-steps` is set,
228
  - TensorBoard logs unless `--no-tensorboard` is used.
229
 
230
  Full workflow: [`docs/training.md`](docs/training.md).
anifilebert/dataset.py CHANGED
@@ -7,16 +7,158 @@ Handles token-ID conversion, label encoding, padding, and truncation.
7
 
8
  import json
9
  from collections import Counter
 
10
  import torch
11
  from torch.utils.data import Dataset
12
- from typing import Dict, List, Optional, Tuple
13
 
14
  from .config import Config
15
  from .label_repairs import repair_sequel_season_labels
16
  from .tokenizer import AnimeTokenizer
17
 
18
 
19
- class AnimeDataset(Dataset):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  """
21
  Dataset for anime filename token classification.
22
 
@@ -41,65 +183,13 @@ class AnimeDataset(Dataset):
41
  label2id: Mapping from label string to integer ID.
42
  max_length: Maximum sequence length (including special tokens).
43
  """
44
- self.tokenizer = tokenizer
45
- self.label2id = label2id
46
- self.max_length = max_length
47
-
48
- # Load data
49
- self.data: List[Dict] = []
50
  with open(data_path, 'r', encoding='utf-8') as f:
51
  for line in f:
52
  line = line.strip()
53
  if line:
54
- self.data.append(json.loads(line))
55
-
56
- def __len__(self) -> int:
57
- return len(self.data)
58
-
59
- def __getitem__(self, idx: int) -> Dict[str, torch.Tensor]:
60
- """
61
- Get a preprocessed sample.
62
-
63
- Returns:
64
- Dictionary with input_ids, attention_mask, labels as LongTensors.
65
- """
66
- item = self.data[idx]
67
- tokens, labels = labels_for_tokenizer(item, self.tokenizer)
68
-
69
- # Convert tokens to IDs
70
- input_ids = self.tokenizer.convert_tokens_to_ids(tokens)
71
-
72
- # Add [CLS] at start and [SEP] at end
73
- input_ids = [self.tokenizer.cls_token_id] + input_ids + [self.tokenizer.sep_token_id]
74
-
75
- # Convert labels to IDs, with -100 for special tokens
76
- label_ids: List[int] = [-100] # [CLS] → -100 (ignored in loss)
77
- for label in labels:
78
- label_ids.append(self.label2id.get(label, 0)) # default to O
79
- label_ids.append(-100) # [SEP] → -100
80
-
81
- # Attention mask: 1 for real tokens
82
- attention_mask = [1] * len(input_ids)
83
-
84
- # Truncate if needed (keep CLS at 0, SEP at end)
85
- if len(input_ids) > self.max_length:
86
- # Keep first token (CLS), truncate middle, keep last token (SEP)
87
- input_ids = [input_ids[0]] + input_ids[1:self.max_length - 1] + [input_ids[-1]]
88
- label_ids = [label_ids[0]] + label_ids[1:self.max_length - 1] + [label_ids[-1]]
89
- attention_mask = [attention_mask[0]] + attention_mask[1:self.max_length - 1] + [attention_mask[-1]]
90
-
91
- # Pad to max_length
92
- pad_len = self.max_length - len(input_ids)
93
- if pad_len > 0:
94
- input_ids += [self.tokenizer.pad_token_id] * pad_len
95
- label_ids += [-100] * pad_len
96
- attention_mask += [0] * pad_len
97
-
98
- return {
99
- "input_ids": torch.tensor(input_ids, dtype=torch.long),
100
- "attention_mask": torch.tensor(attention_mask, dtype=torch.long),
101
- "labels": torch.tensor(label_ids, dtype=torch.long),
102
- }
103
 
104
 
105
  def align_tokens_for_tokenizer(
@@ -177,6 +267,23 @@ def labels_for_tokenizer(
177
  return align_tokens_for_tokenizer(source_tokens, source_labels, tokenizer)
178
 
179
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
  def token_offsets_in_text(text: str, tokens: List[str]) -> Optional[List[Tuple[int, int]]]:
181
  """Find token character offsets by scanning left to right."""
182
  offsets: List[Tuple[int, int]] = []
 
7
 
8
  import json
9
  from collections import Counter
10
+ import numpy as np
11
  import torch
12
  from torch.utils.data import Dataset
13
+ from typing import Dict, List, Optional, Sequence, Tuple
14
 
15
  from .config import Config
16
  from .label_repairs import repair_sequel_season_labels
17
  from .tokenizer import AnimeTokenizer
18
 
19
 
20
+ def encode_token_classification_values(
21
+ item: Dict,
22
+ tokenizer: AnimeTokenizer,
23
+ label2id: Dict[str, int],
24
+ max_length: int,
25
+ apply_label_repairs: bool = True,
26
+ vocab: Optional[Dict[str, int]] = None,
27
+ ) -> Tuple[List[int], List[bool], List[int]]:
28
+ tokens, labels = training_labels_for_tokenizer(item, tokenizer, apply_label_repairs)
29
+
30
+ token_vocab = vocab if vocab is not None else tokenizer.get_vocab()
31
+ unk_id = tokenizer.unk_token_id if tokenizer.unk_token_id is not None else 1
32
+ input_ids = [token_vocab.get(token, unk_id) for token in tokens]
33
+ input_ids = [tokenizer.cls_token_id] + input_ids + [tokenizer.sep_token_id]
34
+
35
+ label_ids: List[int] = [-100]
36
+ label_ids.extend(label2id.get(label, 0) for label in labels)
37
+ label_ids.append(-100)
38
+
39
+ attention_mask = [1] * len(input_ids)
40
+
41
+ if len(input_ids) > max_length:
42
+ input_ids = [input_ids[0]] + input_ids[1:max_length - 1] + [input_ids[-1]]
43
+ label_ids = [label_ids[0]] + label_ids[1:max_length - 1] + [label_ids[-1]]
44
+ attention_mask = [attention_mask[0]] + attention_mask[1:max_length - 1] + [attention_mask[-1]]
45
+
46
+ pad_len = max_length - len(input_ids)
47
+ if pad_len > 0:
48
+ input_ids += [tokenizer.pad_token_id] * pad_len
49
+ label_ids += [-100] * pad_len
50
+ attention_mask += [0] * pad_len
51
+
52
+ return input_ids, [bool(value) for value in attention_mask], label_ids
53
+
54
+
55
+ def encode_token_classification_item(
56
+ item: Dict,
57
+ tokenizer: AnimeTokenizer,
58
+ label2id: Dict[str, int],
59
+ max_length: int,
60
+ apply_label_repairs: bool = True,
61
+ vocab: Optional[Dict[str, int]] = None,
62
+ ) -> Dict[str, torch.Tensor]:
63
+ input_ids, attention_mask, label_ids = encode_token_classification_values(
64
+ item,
65
+ tokenizer,
66
+ label2id,
67
+ max_length,
68
+ apply_label_repairs,
69
+ vocab,
70
+ )
71
+
72
+ return {
73
+ "input_ids": torch.tensor(input_ids, dtype=torch.long),
74
+ "attention_mask": torch.tensor(attention_mask, dtype=torch.bool),
75
+ "labels": torch.tensor(label_ids, dtype=torch.long),
76
+ }
77
+
78
+
79
+ class AnimeItemsDataset(Dataset):
80
+ """Map-style dataset backed by already-loaded JSONL items."""
81
+
82
+ def __init__(
83
+ self,
84
+ data: Sequence[Dict],
85
+ tokenizer: AnimeTokenizer,
86
+ label2id: Dict[str, int],
87
+ max_length: int = 64,
88
+ apply_label_repairs: bool = True,
89
+ ):
90
+ self.data = data
91
+ self.tokenizer = tokenizer
92
+ self.label2id = label2id
93
+ self.max_length = max_length
94
+ self.apply_label_repairs = apply_label_repairs
95
+ self.vocab = tokenizer.get_vocab()
96
+
97
+ def __len__(self) -> int:
98
+ return len(self.data)
99
+
100
+ def __getitem__(self, idx: int) -> Dict[str, torch.Tensor]:
101
+ return encode_token_classification_item(
102
+ self.data[idx],
103
+ self.tokenizer,
104
+ self.label2id,
105
+ self.max_length,
106
+ self.apply_label_repairs,
107
+ self.vocab,
108
+ )
109
+
110
+
111
+ class EncodedAnimeDataset(Dataset):
112
+ """Dataset that stores padded tensors so training workers do no token work."""
113
+
114
+ def __init__(
115
+ self,
116
+ data: Sequence[Dict],
117
+ tokenizer: AnimeTokenizer,
118
+ label2id: Dict[str, int],
119
+ max_length: int = 64,
120
+ device: Optional[torch.device] = None,
121
+ apply_label_repairs: bool = True,
122
+ ):
123
+ target_device = device or torch.device("cpu")
124
+ vocab = tokenizer.get_vocab()
125
+ input_ids = np.full(
126
+ (len(data), max_length),
127
+ tokenizer.pad_token_id,
128
+ dtype=np.int64,
129
+ )
130
+ attention_mask = np.zeros((len(data), max_length), dtype=np.bool_)
131
+ labels = np.full((len(data), max_length), -100, dtype=np.int64)
132
+
133
+ for idx, item in enumerate(data):
134
+ item_input_ids, item_attention_mask, item_labels = encode_token_classification_values(
135
+ item,
136
+ tokenizer,
137
+ label2id,
138
+ max_length,
139
+ apply_label_repairs,
140
+ vocab,
141
+ )
142
+ input_ids[idx] = item_input_ids
143
+ attention_mask[idx] = item_attention_mask
144
+ labels[idx] = item_labels
145
+
146
+ self.input_ids = torch.from_numpy(input_ids).to(target_device)
147
+ self.attention_mask = torch.from_numpy(attention_mask).to(target_device)
148
+ self.labels = torch.from_numpy(labels).to(target_device)
149
+
150
+ def __len__(self) -> int:
151
+ return self.input_ids.shape[0]
152
+
153
+ def __getitem__(self, idx: int) -> Dict[str, torch.Tensor]:
154
+ return {
155
+ "input_ids": self.input_ids[idx],
156
+ "attention_mask": self.attention_mask[idx],
157
+ "labels": self.labels[idx],
158
+ }
159
+
160
+
161
+ class AnimeDataset(AnimeItemsDataset):
162
  """
163
  Dataset for anime filename token classification.
164
 
 
183
  label2id: Mapping from label string to integer ID.
184
  max_length: Maximum sequence length (including special tokens).
185
  """
186
+ data: List[Dict] = []
 
 
 
 
 
187
  with open(data_path, 'r', encoding='utf-8') as f:
188
  for line in f:
189
  line = line.strip()
190
  if line:
191
+ data.append(json.loads(line))
192
+ super().__init__(data, tokenizer, label2id, max_length)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
193
 
194
 
195
  def align_tokens_for_tokenizer(
 
267
  return align_tokens_for_tokenizer(source_tokens, source_labels, tokenizer)
268
 
269
 
270
+ def training_labels_for_tokenizer(
271
+ item: Dict,
272
+ tokenizer: AnimeTokenizer,
273
+ apply_label_repairs: bool,
274
+ ) -> Tuple[List[str], List[str]]:
275
+ """Fast path for authoritative char JSONL rows used in full training."""
276
+ tokenizer_variant = getattr(tokenizer, "tokenizer_variant", "regex")
277
+ if not apply_label_repairs and item.get("tokenizer_variant") == tokenizer_variant:
278
+ tokens = item.get("tokens", [])
279
+ labels = item.get("labels", [])
280
+ filename = item.get("filename")
281
+ if len(tokens) == len(labels):
282
+ if tokenizer_variant != "char" or filename is None or tokens == list(str(filename)):
283
+ return tokens, labels
284
+ return labels_for_tokenizer(item, tokenizer)
285
+
286
+
287
  def token_offsets_in_text(text: str, tokens: List[str]) -> Optional[List[Tuple[int, int]]]:
288
  """Find token character offsets by scanning left to right."""
289
  offsets: List[Tuple[int, int]] = []
anifilebert/inference.py CHANGED
@@ -30,6 +30,18 @@ CN_NUM_MAP: Dict[str, int] = {
30
  }
31
 
32
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  def extract_season_number(text: str) -> Optional[int]:
34
  """
35
  Extract season number from various season formats.
@@ -113,6 +125,13 @@ def choose_thin_source(sources: List[str]) -> Optional[str]:
113
  return max(enumerate(cleaned), key=lambda item: (thin_source_priority(item[1]), -item[0]))[1]
114
 
115
 
 
 
 
 
 
 
 
116
  def display_token(token: str) -> str:
117
  """Make whitespace tokens visible in debug output."""
118
  if token == " ":
@@ -304,6 +323,21 @@ def postprocess(
304
 
305
  result["source"] = choose_thin_source(grouped_entities.get("SOURCE", []))
306
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
307
  return result
308
 
309
 
 
30
  }
31
 
32
 
33
+ STANDALONE_SPECIAL_RE = re.compile(
34
+ r"^(?:"
35
+ r"(?:BD\s*)?Menu\s*\d{0,2}(?:-\d{1,2})?|"
36
+ r"NCOP\s*\d{0,2}|NCED\s*\d{0,2}|"
37
+ r"OP\s*\d{0,2}|ED(?:\s*E?\d{0,2})?|"
38
+ r"PV\s*\d{0,2}|CM\s*\d{0,2}|"
39
+ r"OVA\s*\d{0,2}|OAD\s*\d{0,2}|SP\s*\d{0,2}|IV\d+"
40
+ r")$",
41
+ re.I,
42
+ )
43
+
44
+
45
  def extract_season_number(text: str) -> Optional[int]:
46
  """
47
  Extract season number from various season formats.
 
125
  return max(enumerate(cleaned), key=lambda item: (thin_source_priority(item[1]), -item[0]))[1]
126
 
127
 
128
+ def normalize_standalone_special(text: str) -> Optional[str]:
129
+ special = normalize_field_text(text)
130
+ if not special:
131
+ return None
132
+ return special if STANDALONE_SPECIAL_RE.fullmatch(special) else None
133
+
134
+
135
  def display_token(token: str) -> str:
136
  """Make whitespace tokens visible in debug output."""
137
  if token == " ":
 
323
 
324
  result["source"] = choose_thin_source(grouped_entities.get("SOURCE", []))
325
 
326
+ whole_text = join_entity_tokens(tokens, tokenizer)
327
+ standalone_special = normalize_standalone_special(whole_text)
328
+ if standalone_special is not None:
329
+ result.update(
330
+ {
331
+ "title": None,
332
+ "season": None,
333
+ "episode": None,
334
+ "group": None,
335
+ "resolution": None,
336
+ "source": None,
337
+ "special": standalone_special,
338
+ }
339
+ )
340
+
341
  return result
342
 
343
 
anifilebert/train.py CHANGED
@@ -9,26 +9,31 @@ end-to-end parser exact-match on held-out filenames and fixed real-world cases.
9
  import os
10
  import sys
11
  import json
12
- import tempfile
13
  import argparse
14
  import random
 
 
 
 
15
  from collections import Counter
16
- from typing import Dict, List, Optional
 
 
17
 
18
  import numpy as np
19
  import torch
20
  from transformers import (
21
  Trainer,
22
  TrainingArguments,
23
- DataCollatorForTokenClassification,
24
  BertForTokenClassification,
 
25
  )
26
  from seqeval.metrics import classification_report, accuracy_score, f1_score, precision_score, recall_score
27
 
28
  from .config import Config
29
  from .tokenizer import AnimeTokenizer, create_tokenizer, load_tokenizer
30
  from .model import create_model, print_model_summary, count_parameters
31
- from .dataset import AnimeDataset, labels_for_tokenizer
32
  from .inference import parse_filename, postprocess
33
 
34
 
@@ -66,12 +71,18 @@ def parse_args() -> argparse.Namespace:
66
  parser = argparse.ArgumentParser(description="Train anime filename parser")
67
  parser.add_argument("--tokenizer", choices=["regex", "char"], default=None,
68
  help="Tokenizer variant for A/B testing. Defaults to dataset metadata")
69
- parser.add_argument("--data-file", default=None, help="Training JSONL file")
 
 
 
 
70
  parser.add_argument("--vocab-file", default=None,
71
  help="Tokenizer vocab JSON. Defaults to data/vocab.json or data/vocab.char.json")
72
  parser.add_argument("--save-dir", default=None, help="Checkpoint output directory")
73
  parser.add_argument("--init-model-dir", default=None, help="Optional checkpoint to fine-tune from")
74
  parser.add_argument("--epochs", type=float, default=None, help="Number of training epochs")
 
 
75
  parser.add_argument("--batch-size", type=int, default=None, help="Per-device train/eval batch size")
76
  parser.add_argument("--learning-rate", type=float, default=None, help="Learning rate")
77
  parser.add_argument("--warmup-steps", type=int, default=None, help="Warmup steps")
@@ -80,6 +91,14 @@ def parse_args() -> argparse.Namespace:
80
  parser.add_argument("--seed", type=int, default=42, help="Random seed")
81
  parser.add_argument("--limit-samples", type=int, default=None,
82
  help="Use only the first N samples for quick A/B smoke runs")
 
 
 
 
 
 
 
 
83
  parser.add_argument("--rebuild-vocab", action="store_true",
84
  help="Rebuild vocab from the selected data file before training")
85
  parser.add_argument("--max-vocab-size", type=int, default=None,
@@ -88,10 +107,40 @@ def parse_args() -> argparse.Namespace:
88
  help="Save resumable checkpoints every N steps instead of only at epoch end")
89
  parser.add_argument("--save-total-limit", type=int, default=2,
90
  help="Maximum number of checkpoints to keep")
 
 
 
 
91
  parser.add_argument("--gradient-accumulation-steps", type=int, default=1,
92
  help="Accumulate gradients across this many steps")
93
  parser.add_argument("--num-workers", type=int, default=None,
94
  help="DataLoader worker count. Defaults to config.num_workers")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  parser.add_argument("--cpu", action="store_true", help="Force CPU training")
96
  parser.add_argument("--no-shuffle", action="store_true", help="Do not shuffle before train/eval split")
97
  parser.add_argument("--resume-from-checkpoint", default=None,
@@ -114,6 +163,7 @@ def parse_args() -> argparse.Namespace:
114
  parser.add_argument("--num-hidden-layers", type=int, default=None, help="Override BERT layer count")
115
  parser.add_argument("--num-attention-heads", type=int, default=None, help="Override BERT attention heads")
116
  parser.add_argument("--intermediate-size", type=int, default=None, help="Override BERT FFN intermediate size")
 
117
  parser.set_defaults(tensorboard=True)
118
  return parser.parse_args()
119
 
@@ -159,6 +209,22 @@ def detect_tokenizer_variant(
159
  return "regex"
160
 
161
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
  def resolve_vocab_path(data_file: str, tokenizer_variant: str, explicit_path: Optional[str]) -> str:
163
  if explicit_path:
164
  return explicit_path
@@ -209,6 +275,665 @@ def load_jsonl(data_file: str, limit: Optional[int] = None) -> List[Dict]:
209
  return data
210
 
211
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
212
  def normalize_field_value(field: str, value) -> Optional[str]:
213
  if value is None:
214
  return None
@@ -400,7 +1125,8 @@ def main():
400
  config = Config()
401
  if args.data_file is not None:
402
  config.data_file = args.data_file
403
- tokenizer_variant = detect_tokenizer_variant(config.data_file, args.tokenizer, args.vocab_file)
 
404
  if args.save_dir is not None:
405
  config.save_dir = args.save_dir
406
  elif tokenizer_variant == "char":
@@ -441,7 +1167,34 @@ def main():
441
  torch.manual_seed(args.seed)
442
 
443
  print("Loading dataset...")
444
- all_data = load_jsonl(config.data_file, args.limit_samples)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
445
  if len(all_data) < 2:
446
  raise ValueError("Need at least two samples so train/eval split is non-empty.")
447
  if not args.no_shuffle:
@@ -462,7 +1215,6 @@ def main():
462
  print(f" Max sequence length: {config.max_seq_length}")
463
  if torch.cuda.is_available() and not args.cpu:
464
  print(f" CUDA device: {torch.cuda.get_device_name(0)}")
465
- print(" Mixed precision: fp16")
466
 
467
  # Update config with actual vocab size
468
  config.vocab_size = tokenizer.vocab_size
@@ -505,53 +1257,96 @@ def main():
505
  if total_params >= 5_000_000:
506
  print("WARNING: Model exceeds the historical 5M target; continuing because vocab size is configurable.")
507
 
 
508
  split_idx = int(len(all_data) * config.train_split)
509
  split_idx = max(1, min(len(all_data) - 1, split_idx))
510
  train_data = all_data[:split_idx]
511
  eval_data = all_data[split_idx:]
512
 
513
- # Write split files (temp)
514
- train_file = os.path.join(tempfile.gettempdir(), "anime_train.jsonl")
515
- eval_file = os.path.join(tempfile.gettempdir(), "anime_eval.jsonl")
516
-
517
- with open(train_file, 'w', encoding='utf-8') as f:
518
- for item in train_data:
519
- f.write(json.dumps(item, ensure_ascii=False) + '\n')
520
-
521
- with open(eval_file, 'w', encoding='utf-8') as f:
522
- for item in eval_data:
523
- f.write(json.dumps(item, ensure_ascii=False) + '\n')
524
-
525
- train_dataset = AnimeDataset(
526
- data_path=train_file,
527
- tokenizer=tokenizer,
528
- label2id=config.label2id,
529
- max_length=config.max_seq_length,
530
- )
531
- eval_dataset = AnimeDataset(
532
- data_path=eval_file,
533
- tokenizer=tokenizer,
534
- label2id=config.label2id,
535
- max_length=config.max_seq_length,
536
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
537
 
538
  print(f" Train samples: {len(train_dataset)}")
539
  print(f" Eval samples: {len(eval_dataset)}")
540
-
541
- use_cpu = args.cpu or not torch.cuda.is_available()
542
- use_fp16 = not use_cpu
 
 
 
 
 
 
 
 
543
  print(f" Device: {'CPU' if use_cpu else 'CUDA'}")
544
- eval_save_strategy = "steps" if args.checkpoint_steps else "epoch"
 
 
 
 
 
 
 
 
 
 
 
 
545
 
546
  # Training arguments
547
  training_args = TrainingArguments(
548
  output_dir=config.save_dir,
549
  num_train_epochs=config.num_epochs,
 
550
  per_device_train_batch_size=config.batch_size,
551
  per_device_eval_batch_size=config.batch_size,
552
  eval_strategy=eval_save_strategy,
553
- save_strategy=eval_save_strategy,
554
- eval_steps=args.checkpoint_steps,
555
  save_steps=args.checkpoint_steps,
556
  logging_steps=config.log_interval,
557
  learning_rate=config.learning_rate,
@@ -561,18 +1356,31 @@ def main():
561
  use_cpu=use_cpu,
562
  report_to=["tensorboard"] if args.tensorboard else "none",
563
  save_total_limit=args.save_total_limit,
564
- load_best_model_at_end=True,
565
  metric_for_best_model="f1",
566
  greater_is_better=True,
567
  dataloader_num_workers=config.num_workers,
568
- dataloader_pin_memory=not use_cpu,
 
 
569
  fp16=use_fp16,
 
 
 
 
 
570
  )
571
 
572
  # Data collator
573
- data_collator = DataCollatorForTokenClassification(tokenizer)
574
 
575
  # Trainer
 
 
 
 
 
 
576
  trainer = Trainer(
577
  model=model,
578
  args=training_args,
@@ -580,6 +1388,7 @@ def main():
580
  eval_dataset=eval_dataset,
581
  data_collator=data_collator,
582
  compute_metrics=compute_metrics,
 
583
  )
584
 
585
  # Train
@@ -606,6 +1415,11 @@ def main():
606
  metadata = {
607
  "experiment_name": args.experiment_name,
608
  "data_file": config.data_file,
 
 
 
 
 
609
  "tokenizer_variant": tokenizer_variant,
610
  "vocab_file": vocab_path,
611
  "vocab_size": tokenizer.vocab_size,
@@ -616,7 +1430,10 @@ def main():
616
  "intermediate_size": config.intermediate_size,
617
  "train_samples": len(train_dataset),
618
  "eval_samples": len(eval_dataset),
 
 
619
  "epochs": config.num_epochs,
 
620
  "batch_size": config.batch_size,
621
  "learning_rate": config.learning_rate,
622
  "warmup_steps": config.warmup_steps,
@@ -625,10 +1442,32 @@ def main():
625
  "fp16": use_fp16,
626
  "gradient_accumulation_steps": training_args.gradient_accumulation_steps,
627
  "dataloader_num_workers": config.num_workers,
 
 
 
 
 
 
 
 
 
 
 
628
  }
629
  with open(os.path.join(final_save_path, "run_metadata.json"), "w", encoding="utf-8") as f:
630
  json.dump(metadata, f, ensure_ascii=False, indent=2)
631
  print(f"Model saved to: {final_save_path}")
 
 
 
 
 
 
 
 
 
 
 
632
 
633
  # Final evaluation
634
  print("\nFinal evaluation:")
 
9
  import os
10
  import sys
11
  import json
 
12
  import argparse
13
  import random
14
+ import subprocess
15
+ import threading
16
+ import time
17
+ import gc
18
  from collections import Counter
19
+ from ctypes import POINTER, Structure, byref, c_int, c_uint, c_ulonglong, c_void_p, cdll
20
+ from ctypes import util as ctypes_util
21
+ from typing import Dict, List, Optional, Sequence
22
 
23
  import numpy as np
24
  import torch
25
  from transformers import (
26
  Trainer,
27
  TrainingArguments,
 
28
  BertForTokenClassification,
29
+ TrainerCallback,
30
  )
31
  from seqeval.metrics import classification_report, accuracy_score, f1_score, precision_score, recall_score
32
 
33
  from .config import Config
34
  from .tokenizer import AnimeTokenizer, create_tokenizer, load_tokenizer
35
  from .model import create_model, print_model_summary, count_parameters
36
+ from .dataset import AnimeItemsDataset, EncodedAnimeDataset, labels_for_tokenizer
37
  from .inference import parse_filename, postprocess
38
 
39
 
 
71
  parser = argparse.ArgumentParser(description="Train anime filename parser")
72
  parser.add_argument("--tokenizer", choices=["regex", "char"], default=None,
73
  help="Tokenizer variant for A/B testing. Defaults to dataset metadata")
74
+ parser.add_argument("--data-file", default=None, help="Primary training JSONL file")
75
+ parser.add_argument("--extra-data-file", action="append", default=[],
76
+ help="Additional training JSONL file. Can be passed multiple times.")
77
+ parser.add_argument("--extra-data-repeat", type=int, default=1,
78
+ help="Repeat each extra dataset this many times after loading")
79
  parser.add_argument("--vocab-file", default=None,
80
  help="Tokenizer vocab JSON. Defaults to data/vocab.json or data/vocab.char.json")
81
  parser.add_argument("--save-dir", default=None, help="Checkpoint output directory")
82
  parser.add_argument("--init-model-dir", default=None, help="Optional checkpoint to fine-tune from")
83
  parser.add_argument("--epochs", type=float, default=None, help="Number of training epochs")
84
+ parser.add_argument("--max-steps", type=int, default=-1,
85
+ help="Override epoch-based training and stop after this many optimizer steps")
86
  parser.add_argument("--batch-size", type=int, default=None, help="Per-device train/eval batch size")
87
  parser.add_argument("--learning-rate", type=float, default=None, help="Learning rate")
88
  parser.add_argument("--warmup-steps", type=int, default=None, help="Warmup steps")
 
91
  parser.add_argument("--seed", type=int, default=42, help="Random seed")
92
  parser.add_argument("--limit-samples", type=int, default=None,
93
  help="Use only the first N samples for quick A/B smoke runs")
94
+ parser.add_argument("--augment-partial-samples", type=int, default=0,
95
+ help="Generate this many partial BIO-span samples in memory before training")
96
+ parser.add_argument("--augment-permutation-samples", type=int, default=0,
97
+ help="Generate this many random BIO-span permutation samples in memory before training")
98
+ parser.add_argument("--augment-special-samples", type=int, default=0,
99
+ help="Generate this many special-only/title+special samples such as Menu01 in memory")
100
+ parser.add_argument("--augment-max-chars", type=int, default=160,
101
+ help="Maximum character length for generated augmentation samples")
102
  parser.add_argument("--rebuild-vocab", action="store_true",
103
  help="Rebuild vocab from the selected data file before training")
104
  parser.add_argument("--max-vocab-size", type=int, default=None,
 
107
  help="Save resumable checkpoints every N steps instead of only at epoch end")
108
  parser.add_argument("--save-total-limit", type=int, default=2,
109
  help="Maximum number of checkpoints to keep")
110
+ parser.add_argument("--no-periodic-eval", action="store_true",
111
+ help="Skip Trainer's scheduled train-time eval/load-best-model; final evaluation still runs")
112
+ parser.add_argument("--keep-raw-dataset", action="store_true",
113
+ help="Keep raw JSONL dictionaries in memory after encoded datasets are built")
114
  parser.add_argument("--gradient-accumulation-steps", type=int, default=1,
115
  help="Accumulate gradients across this many steps")
116
  parser.add_argument("--num-workers", type=int, default=None,
117
  help="DataLoader worker count. Defaults to config.num_workers")
118
+ parser.add_argument("--prefetch-factor", type=int, default=None,
119
+ help="DataLoader prefetch factor when workers are enabled")
120
+ parser.add_argument("--persistent-workers", action="store_true",
121
+ help="Keep DataLoader workers alive between epochs")
122
+ parser.add_argument("--lazy-dataset", action="store_true",
123
+ help="Tokenize samples lazily in DataLoader workers instead of pre-encoding tensors")
124
+ parser.add_argument("--apply-label-repairs", action="store_true",
125
+ help="Apply runtime deterministic label repairs while building training tensors")
126
+ parser.add_argument("--encoded-dataset-device", choices=["cpu", "cuda"], default="cpu",
127
+ help="Store pre-encoded dataset tensors on this device; cuda requires --num-workers 0")
128
+ parser.add_argument("--bf16", action="store_true",
129
+ help="Use bfloat16 mixed precision on CUDA instead of fp16")
130
+ parser.add_argument("--no-mixed-precision", action="store_true",
131
+ help="Disable fp16/bf16 mixed precision even when CUDA is available")
132
+ parser.add_argument("--tf32", dest="tf32", action="store_true",
133
+ help="Enable TF32 matmul/cudnn kernels on CUDA")
134
+ parser.add_argument("--no-tf32", dest="tf32", action="store_false",
135
+ help="Disable TF32 matmul/cudnn kernels")
136
+ parser.add_argument("--torch-compile", action="store_true",
137
+ help="Enable torch.compile through Hugging Face Trainer")
138
+ parser.add_argument("--auto-find-batch-size", action="store_true",
139
+ help="Let Trainer reduce batch size automatically on CUDA OOM")
140
+ parser.add_argument("--perf-log-steps", type=int, default=100,
141
+ help="Sample training throughput, memory, and GPU stats every N steps; 0 disables")
142
+ parser.add_argument("--perf-sample-interval", type=float, default=1.0,
143
+ help="Background NVML sampling interval in seconds during training; 0 disables")
144
  parser.add_argument("--cpu", action="store_true", help="Force CPU training")
145
  parser.add_argument("--no-shuffle", action="store_true", help="Do not shuffle before train/eval split")
146
  parser.add_argument("--resume-from-checkpoint", default=None,
 
163
  parser.add_argument("--num-hidden-layers", type=int, default=None, help="Override BERT layer count")
164
  parser.add_argument("--num-attention-heads", type=int, default=None, help="Override BERT attention heads")
165
  parser.add_argument("--intermediate-size", type=int, default=None, help="Override BERT FFN intermediate size")
166
+ parser.set_defaults(tf32=True)
167
  parser.set_defaults(tensorboard=True)
168
  return parser.parse_args()
169
 
 
209
  return "regex"
210
 
211
 
212
+ def detect_tokenizer_variant_from_files(
213
+ data_files: List[str],
214
+ explicit_variant: Optional[str],
215
+ explicit_vocab_path: Optional[str],
216
+ ) -> str:
217
+ if explicit_variant:
218
+ return explicit_variant
219
+ variants = {
220
+ detect_tokenizer_variant(path, None, explicit_vocab_path)
221
+ for path in data_files
222
+ }
223
+ if len(variants) > 1:
224
+ raise ValueError(f"Mixed tokenizer variants across datasets: {sorted(variants)}")
225
+ return next(iter(variants))
226
+
227
+
228
  def resolve_vocab_path(data_file: str, tokenizer_variant: str, explicit_path: Optional[str]) -> str:
229
  if explicit_path:
230
  return explicit_path
 
275
  return data
276
 
277
 
278
+ def load_training_sources(
279
+ primary_data_file: str,
280
+ extra_data_files: List[str],
281
+ extra_repeat: int,
282
+ limit: Optional[int] = None,
283
+ ) -> tuple[List[Dict], List[Dict]]:
284
+ """Load primary plus extra datasets while preserving source metadata."""
285
+ sources: List[Dict] = []
286
+ primary = load_jsonl(primary_data_file, limit)
287
+ all_data: List[Dict] = list(primary)
288
+ sources.append(
289
+ {
290
+ "role": "primary",
291
+ "path": primary_data_file,
292
+ "samples": len(primary),
293
+ "repeat": 1,
294
+ "effective_samples": len(primary),
295
+ }
296
+ )
297
+
298
+ repeat = max(1, extra_repeat)
299
+ for path in extra_data_files:
300
+ rows = load_jsonl(path, None)
301
+ for _ in range(repeat):
302
+ all_data.extend(rows)
303
+ sources.append(
304
+ {
305
+ "role": "extra",
306
+ "path": path,
307
+ "samples": len(rows),
308
+ "repeat": repeat,
309
+ "effective_samples": len(rows) * repeat,
310
+ }
311
+ )
312
+ return all_data, sources
313
+
314
+
315
+ def extract_entities_from_labels(tokens: Sequence[str], labels: Sequence[str]) -> Dict[str, List[str]]:
316
+ """Extract contiguous BIO entity text spans from token/label arrays."""
317
+ entities: Dict[str, List[str]] = {}
318
+ active_entity: Optional[str] = None
319
+ active_tokens: List[str] = []
320
+
321
+ for token, label in zip(tokens, labels):
322
+ if label.startswith("B-"):
323
+ if active_entity and active_tokens:
324
+ entities.setdefault(active_entity, []).append("".join(active_tokens))
325
+ active_entity = label[2:]
326
+ active_tokens = [str(token)]
327
+ elif label.startswith("I-") and active_entity == label[2:]:
328
+ active_tokens.append(str(token))
329
+ else:
330
+ if active_entity and active_tokens:
331
+ entities.setdefault(active_entity, []).append("".join(active_tokens))
332
+ active_entity = None
333
+ active_tokens = []
334
+
335
+ if active_entity and active_tokens:
336
+ entities.setdefault(active_entity, []).append("".join(active_tokens))
337
+ return entities
338
+
339
+
340
+ def char_item_from_spans(filename: str, spans: Sequence[tuple[str, str]], source: str) -> Optional[Dict]:
341
+ """Create a char-tokenized BIO item from ordered text/entity spans."""
342
+ filename = filename.strip()
343
+ if not filename:
344
+ return None
345
+ tokens = list(filename)
346
+ labels = ["O"] * len(tokens)
347
+ cursor = 0
348
+ for text, entity in spans:
349
+ if not text:
350
+ continue
351
+ start = filename.find(text, cursor)
352
+ if start < 0:
353
+ start = filename.find(text)
354
+ if start < 0:
355
+ return None
356
+ end = start + len(text)
357
+ labels[start] = f"B-{entity}"
358
+ for idx in range(start + 1, end):
359
+ labels[idx] = f"I-{entity}"
360
+ cursor = end
361
+ return {
362
+ "filename": filename,
363
+ "tokens": tokens,
364
+ "labels": labels,
365
+ "tokenizer_variant": "char",
366
+ "source": source,
367
+ }
368
+
369
+
370
+ def entity_keep_probability(entity: str) -> float:
371
+ return {
372
+ "GROUP": 0.35,
373
+ "TITLE": 0.65,
374
+ "SEASON": 0.35,
375
+ "EPISODE": 0.7,
376
+ "SPECIAL": 0.3,
377
+ "RESOLUTION": 0.65,
378
+ "SOURCE": 0.65,
379
+ }.get(entity, 0.5)
380
+
381
+
382
+ def build_partial_augmented_item(item: Dict, max_chars: int) -> List[Dict]:
383
+ entities = extract_entities_from_labels(item.get("tokens", []), item.get("labels", []))
384
+ title = next((value.strip() for value in entities.get("TITLE", []) if value.strip()), None)
385
+ season = next((value.strip() for value in entities.get("SEASON", []) if value.strip()), None)
386
+ episode = next((value.strip() for value in entities.get("EPISODE", []) if value.strip()), None)
387
+ special = next((value.strip() for value in entities.get("SPECIAL", []) if value.strip()), None)
388
+ resolution = next((value.strip() for value in entities.get("RESOLUTION", []) if value.strip()), None)
389
+ source = next((value.strip() for value in entities.get("SOURCE", []) if value.strip()), None)
390
+
391
+ specs: List[tuple[str, List[tuple[str, str]]]] = []
392
+ if title:
393
+ specs.append((title, [(title, "TITLE")]))
394
+ if title and season:
395
+ specs.append((f"{title} {season}", [(title, "TITLE"), (season, "SEASON")]))
396
+ if episode:
397
+ specs.append((episode, [(episode, "EPISODE")]))
398
+ if episode and resolution:
399
+ specs.append((f"{episode} [{resolution}]", [(episode, "EPISODE"), (resolution, "RESOLUTION")]))
400
+ if episode and resolution and source:
401
+ specs.append(
402
+ (
403
+ f"{episode} [{resolution}][{source}]",
404
+ [(episode, "EPISODE"), (resolution, "RESOLUTION"), (source, "SOURCE")],
405
+ )
406
+ )
407
+ if special:
408
+ specs.append((special, [(special, "SPECIAL")]))
409
+ if title and special:
410
+ specs.append((f"{title} - {special}", [(title, "TITLE"), (special, "SPECIAL")]))
411
+
412
+ augmented: List[Dict] = []
413
+ for text, spans in specs:
414
+ if 2 <= len(text) <= max_chars:
415
+ generated = char_item_from_spans(text, spans, "train_partial_augmentation")
416
+ if generated is not None:
417
+ augmented.append(generated)
418
+ return augmented
419
+
420
+
421
+ def build_permutation_augmented_item(item: Dict, rng: random.Random, max_chars: int) -> Optional[Dict]:
422
+ entities = extract_entities_from_labels(item.get("tokens", []), item.get("labels", []))
423
+ available = [
424
+ entity
425
+ for entity in ("GROUP", "TITLE", "SEASON", "EPISODE", "SPECIAL", "RESOLUTION", "SOURCE")
426
+ if entities.get(entity)
427
+ ]
428
+ if not available:
429
+ return None
430
+ selected = [
431
+ entity
432
+ for entity in available
433
+ if rng.random() < entity_keep_probability(entity)
434
+ ]
435
+ if not selected:
436
+ selected = [rng.choice(available)]
437
+ if "TITLE" not in selected and "EPISODE" not in selected and "SPECIAL" not in selected:
438
+ extras = [entity for entity in available if entity not in selected]
439
+ selected.append(rng.choice(extras or available))
440
+ rng.shuffle(selected)
441
+
442
+ separators = [" ", " - ", ".", "_", "]["]
443
+ sep = rng.choice(separators)
444
+ parts: List[str] = []
445
+ spans: List[tuple[str, str]] = []
446
+ for entity in selected:
447
+ values = [value.strip() for value in entities.get(entity, []) if value.strip()]
448
+ if not values:
449
+ continue
450
+ value = rng.choice(values)
451
+ if entity in {"GROUP", "EPISODE", "SPECIAL", "RESOLUTION", "SOURCE"} and rng.random() < 0.35:
452
+ parts.append(f"[{value}]")
453
+ else:
454
+ parts.append(value)
455
+ spans.append((value, entity))
456
+ text = sep.join(parts).strip()
457
+ if not (2 <= len(text) <= max_chars):
458
+ return None
459
+ return char_item_from_spans(text, spans, "train_permutation_augmentation")
460
+
461
+
462
+ def build_special_augmented_item(data: List[Dict], rng: random.Random, max_chars: int) -> Optional[Dict]:
463
+ base_titles: List[str] = []
464
+ for _ in range(min(16, len(data))):
465
+ item = data[rng.randrange(len(data))]
466
+ entities = extract_entities_from_labels(item.get("tokens", []), item.get("labels", []))
467
+ base_titles.extend(value.strip() for value in entities.get("TITLE", []) if 2 <= len(value.strip()) <= 80)
468
+ title = rng.choice(base_titles) if base_titles else None
469
+ special = rng.choice(
470
+ [
471
+ f"Menu{rng.randint(1, 24):02d}",
472
+ f"Menu {rng.randint(1, 24):02d}",
473
+ f"BDMenu{rng.randint(1, 24):02d}",
474
+ f"BD Menu{rng.randint(1, 24):02d}",
475
+ f"Menu{rng.randint(1, 24):02d}-01",
476
+ "Menu",
477
+ f"OP{rng.randint(1, 6):02d}",
478
+ f"ED E{rng.randint(1, 24):02d}",
479
+ f"NCOP{rng.randint(1, 6):02d}",
480
+ f"NCED{rng.randint(1, 6):02d}",
481
+ f"CM{rng.randint(1, 12):02d}",
482
+ f"PV{rng.randint(1, 12):02d}",
483
+ ]
484
+ )
485
+ if title and rng.random() < 0.55:
486
+ text = f"{title} - {special}"
487
+ spans = [(title, "TITLE"), (special, "SPECIAL")]
488
+ else:
489
+ text = special
490
+ spans = [(special, "SPECIAL")]
491
+ if len(text) > max_chars:
492
+ return None
493
+ return char_item_from_spans(text, spans, "train_special_augmentation")
494
+
495
+
496
+ def process_memory_mb() -> Optional[float]:
497
+ try:
498
+ import psutil # type: ignore
499
+
500
+ return psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024)
501
+ except Exception:
502
+ pass
503
+
504
+ if os.name == "nt":
505
+ try:
506
+ import ctypes
507
+ from ctypes import wintypes
508
+
509
+ class PROCESS_MEMORY_COUNTERS(ctypes.Structure):
510
+ _fields_ = [
511
+ ("cb", wintypes.DWORD),
512
+ ("PageFaultCount", wintypes.DWORD),
513
+ ("PeakWorkingSetSize", ctypes.c_size_t),
514
+ ("WorkingSetSize", ctypes.c_size_t),
515
+ ("QuotaPeakPagedPoolUsage", ctypes.c_size_t),
516
+ ("QuotaPagedPoolUsage", ctypes.c_size_t),
517
+ ("QuotaPeakNonPagedPoolUsage", ctypes.c_size_t),
518
+ ("QuotaNonPagedPoolUsage", ctypes.c_size_t),
519
+ ("PagefileUsage", ctypes.c_size_t),
520
+ ("PeakPagefileUsage", ctypes.c_size_t),
521
+ ]
522
+
523
+ counters = PROCESS_MEMORY_COUNTERS()
524
+ counters.cb = ctypes.sizeof(counters)
525
+ handle = ctypes.windll.kernel32.GetCurrentProcess()
526
+ if ctypes.windll.psapi.GetProcessMemoryInfo(handle, ctypes.byref(counters), counters.cb):
527
+ return float(counters.WorkingSetSize) / (1024 * 1024)
528
+ except Exception:
529
+ pass
530
+
531
+ try:
532
+ import resource # type: ignore
533
+
534
+ usage = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
535
+ if sys.platform == "darwin":
536
+ usage = usage / 1024 / 1024
537
+ else:
538
+ usage = usage / 1024
539
+ return float(usage)
540
+ except Exception:
541
+ return None
542
+
543
+
544
+ class NvmlSampler:
545
+ """Tiny NVML binding for runtime GPU telemetry without adding dependencies."""
546
+
547
+ NVML_TEMPERATURE_GPU = 0
548
+
549
+ def __init__(self):
550
+ self._lib = None
551
+ self._handle = None
552
+ self._available = False
553
+ self._init()
554
+
555
+ def _candidate_names(self) -> List[str]:
556
+ names = []
557
+ found = ctypes_util.find_library("nvidia-ml")
558
+ if found:
559
+ names.append(found)
560
+ if os.name == "nt":
561
+ names.extend(
562
+ [
563
+ os.path.join(os.environ.get("SystemRoot", r"C:\Windows"), "System32", "nvml.dll"),
564
+ "nvml.dll",
565
+ "nvidia-ml.dll",
566
+ ]
567
+ )
568
+ else:
569
+ names.extend(["libnvidia-ml.so.1", "libnvidia-ml.so"])
570
+ return names
571
+
572
+ def _init(self) -> None:
573
+ for name in self._candidate_names():
574
+ try:
575
+ lib = cdll.LoadLibrary(name)
576
+ break
577
+ except Exception:
578
+ continue
579
+ else:
580
+ return
581
+
582
+ class NVMLUtilization(Structure):
583
+ _fields_ = [("gpu", c_uint), ("memory", c_uint)]
584
+
585
+ class NVMLMemory(Structure):
586
+ _fields_ = [("total", c_ulonglong), ("free", c_ulonglong), ("used", c_ulonglong)]
587
+
588
+ self.NVMLUtilization = NVMLUtilization
589
+ self.NVMLMemory = NVMLMemory
590
+ lib.nvmlInit_v2.restype = c_int
591
+ lib.nvmlDeviceGetHandleByIndex_v2.argtypes = [c_uint, POINTER(c_void_p)]
592
+ lib.nvmlDeviceGetHandleByIndex_v2.restype = c_int
593
+ handle = c_void_p()
594
+ try:
595
+ if lib.nvmlInit_v2() != 0:
596
+ return
597
+ if lib.nvmlDeviceGetHandleByIndex_v2(0, byref(handle)) != 0:
598
+ return
599
+ except Exception:
600
+ return
601
+ self._lib = lib
602
+ self._handle = handle
603
+ self._available = True
604
+
605
+ @property
606
+ def available(self) -> bool:
607
+ return self._available
608
+
609
+ def sample(self) -> Dict[str, Optional[float]]:
610
+ if not self._available or self._lib is None or self._handle is None:
611
+ return {}
612
+ stats: Dict[str, Optional[float]] = {}
613
+ try:
614
+ util_rates = self.NVMLUtilization()
615
+ self._lib.nvmlDeviceGetUtilizationRates.argtypes = [c_void_p, POINTER(self.NVMLUtilization)]
616
+ if self._lib.nvmlDeviceGetUtilizationRates(self._handle, byref(util_rates)) == 0:
617
+ stats["gpu_util_percent"] = float(util_rates.gpu)
618
+ stats["gpu_memory_util_percent"] = float(util_rates.memory)
619
+ except Exception:
620
+ pass
621
+ try:
622
+ memory = self.NVMLMemory()
623
+ self._lib.nvmlDeviceGetMemoryInfo.argtypes = [c_void_p, POINTER(self.NVMLMemory)]
624
+ if self._lib.nvmlDeviceGetMemoryInfo(self._handle, byref(memory)) == 0:
625
+ stats["gpu_memory_used_mb"] = float(memory.used) / (1024 * 1024)
626
+ stats["gpu_memory_total_mb"] = float(memory.total) / (1024 * 1024)
627
+ except Exception:
628
+ pass
629
+ try:
630
+ temperature = c_uint()
631
+ self._lib.nvmlDeviceGetTemperature.argtypes = [c_void_p, c_uint, POINTER(c_uint)]
632
+ if self._lib.nvmlDeviceGetTemperature(self._handle, self.NVML_TEMPERATURE_GPU, byref(temperature)) == 0:
633
+ stats["gpu_temperature_c"] = float(temperature.value)
634
+ except Exception:
635
+ pass
636
+ try:
637
+ power_mw = c_uint()
638
+ self._lib.nvmlDeviceGetPowerUsage.argtypes = [c_void_p, POINTER(c_uint)]
639
+ if self._lib.nvmlDeviceGetPowerUsage(self._handle, byref(power_mw)) == 0:
640
+ stats["gpu_power_w"] = float(power_mw.value) / 1000.0
641
+ except Exception:
642
+ pass
643
+ return stats
644
+
645
+
646
+ _NVML_SAMPLER: Optional[NvmlSampler] = None
647
+
648
+
649
+ def query_nvml() -> Dict[str, Optional[float]]:
650
+ global _NVML_SAMPLER
651
+ if _NVML_SAMPLER is None:
652
+ _NVML_SAMPLER = NvmlSampler()
653
+ return _NVML_SAMPLER.sample()
654
+
655
+
656
+ def query_nvidia_smi() -> Dict[str, Optional[float]]:
657
+ try:
658
+ result = subprocess.run(
659
+ [
660
+ "nvidia-smi",
661
+ "--query-gpu=utilization.gpu,memory.used,memory.total,power.draw",
662
+ "--format=csv,noheader,nounits",
663
+ ],
664
+ check=False,
665
+ capture_output=True,
666
+ text=True,
667
+ timeout=2,
668
+ )
669
+ except Exception:
670
+ return {}
671
+ if result.returncode != 0 or not result.stdout.strip():
672
+ return {}
673
+ first_line = result.stdout.strip().splitlines()[0]
674
+ values = [part.strip() for part in first_line.split(",")]
675
+ keys = ["gpu_util_percent", "gpu_memory_used_mb", "gpu_memory_total_mb", "gpu_power_w"]
676
+ stats: Dict[str, Optional[float]] = {}
677
+ for key, value in zip(keys, values):
678
+ try:
679
+ stats[key] = float(value)
680
+ except ValueError:
681
+ stats[key] = None
682
+ return stats
683
+
684
+
685
+ def cuda_memory_stats_mb() -> Dict[str, float]:
686
+ if not torch.cuda.is_available():
687
+ return {}
688
+ return {
689
+ "cuda_allocated_mb": torch.cuda.memory_allocated() / (1024 * 1024),
690
+ "cuda_reserved_mb": torch.cuda.memory_reserved() / (1024 * 1024),
691
+ "cuda_max_allocated_mb": torch.cuda.max_memory_allocated() / (1024 * 1024),
692
+ "cuda_max_reserved_mb": torch.cuda.max_memory_reserved() / (1024 * 1024),
693
+ }
694
+
695
+
696
+ def snapshot_perf_stats() -> Dict[str, Optional[float]]:
697
+ stats: Dict[str, Optional[float]] = {}
698
+ stats["process_rss_mb"] = process_memory_mb()
699
+ stats.update(cuda_memory_stats_mb())
700
+ gpu_stats = query_nvml()
701
+ if not gpu_stats:
702
+ gpu_stats = query_nvidia_smi()
703
+ stats.update(gpu_stats)
704
+ return stats
705
+
706
+
707
+ class TrainingPerfCallback(TrainerCallback):
708
+ """Lightweight runtime telemetry for spotting data-pipeline starvation."""
709
+
710
+ def __init__(self, batch_size: int, sequence_length: int, log_steps: int, sample_interval: float):
711
+ self.batch_size = batch_size
712
+ self.sequence_length = sequence_length
713
+ self.log_steps = max(0, log_steps)
714
+ self.sample_interval = max(0.0, sample_interval)
715
+ self.samples: List[Dict[str, Optional[float]]] = []
716
+ self.background_samples: List[Dict[str, Optional[float]]] = []
717
+ self._last_step = 0
718
+ self._last_time: Optional[float] = None
719
+ self._start_time: Optional[float] = None
720
+ self._training = False
721
+ self._stop_event = threading.Event()
722
+ self._thread: Optional[threading.Thread] = None
723
+
724
+ def on_train_begin(self, args, state, control, **kwargs):
725
+ now = time.perf_counter()
726
+ self._start_time = now
727
+ self._last_time = now
728
+ self._last_step = int(state.global_step)
729
+ self._training = True
730
+ self._stop_event.clear()
731
+ if self.sample_interval > 0:
732
+ self._thread = threading.Thread(target=self._background_sample_loop, daemon=True)
733
+ self._thread.start()
734
+
735
+ def on_train_end(self, args, state, control, **kwargs):
736
+ self._training = False
737
+ self._stop_event.set()
738
+ if self._thread is not None:
739
+ self._thread.join(timeout=max(self.sample_interval * 2, 1.0))
740
+ self._thread = None
741
+
742
+ def on_log(self, args, state, control, logs=None, **kwargs):
743
+ if not self._training:
744
+ return
745
+ step = int(state.global_step)
746
+ if self.log_steps <= 0 or step <= 0 or step % self.log_steps != 0:
747
+ return
748
+ self._record_sample(step)
749
+
750
+ def on_step_end(self, args, state, control, **kwargs):
751
+ if not self._training:
752
+ return
753
+ step = int(state.global_step)
754
+ if self.log_steps <= 0 or step <= 0 or step % self.log_steps != 0:
755
+ return
756
+ if self.samples and self.samples[-1].get("step") == float(step):
757
+ return
758
+ self._record_sample(step)
759
+
760
+ def _record_sample(self, step: int) -> None:
761
+ if self.samples and self.samples[-1].get("step") == float(step):
762
+ return
763
+ now = time.perf_counter()
764
+ last_time = self._last_time or now
765
+ elapsed = max(now - last_time, 1e-9)
766
+ step_delta = max(step - self._last_step, 0)
767
+ samples_per_second = step_delta * self.batch_size / elapsed
768
+ tokens_per_second = samples_per_second * self.sequence_length
769
+ stats = snapshot_perf_stats()
770
+ sample: Dict[str, Optional[float]] = {
771
+ "step": float(step),
772
+ "elapsed_seconds": now - (self._start_time or now),
773
+ "window_seconds": elapsed,
774
+ "steps_per_second": step_delta / elapsed,
775
+ "samples_per_second": samples_per_second,
776
+ "tokens_per_second": tokens_per_second,
777
+ }
778
+ sample.update(stats)
779
+ self.samples.append(sample)
780
+ print(
781
+ " perf "
782
+ f"step={step} "
783
+ f"samples/s={samples_per_second:.1f} "
784
+ f"tokens/s={tokens_per_second:.0f} "
785
+ f"rss={stats.get('process_rss_mb') or 0:.0f}MB "
786
+ f"cuda_alloc={stats.get('cuda_allocated_mb') or 0:.0f}MB "
787
+ f"gpu_util={stats.get('gpu_util_percent') if stats.get('gpu_util_percent') is not None else 'n/a'}%"
788
+ )
789
+ self._last_time = now
790
+ self._last_step = step
791
+
792
+ def _background_sample_loop(self) -> None:
793
+ while not self._stop_event.wait(self.sample_interval):
794
+ if not self._training:
795
+ continue
796
+ sample = snapshot_perf_stats()
797
+ sample["elapsed_seconds"] = (
798
+ time.perf_counter() - self._start_time
799
+ if self._start_time is not None
800
+ else None
801
+ )
802
+ self.background_samples.append(sample)
803
+
804
+ def summary(self) -> Dict:
805
+ numeric_keys = [
806
+ "samples_per_second",
807
+ "tokens_per_second",
808
+ "process_rss_mb",
809
+ "cuda_max_allocated_mb",
810
+ "gpu_util_percent",
811
+ "gpu_memory_util_percent",
812
+ "gpu_power_w",
813
+ "gpu_temperature_c",
814
+ ]
815
+ summary: Dict[str, object] = {
816
+ "sample_count": len(self.samples),
817
+ "samples": self.samples,
818
+ "background_sample_count": len(self.background_samples),
819
+ "background_samples": self.background_samples,
820
+ }
821
+ sample_groups = {
822
+ "step": self.samples,
823
+ "background": self.background_samples,
824
+ }
825
+ for prefix, samples in sample_groups.items():
826
+ if not samples:
827
+ continue
828
+ for key in numeric_keys:
829
+ values = [
830
+ float(sample[key])
831
+ for sample in samples
832
+ if sample.get(key) is not None
833
+ ]
834
+ if values:
835
+ summary[f"{prefix}_{key}_avg"] = sum(values) / len(values)
836
+ summary[f"{prefix}_{key}_max"] = max(values)
837
+ summary[f"{prefix}_{key}_min"] = min(values)
838
+ if not self.samples and not self.background_samples:
839
+ return summary
840
+ for key in numeric_keys:
841
+ values = [
842
+ float(sample[key])
843
+ for sample in self.samples
844
+ if sample.get(key) is not None
845
+ ]
846
+ if values:
847
+ summary[f"{key}_avg"] = sum(values) / len(values)
848
+ summary[f"{key}_max"] = max(values)
849
+ return summary
850
+
851
+
852
+ class FastTokenClassificationCollator:
853
+ """Stack already padded token-classification tensors without extra work."""
854
+
855
+ def __call__(self, features: List[Dict[str, torch.Tensor]]) -> Dict[str, torch.Tensor]:
856
+ return {
857
+ key: torch.stack([feature[key] for feature in features])
858
+ for key in features[0].keys()
859
+ }
860
+
861
+
862
+ def augment_training_data(
863
+ data: List[Dict],
864
+ partial_count: int,
865
+ permutation_count: int,
866
+ special_count: int,
867
+ max_chars: int,
868
+ seed: int,
869
+ ) -> tuple[List[Dict], Dict]:
870
+ """Append generated partial/permutation samples without modifying source JSONL."""
871
+ rng = random.Random(seed)
872
+ augmented: List[Dict] = []
873
+ seen = {
874
+ item.get("filename") or "".join(str(token) for token in item.get("tokens", []))
875
+ for item in data
876
+ }
877
+
878
+ partial_written = 0
879
+ if partial_count > 0:
880
+ candidates: List[Dict] = []
881
+ attempts = 0
882
+ max_attempts = max(partial_count * 20, len(data))
883
+ while len(candidates) < partial_count * 4 and attempts < max_attempts:
884
+ attempts += 1
885
+ candidates.extend(build_partial_augmented_item(rng.choice(data), max_chars))
886
+ rng.shuffle(candidates)
887
+ for item in candidates:
888
+ key = item["filename"]
889
+ if key in seen:
890
+ continue
891
+ seen.add(key)
892
+ augmented.append(item)
893
+ partial_written += 1
894
+ if partial_written >= partial_count:
895
+ break
896
+
897
+ permutation_written = 0
898
+ attempts = 0
899
+ while permutation_written < permutation_count and attempts < max(permutation_count * 20, 100):
900
+ attempts += 1
901
+ item = build_permutation_augmented_item(rng.choice(data), rng, max_chars)
902
+ if item is None:
903
+ continue
904
+ key = item["filename"]
905
+ if key in seen:
906
+ continue
907
+ seen.add(key)
908
+ augmented.append(item)
909
+ permutation_written += 1
910
+
911
+ special_written = 0
912
+ attempts = 0
913
+ while special_written < special_count and attempts < max(special_count * 20, 100):
914
+ attempts += 1
915
+ item = build_special_augmented_item(data, rng, max_chars)
916
+ if item is None:
917
+ continue
918
+ key = item["filename"]
919
+ if key in seen:
920
+ continue
921
+ seen.add(key)
922
+ augmented.append(item)
923
+ special_written += 1
924
+
925
+ meta = {
926
+ "partial_requested": partial_count,
927
+ "partial_written": partial_written,
928
+ "permutation_requested": permutation_count,
929
+ "permutation_written": permutation_written,
930
+ "special_requested": special_count,
931
+ "special_written": special_written,
932
+ "max_chars": max_chars,
933
+ }
934
+ return data + augmented, meta
935
+
936
+
937
  def normalize_field_value(field: str, value) -> Optional[str]:
938
  if value is None:
939
  return None
 
1125
  config = Config()
1126
  if args.data_file is not None:
1127
  config.data_file = args.data_file
1128
+ training_files = [config.data_file] + list(args.extra_data_file or [])
1129
+ tokenizer_variant = detect_tokenizer_variant_from_files(training_files, args.tokenizer, args.vocab_file)
1130
  if args.save_dir is not None:
1131
  config.save_dir = args.save_dir
1132
  elif tokenizer_variant == "char":
 
1167
  torch.manual_seed(args.seed)
1168
 
1169
  print("Loading dataset...")
1170
+ load_started_at = time.perf_counter()
1171
+ all_data, data_sources = load_training_sources(
1172
+ primary_data_file=config.data_file,
1173
+ extra_data_files=list(args.extra_data_file or []),
1174
+ extra_repeat=args.extra_data_repeat,
1175
+ limit=args.limit_samples,
1176
+ )
1177
+ augmentation_metadata = {
1178
+ "partial_requested": 0,
1179
+ "partial_written": 0,
1180
+ "permutation_requested": 0,
1181
+ "permutation_written": 0,
1182
+ "special_requested": 0,
1183
+ "special_written": 0,
1184
+ "max_chars": args.augment_max_chars,
1185
+ }
1186
+ if args.augment_partial_samples or args.augment_permutation_samples or args.augment_special_samples:
1187
+ if tokenizer_variant != "char":
1188
+ raise ValueError("Training-time BIO span augmentation currently requires --tokenizer char.")
1189
+ all_data, augmentation_metadata = augment_training_data(
1190
+ data=all_data,
1191
+ partial_count=args.augment_partial_samples,
1192
+ permutation_count=args.augment_permutation_samples,
1193
+ special_count=args.augment_special_samples,
1194
+ max_chars=args.augment_max_chars,
1195
+ seed=args.seed + 1009,
1196
+ )
1197
+ load_finished_at = time.perf_counter()
1198
  if len(all_data) < 2:
1199
  raise ValueError("Need at least two samples so train/eval split is non-empty.")
1200
  if not args.no_shuffle:
 
1215
  print(f" Max sequence length: {config.max_seq_length}")
1216
  if torch.cuda.is_available() and not args.cpu:
1217
  print(f" CUDA device: {torch.cuda.get_device_name(0)}")
 
1218
 
1219
  # Update config with actual vocab size
1220
  config.vocab_size = tokenizer.vocab_size
 
1257
  if total_params >= 5_000_000:
1258
  print("WARNING: Model exceeds the historical 5M target; continuing because vocab size is configurable.")
1259
 
1260
+ use_cpu = args.cpu or not torch.cuda.is_available()
1261
  split_idx = int(len(all_data) * config.train_split)
1262
  split_idx = max(1, min(len(all_data) - 1, split_idx))
1263
  train_data = all_data[:split_idx]
1264
  eval_data = all_data[split_idx:]
1265
 
1266
+ encode_started_at = time.perf_counter()
1267
+ if args.lazy_dataset:
1268
+ train_dataset = AnimeItemsDataset(
1269
+ data=train_data,
1270
+ tokenizer=tokenizer,
1271
+ label2id=config.label2id,
1272
+ max_length=config.max_seq_length,
1273
+ apply_label_repairs=args.apply_label_repairs,
1274
+ )
1275
+ eval_dataset = AnimeItemsDataset(
1276
+ data=eval_data,
1277
+ tokenizer=tokenizer,
1278
+ label2id=config.label2id,
1279
+ max_length=config.max_seq_length,
1280
+ apply_label_repairs=args.apply_label_repairs,
1281
+ )
1282
+ dataset_mode = "lazy"
1283
+ else:
1284
+ encoded_device = torch.device(args.encoded_dataset_device)
1285
+ if encoded_device.type == "cuda" and use_cpu:
1286
+ raise ValueError("--encoded-dataset-device cuda cannot be used with CPU training.")
1287
+ if encoded_device.type == "cuda" and config.num_workers > 0:
1288
+ raise ValueError("--encoded-dataset-device cuda requires --num-workers 0 to avoid worker duplication.")
1289
+ train_dataset = EncodedAnimeDataset(
1290
+ data=train_data,
1291
+ tokenizer=tokenizer,
1292
+ label2id=config.label2id,
1293
+ max_length=config.max_seq_length,
1294
+ device=encoded_device,
1295
+ apply_label_repairs=args.apply_label_repairs,
1296
+ )
1297
+ eval_dataset = EncodedAnimeDataset(
1298
+ data=eval_data,
1299
+ tokenizer=tokenizer,
1300
+ label2id=config.label2id,
1301
+ max_length=config.max_seq_length,
1302
+ device=encoded_device,
1303
+ apply_label_repairs=args.apply_label_repairs,
1304
+ )
1305
+ dataset_mode = "encoded"
1306
+ if not args.keep_raw_dataset:
1307
+ train_data = []
1308
+ all_data = []
1309
+ gc.collect()
1310
+ encode_finished_at = time.perf_counter()
1311
 
1312
  print(f" Train samples: {len(train_dataset)}")
1313
  print(f" Eval samples: {len(eval_dataset)}")
1314
+ print(f" Dataset mode: {dataset_mode}")
1315
+ print(f" Load time: {load_finished_at - load_started_at:.2f}s")
1316
+ print(f" Encode time: {encode_finished_at - encode_started_at:.2f}s")
1317
+
1318
+ use_bf16 = bool(args.bf16 and not use_cpu)
1319
+ use_fp16 = bool((not use_cpu) and not use_bf16 and not args.no_mixed_precision)
1320
+ if use_cpu and args.no_mixed_precision:
1321
+ use_fp16 = False
1322
+ if torch.cuda.is_available() and not use_cpu and args.tf32:
1323
+ torch.backends.cuda.matmul.allow_tf32 = True
1324
+ torch.backends.cudnn.allow_tf32 = True
1325
  print(f" Device: {'CPU' if use_cpu else 'CUDA'}")
1326
+ if not use_cpu:
1327
+ print(f" Mixed precision: {'bf16' if use_bf16 else ('fp16' if use_fp16 else 'disabled')}")
1328
+ print(f" TF32: {'enabled' if args.tf32 else 'disabled'}")
1329
+ eval_save_strategy = "no" if args.no_periodic_eval else ("steps" if args.checkpoint_steps else "epoch")
1330
+ save_strategy = "steps" if args.checkpoint_steps else "epoch"
1331
+
1332
+ dataloader_prefetch_factor = args.prefetch_factor
1333
+ if dataloader_prefetch_factor is None:
1334
+ dataloader_prefetch_factor = 4 if config.num_workers > 0 else None
1335
+ persistent_workers = bool(args.persistent_workers and config.num_workers > 0)
1336
+ dataloader_pin_memory = bool((not use_cpu) and not (not args.lazy_dataset and args.encoded_dataset_device == "cuda"))
1337
+ if args.lazy_dataset and config.num_workers == 0:
1338
+ print(" WARNING: lazy dataset mode is slower with zero workers; consider --num-workers 4+.")
1339
 
1340
  # Training arguments
1341
  training_args = TrainingArguments(
1342
  output_dir=config.save_dir,
1343
  num_train_epochs=config.num_epochs,
1344
+ max_steps=args.max_steps,
1345
  per_device_train_batch_size=config.batch_size,
1346
  per_device_eval_batch_size=config.batch_size,
1347
  eval_strategy=eval_save_strategy,
1348
+ save_strategy=save_strategy,
1349
+ eval_steps=args.checkpoint_steps if eval_save_strategy == "steps" else None,
1350
  save_steps=args.checkpoint_steps,
1351
  logging_steps=config.log_interval,
1352
  learning_rate=config.learning_rate,
 
1356
  use_cpu=use_cpu,
1357
  report_to=["tensorboard"] if args.tensorboard else "none",
1358
  save_total_limit=args.save_total_limit,
1359
+ load_best_model_at_end=not args.no_periodic_eval,
1360
  metric_for_best_model="f1",
1361
  greater_is_better=True,
1362
  dataloader_num_workers=config.num_workers,
1363
+ dataloader_pin_memory=dataloader_pin_memory,
1364
+ dataloader_prefetch_factor=dataloader_prefetch_factor,
1365
+ dataloader_persistent_workers=persistent_workers,
1366
  fp16=use_fp16,
1367
+ bf16=use_bf16,
1368
+ tf32=args.tf32 and not use_cpu,
1369
+ torch_compile=bool(args.torch_compile and not use_cpu),
1370
+ auto_find_batch_size=bool(args.auto_find_batch_size and not use_cpu),
1371
+ include_num_input_tokens_seen=True,
1372
  )
1373
 
1374
  # Data collator
1375
+ data_collator = FastTokenClassificationCollator()
1376
 
1377
  # Trainer
1378
+ perf_callback = TrainingPerfCallback(
1379
+ batch_size=config.batch_size,
1380
+ sequence_length=config.max_seq_length,
1381
+ log_steps=args.perf_log_steps,
1382
+ sample_interval=args.perf_sample_interval,
1383
+ )
1384
  trainer = Trainer(
1385
  model=model,
1386
  args=training_args,
 
1388
  eval_dataset=eval_dataset,
1389
  data_collator=data_collator,
1390
  compute_metrics=compute_metrics,
1391
+ callbacks=[perf_callback],
1392
  )
1393
 
1394
  # Train
 
1415
  metadata = {
1416
  "experiment_name": args.experiment_name,
1417
  "data_file": config.data_file,
1418
+ "data_sources": data_sources,
1419
+ "augmentation": augmentation_metadata,
1420
+ "dataset_mode": dataset_mode,
1421
+ "apply_label_repairs": args.apply_label_repairs,
1422
+ "keep_raw_dataset": args.keep_raw_dataset,
1423
  "tokenizer_variant": tokenizer_variant,
1424
  "vocab_file": vocab_path,
1425
  "vocab_size": tokenizer.vocab_size,
 
1430
  "intermediate_size": config.intermediate_size,
1431
  "train_samples": len(train_dataset),
1432
  "eval_samples": len(eval_dataset),
1433
+ "load_seconds": load_finished_at - load_started_at,
1434
+ "encode_seconds": encode_finished_at - encode_started_at,
1435
  "epochs": config.num_epochs,
1436
+ "max_steps": args.max_steps,
1437
  "batch_size": config.batch_size,
1438
  "learning_rate": config.learning_rate,
1439
  "warmup_steps": config.warmup_steps,
 
1442
  "fp16": use_fp16,
1443
  "gradient_accumulation_steps": training_args.gradient_accumulation_steps,
1444
  "dataloader_num_workers": config.num_workers,
1445
+ "dataloader_prefetch_factor": dataloader_prefetch_factor,
1446
+ "dataloader_persistent_workers": persistent_workers,
1447
+ "dataloader_pin_memory": dataloader_pin_memory,
1448
+ "encoded_dataset_device": args.encoded_dataset_device if not args.lazy_dataset else None,
1449
+ "mixed_precision": "bf16" if use_bf16 else ("fp16" if use_fp16 else "none"),
1450
+ "tf32": bool(args.tf32 and not use_cpu),
1451
+ "torch_compile": bool(args.torch_compile and not use_cpu),
1452
+ "auto_find_batch_size": bool(args.auto_find_batch_size and not use_cpu),
1453
+ "perf_log_steps": args.perf_log_steps,
1454
+ "perf_sample_interval": args.perf_sample_interval,
1455
+ "periodic_eval": not args.no_periodic_eval,
1456
  }
1457
  with open(os.path.join(final_save_path, "run_metadata.json"), "w", encoding="utf-8") as f:
1458
  json.dump(metadata, f, ensure_ascii=False, indent=2)
1459
  print(f"Model saved to: {final_save_path}")
1460
+ with open(os.path.join(final_save_path, "perf_metrics.json"), "w", encoding="utf-8") as f:
1461
+ json.dump(perf_callback.summary(), f, ensure_ascii=False, indent=2)
1462
+ train_runtime = None
1463
+ if trainer.state.log_history:
1464
+ for entry in reversed(trainer.state.log_history):
1465
+ if "train_runtime" in entry:
1466
+ train_runtime = entry["train_runtime"]
1467
+ break
1468
+ if train_runtime is not None:
1469
+ print(f" Train runtime: {train_runtime:.2f}s")
1470
+ print(f" Total wall time (load+encode+train): {(load_finished_at - load_started_at) + (encode_finished_at - encode_started_at) + train_runtime:.2f}s")
1471
 
1472
  # Final evaluation
1473
  print("\nFinal evaluation:")
docs/maintenance.md CHANGED
@@ -57,6 +57,7 @@ reports/run_metadata.json
57
  reports/trainer_eval_metrics.json
58
  reports/parse_eval_metrics.json
59
  reports/case_metrics.json
 
60
  reports/benchmark_results.json
61
  reports/training_lineage.json
62
  ```
@@ -102,7 +103,7 @@ Copy final files to the repository root:
102
  把 `final` 文件复制到仓库根目录:
103
 
104
  ```powershell
105
- $final = "checkpoints/dmhy-char-full/final"
106
  Copy-Item "$final/config.json" . -Force
107
  Copy-Item "$final/model.safetensors" . -Force
108
  Copy-Item "$final/tokenizer_config.json" . -Force
@@ -113,6 +114,7 @@ Copy-Item "$final/run_metadata.json" reports/run_metadata.json -Force
113
  Copy-Item "$final/trainer_eval_metrics.json" reports/trainer_eval_metrics.json -Force
114
  Copy-Item "$final/parse_eval_metrics.json" reports/parse_eval_metrics.json -Force
115
  Copy-Item "$final/case_metrics.json" reports/case_metrics.json -Force
 
116
  Copy-Item datasets/AnimeName/vocab.char.json .\vocab.char.json -Force
117
  ```
118
 
 
57
  reports/trainer_eval_metrics.json
58
  reports/parse_eval_metrics.json
59
  reports/case_metrics.json
60
+ reports/perf_metrics.json
61
  reports/benchmark_results.json
62
  reports/training_lineage.json
63
  ```
 
103
  把 `final` 文件复制到仓库根目录:
104
 
105
  ```powershell
106
+ $final = "checkpoints/dmhy-char-aug-fragments-10epoch-hardfocus/final"
107
  Copy-Item "$final/config.json" . -Force
108
  Copy-Item "$final/model.safetensors" . -Force
109
  Copy-Item "$final/tokenizer_config.json" . -Force
 
114
  Copy-Item "$final/trainer_eval_metrics.json" reports/trainer_eval_metrics.json -Force
115
  Copy-Item "$final/parse_eval_metrics.json" reports/parse_eval_metrics.json -Force
116
  Copy-Item "$final/case_metrics.json" reports/case_metrics.json -Force
117
+ Copy-Item "$final/perf_metrics.json" reports/perf_metrics.json -Force
118
  Copy-Item datasets/AnimeName/vocab.char.json .\vocab.char.json -Force
119
  ```
120
 
docs/training.md CHANGED
@@ -19,10 +19,10 @@ Recommended GPU configuration:
19
 
20
  推荐 GPU 配置:
21
 
22
- - RTX 3080 class GPU or better
23
- - batch size `192` to `256` for full char training
24
- - `fp16` enabled automatically when CUDA is available
25
- - `--num-workers 4` or `8` when the local disk can keep up
26
 
27
  ## 2. Dataset / 数据集
28
 
@@ -88,33 +88,49 @@ uv run python -m tools.convert_to_char_dataset `
88
  --progress 50000
89
  ```
90
 
91
- ## 5. Full Training / 全量训练
92
 
93
- Recommended RTX 3080 run:
94
 
95
- 推荐 RTX 3080 训练命令:
96
 
97
  ```powershell
98
- uv run python -m anifilebert.train --tokenizer char `
99
  --data-file datasets/AnimeName/dmhy_weak_char.jsonl `
100
- --vocab-file datasets/AnimeName/vocab.char.json `
101
- --save-dir checkpoints/dmhy-char-full `
102
  --init-model-dir . `
103
- --epochs 2 `
104
- --batch-size 256 `
105
- --learning-rate 0.00008 `
106
- --warmup-steps 300 `
107
  --max-seq-length 128 `
108
  --train-split 0.98 `
109
- --num-workers 4 `
110
  --checkpoint-steps 1000 `
111
  --save-total-limit 3 `
112
  --parse-eval-limit 2048 `
113
  --case-eval-file data/parser_regression_cases.json `
114
- --seed 52 `
115
- --experiment-name dmhy-char-full
 
 
 
 
 
 
116
  ```
117
 
 
 
 
 
 
 
 
 
 
 
118
  Training outputs:
119
 
120
  训练输出:
@@ -125,6 +141,7 @@ Training outputs:
125
  - `final/trainer_eval_metrics.json`: seqeval metrics / token/entity 指标
126
  - `final/parse_eval_metrics.json`: held-out parser exact-match / held-out 解析准确率
127
  - `final/case_metrics.json`: fixed real-world case regression / 固定真实 case 回归
 
128
  - TensorBoard logs unless `--no-tensorboard` is set / 默认写 TensorBoard
129
 
130
  ## 6. Thin Hard-Case Fine-Tuning / 薄层困难样本微调
@@ -139,30 +156,36 @@ been confirmed, fixed in the weak labels, and added to
139
  ```powershell
140
  uv run python -m tools.build_repair_focus_dataset `
141
  --input datasets/AnimeName/dmhy_weak_char.jsonl `
142
- --output data/thin_hard_focus_char.jsonl `
143
- --context-samples 30000 `
144
  --repeat-focus 3 `
145
- --repeat-manual 240 `
146
- --seed 57
147
-
148
- uv run python -m anifilebert.train --tokenizer char `
149
- --data-file data/thin_hard_focus_char.jsonl `
150
- --vocab-file datasets/AnimeName/vocab.char.json `
151
- --save-dir checkpoints/dmhy-char-thin-hardfocus `
152
- --init-model-dir . `
153
  --epochs 2 `
154
- --batch-size 256 `
155
- --learning-rate 0.00004 `
156
- --warmup-steps 80 `
157
  --max-seq-length 128 `
158
  --train-split 0.95 `
159
- --num-workers 4 `
160
  --checkpoint-steps 300 `
161
  --save-total-limit 2 `
162
- --parse-eval-limit 1024 `
163
  --case-eval-file data/parser_regression_cases.json `
164
- --seed 58 `
165
- --experiment-name dmhy-char-thin-hardfocus
 
 
 
 
 
 
166
  ```
167
 
168
  The default quality gate is model-led parsing:
@@ -186,7 +209,7 @@ The repository root is the Hugging Face checkpoint surface.
186
  仓库根目录就是 Hugging Face checkpoint 发布面。
187
 
188
  ```powershell
189
- $final = "checkpoints/dmhy-char-full/final"
190
  Copy-Item "$final/config.json" . -Force
191
  Copy-Item "$final/model.safetensors" . -Force
192
  Copy-Item "$final/tokenizer_config.json" . -Force
@@ -197,6 +220,7 @@ Copy-Item "$final/run_metadata.json" reports/run_metadata.json -Force
197
  Copy-Item "$final/trainer_eval_metrics.json" reports/trainer_eval_metrics.json -Force
198
  Copy-Item "$final/parse_eval_metrics.json" reports/parse_eval_metrics.json -Force
199
  Copy-Item "$final/case_metrics.json" reports/case_metrics.json -Force
 
200
  Copy-Item datasets/AnimeName/vocab.char.json .\vocab.char.json -Force
201
  ```
202
 
 
19
 
20
  推荐 GPU 配置:
21
 
22
+ - RTX 3080 class GPU or better; current release training used an RTX 5070 Ti
23
+ - batch size `1792` with the encoded dataset path on the 5070 Ti
24
+ - `bf16`/TF32 on Ada/Blackwell-class CUDA devices when available
25
+ - `--num-workers 0` with the encoded dataset path, because samples are pre-encoded into tensors
26
 
27
  ## 2. Dataset / 数据集
28
 
 
88
  --progress 50000
89
  ```
90
 
91
+ ## 5. Full Training with Dynamic Augmentation / 动态增强全量训练
92
 
93
+ Recommended RTX 5070 Ti run:
94
 
95
+ 推荐 RTX 5070 Ti 训练命令:
96
 
97
  ```powershell
98
+ .\.venv\Scripts\python.exe -m anifilebert.train --tokenizer char `
99
  --data-file datasets/AnimeName/dmhy_weak_char.jsonl `
100
+ --vocab-file vocab.json `
101
+ --save-dir checkpoints/dmhy-char-aug-fragments-optimized-10epoch `
102
  --init-model-dir . `
103
+ --epochs 10 `
104
+ --batch-size 1792 `
105
+ --learning-rate 0.00002 `
106
+ --warmup-steps 500 `
107
  --max-seq-length 128 `
108
  --train-split 0.98 `
109
+ --num-workers 0 `
110
  --checkpoint-steps 1000 `
111
  --save-total-limit 3 `
112
  --parse-eval-limit 2048 `
113
  --case-eval-file data/parser_regression_cases.json `
114
+ --augment-partial-samples 200000 `
115
+ --augment-permutation-samples 400000 `
116
+ --augment-special-samples 80000 `
117
+ --bf16 `
118
+ --no-periodic-eval `
119
+ --perf-log-steps 200 `
120
+ --seed 105 `
121
+ --experiment-name dmhy-char-aug-fragments-optimized-10epoch
122
  ```
123
 
124
+ Dynamic augmentation is generated in memory from BIO-labeled source rows and
125
+ does not modify the authoritative DMHY JSONL files. The current release used
126
+ partial/incomplete filename fragments, BIO entity block subsets and
127
+ permutations, title-only/title+season directory-style examples, and standalone
128
+ special fragments such as `Menu01`, `OP02`, `ED E07`, and `NCED03`.
129
+
130
+ 动态增强从已有 BIO 标注行内存生成,不会修改权威 DMHY JSONL。当前发布使用了
131
+ 不完整文件名片段、BIO 实体块子集和重排、只有 title 或 title+season 的目录样式
132
+ 样本,以及 `Menu01`、`OP02`、`ED E07`、`NCED03` 等 standalone special 片段。
133
+
134
  Training outputs:
135
 
136
  训练输出:
 
141
  - `final/trainer_eval_metrics.json`: seqeval metrics / token/entity 指标
142
  - `final/parse_eval_metrics.json`: held-out parser exact-match / held-out 解析准确率
143
  - `final/case_metrics.json`: fixed real-world case regression / 固定真实 case 回归
144
+ - `final/perf_metrics.json`: training throughput/GPU telemetry when enabled / 启用时记录训练吞吐和 GPU 采样
145
  - TensorBoard logs unless `--no-tensorboard` is set / 默认写 TensorBoard
146
 
147
  ## 6. Thin Hard-Case Fine-Tuning / 薄层困难样本微调
 
156
  ```powershell
157
  uv run python -m tools.build_repair_focus_dataset `
158
  --input datasets/AnimeName/dmhy_weak_char.jsonl `
159
+ --output data/generated/focus_after_10epoch_char.jsonl `
160
+ --context-samples 100000 `
161
  --repeat-focus 3 `
162
+ --repeat-manual 400 `
163
+ --seed 106
164
+
165
+ .\.venv\Scripts\python.exe -m anifilebert.train --tokenizer char `
166
+ --data-file data/generated/focus_after_10epoch_char.jsonl `
167
+ --vocab-file vocab.json `
168
+ --save-dir checkpoints/dmhy-char-aug-fragments-10epoch-hardfocus `
169
+ --init-model-dir checkpoints/dmhy-char-aug-fragments-optimized-10epoch/final `
170
  --epochs 2 `
171
+ --batch-size 1792 `
172
+ --learning-rate 0.000008 `
173
+ --warmup-steps 50 `
174
  --max-seq-length 128 `
175
  --train-split 0.95 `
176
+ --num-workers 0 `
177
  --checkpoint-steps 300 `
178
  --save-total-limit 2 `
179
+ --parse-eval-limit 2048 `
180
  --case-eval-file data/parser_regression_cases.json `
181
+ --augment-partial-samples 30000 `
182
+ --augment-permutation-samples 60000 `
183
+ --augment-special-samples 20000 `
184
+ --bf16 `
185
+ --no-periodic-eval `
186
+ --perf-log-steps 50 `
187
+ --seed 107 `
188
+ --experiment-name dmhy-char-aug-fragments-10epoch-hardfocus
189
  ```
190
 
191
  The default quality gate is model-led parsing:
 
209
  仓库根目录就是 Hugging Face checkpoint 发布面。
210
 
211
  ```powershell
212
+ $final = "checkpoints/dmhy-char-aug-fragments-10epoch-hardfocus/final"
213
  Copy-Item "$final/config.json" . -Force
214
  Copy-Item "$final/model.safetensors" . -Force
215
  Copy-Item "$final/tokenizer_config.json" . -Force
 
220
  Copy-Item "$final/trainer_eval_metrics.json" reports/trainer_eval_metrics.json -Force
221
  Copy-Item "$final/parse_eval_metrics.json" reports/parse_eval_metrics.json -Force
222
  Copy-Item "$final/case_metrics.json" reports/case_metrics.json -Force
223
+ Copy-Item "$final/perf_metrics.json" reports/perf_metrics.json -Force
224
  Copy-Item datasets/AnimeName/vocab.char.json .\vocab.char.json -Force
225
  ```
226
 
exports/anime_filename_parser.metadata.json CHANGED
@@ -8,5 +8,5 @@
8
  128,
9
  15
10
  ],
11
- "max_abs_diff": 4.0531158447265625e-05
12
  }
 
8
  128,
9
  15
10
  ],
11
+ "max_abs_diff": 1.9073486328125e-05
12
  }
exports/anime_filename_parser.onnx CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:845e01ebdbf4a933610fcfb9f5be2fec2367e9db26d98308d827cbe23817b072
3
- size 19645986
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5a09d5387e94373cccd22cd821edf0654d537a7897cf8abb04900f48a5ffaccf
3
+ size 19647024
model.safetensors CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:4c5c4e57443ed66fed3812c7c6fe2f14af292a8a32523017930fde2ac93d67ff
3
  size 19142604
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:401c62d2359e1030930892fd6be3d8a25abf758f3cb43b4d445562890fe1f2c6
3
  size 19142604
reports/benchmark_results.json CHANGED
@@ -11,27 +11,27 @@
11
  "results": [
12
  {
13
  "name": "pytorch",
14
- "load_ms": 76.55749993864447,
15
  "runs": 520,
16
- "avg_ms": 16.846879808312785,
17
- "p50_ms": 16.207700013183057,
18
- "p95_ms": 22.843200032366425,
19
- "p99_ms": 28.308318012859665,
20
- "min_ms": 11.152399936690927,
21
- "max_ms": 34.10990000702441,
22
- "throughput_fps": 59.35817263363916
23
  },
24
  {
25
  "name": "onnxruntime",
26
- "load_ms": 49.74160005804151,
27
  "runs": 520,
28
- "avg_ms": 13.178169615835381,
29
- "p50_ms": 12.862899922765791,
30
- "p95_ms": 16.696884995326396,
31
- "p99_ms": 18.06362595874816,
32
- "min_ms": 9.811799973249435,
33
- "max_ms": 20.784800057299435,
34
- "throughput_fps": 75.88307247148819
35
  }
36
  ]
37
- }
 
11
  "results": [
12
  {
13
  "name": "pytorch",
14
+ "load_ms": 44.84080011025071,
15
  "runs": 520,
16
+ "avg_ms": 16.417674036347307,
17
+ "p50_ms": 14.76569997612387,
18
+ "p95_ms": 26.30644003511406,
19
+ "p99_ms": 32.615189072675996,
20
+ "min_ms": 11.30899996496737,
21
+ "max_ms": 41.87910002656281,
22
+ "throughput_fps": 60.909967988527896
23
  },
24
  {
25
  "name": "onnxruntime",
26
+ "load_ms": 40.69980001077056,
27
  "runs": 520,
28
+ "avg_ms": 11.606730768779435,
29
+ "p50_ms": 11.42695004818961,
30
+ "p95_ms": 13.516889995662494,
31
+ "p99_ms": 15.196251904126225,
32
+ "min_ms": 9.510300005786121,
33
+ "max_ms": 19.771000021137297,
34
+ "throughput_fps": 86.15690498222524
35
  }
36
  ]
37
+ }
reports/parse_eval_metrics.json CHANGED
@@ -3,184 +3,212 @@
3
  "modes": {
4
  "model_only": {
5
  "constrain_bio": false,
6
- "sample_count": 1024,
7
  "field_accuracy": {
8
- "group": 1.0,
9
- "title": 0.9970703125,
10
- "season": 1.0,
11
- "episode": 1.0,
12
  "resolution": 1.0,
13
- "source": 0.9990234375,
14
- "special": 0.994140625
15
  },
16
  "field_correct": {
17
- "group": 1024,
18
- "title": 1021,
19
- "season": 1024,
20
- "episode": 1024,
21
- "resolution": 1024,
22
- "source": 1023,
23
- "special": 1018
24
  },
25
  "field_total": {
26
- "group": 1024,
27
- "title": 1024,
28
- "season": 1024,
29
- "episode": 1024,
30
- "resolution": 1024,
31
- "source": 1024,
32
- "special": 1024
33
  },
34
- "full_match_accuracy": 0.990234375,
35
- "full_match_correct": 1014,
36
- "full_match_total": 1024,
37
  "failures": [
38
  {
39
- "filename": "BD Menu Vol.05",
40
  "errors": {
41
  "title": {
42
- "gold": "menu",
43
- "pred": "men"
 
 
 
 
44
  }
45
  },
46
  "gold": {
47
  "group": null,
48
- "title": "Menu",
49
  "season": null,
50
  "episode": null,
51
  "resolution": null,
52
- "source": "BD",
53
  "special": null
54
  },
55
  "pred": {
56
  "group": null,
57
- "title": "Men",
58
  "season": null,
59
- "episode": null,
60
  "resolution": null,
61
- "source": "BD",
62
  "special": null
63
  }
64
  },
65
  {
66
- "filename": "[YYDM-11FANS][Shaman King][43][DVDRip][720P][X264-10bit_AACx2][ED490609]",
67
  "errors": {
 
 
 
 
68
  "special": {
69
- "gold": "ed490609",
70
- "pred": "ed"
71
  }
72
  },
73
  "gold": {
74
- "group": "YYDM-11FANS",
75
- "title": "Shaman King",
76
  "season": null,
77
- "episode": 43,
78
- "resolution": "720P",
79
- "source": "DVDRip",
80
- "special": "ED490609"
81
  },
82
  "pred": {
83
- "group": "YYDM-11FANS",
84
- "title": "Shaman King",
85
  "season": null,
86
- "episode": 43,
87
- "resolution": "720P",
88
- "source": "DVDRip",
89
- "special": "ED"
90
  }
91
  },
92
  {
93
- "filename": "[UHA-WINGS&VCB-Studio] Karakai Jouzu no Takagi-san 2 [Binaural Sound EP09][Ma10p_1080p][x265_flac]",
94
  "errors": {
95
- "title": {
96
- "gold": "uha-wings&vcb-studio karakai jouzu no takagi san 2 binaural sound ep",
97
- "pred": "uha-wings&vcb-studio karakai jouzu no takagi san 2 binaural sound"
 
 
 
 
98
  }
99
  },
100
  "gold": {
101
  "group": null,
102
- "title": "UHA-WINGS&VCB-Studio Karakai Jouzu no Takagi san 2 Binaural Sound EP",
103
  "season": null,
104
- "episode": 9,
105
- "resolution": "1080p",
106
- "source": "x265-flac",
107
- "special": null
108
  },
109
  "pred": {
110
  "group": null,
111
- "title": "UHA-WINGS&VCB-Studio Karakai Jouzu no Takagi san 2 Binaural Sound",
112
  "season": null,
113
- "episode": 9,
114
- "resolution": "1080p",
115
- "source": "x265-flac",
116
- "special": null
117
  }
118
  },
119
  {
120
- "filename": "終末なにしてますか?忙しいですか?救ってもらっていいですか? OP2 「DEAREST DROP」",
121
  "errors": {
 
 
 
 
122
  "special": {
123
- "gold": "op2",
124
- "pred": "p"
125
  }
126
  },
127
  "gold": {
128
  "group": null,
129
- "title": "終末なにしてますか?忙しいですか?救ってもらっていいですか?",
130
  "season": null,
131
  "episode": null,
132
  "resolution": null,
133
- "source": null,
134
- "special": "OP2"
135
  },
136
  "pred": {
137
  "group": null,
138
- "title": "終末なにしてますか?忙しいですか?救ってもらっていいですか?",
139
  "season": null,
140
  "episode": null,
141
  "resolution": null,
142
  "source": null,
143
- "special": "P"
144
  }
145
  },
146
  {
147
- "filename": "[QTS] CITY HUNTER TV 3rd & '91 Series BD-BOX Eizou Tokuten - City Hunter 3 Housouchuu CM2 30sec (BD Hi10P 960x720 AAC)",
148
  "errors": {
149
- "special": {
150
- "gold": "cm2",
151
- "pred": "3"
 
 
 
 
 
 
 
 
152
  }
153
  },
154
  "gold": {
155
- "group": "QTS",
156
- "title": "CITY HUNTER TV 3rd & '91 Series",
157
  "season": null,
158
- "episode": null,
159
  "resolution": "960x720",
160
- "source": "BD",
161
- "special": "CM2"
162
  },
163
  "pred": {
164
- "group": "QTS",
165
- "title": "CITY HUNTER TV 3rd & '91 Series",
166
  "season": null,
167
  "episode": null,
168
  "resolution": "960x720",
169
- "source": "BD",
170
- "special": "3"
171
  }
172
  },
173
  {
174
- "filename": "22話「最凶恶“他”Part 1/最凶恶的“他”Part 2」",
175
  "errors": {
 
 
 
 
176
  "title": {
177
- "gold": "22話「最凶恶“他”part 1/最凶恶的“他”part 2」",
178
- "pred": "2 話「最凶恶“他”part 1/最凶恶的“他”part 2」"
179
  }
180
  },
181
  "gold": {
182
- "group": null,
183
- "title": "22話「最凶恶“他”Part 1/最凶恶的“他”Part 2」",
184
  "season": null,
185
  "episode": null,
186
  "resolution": null,
@@ -189,7 +217,7 @@
189
  },
190
  "pred": {
191
  "group": null,
192
- "title": "2 話「最凶恶“他”Part 1/最凶恶的“他”Part 2」",
193
  "season": null,
194
  "episode": null,
195
  "resolution": null,
@@ -198,339 +226,1080 @@
198
  }
199
  },
200
  {
201
- "filename": "[Judgment] Kareshi Kanojo no Jijou - NCED19.0 [6C5BD6E2]",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
202
  "errors": {
203
  "source": {
204
  "gold": "bd",
205
  "pred": null
 
 
 
 
206
  }
207
  },
208
  "gold": {
209
- "group": "Judgment",
210
- "title": "Kareshi Kanojo no Jijou",
211
  "season": null,
212
  "episode": null,
213
  "resolution": null,
214
  "source": "BD",
215
- "special": "NCED19"
216
  },
217
  "pred": {
218
- "group": "Judgment",
219
- "title": "Kareshi Kanojo no Jijou",
220
  "season": null,
221
  "episode": null,
222
  "resolution": null,
223
  "source": null,
224
- "special": "NCED19"
225
  }
226
  },
227
  {
228
- "filename": "[QTS] OVA QUIZ MAGIC ACADEMY The Original Animation OMAKE Eizou - EP1 OP + EP2 OPED (BD Hi10P 1920x1080 WV)",
229
  "errors": {
 
 
 
 
230
  "special": {
231
- "gold": "op",
232
- "pred": "d"
233
  }
234
  },
235
  "gold": {
236
- "group": "QTS",
237
- "title": "QUIZ MAGIC ACADEMY The Original Animation OMAKE Eizou",
238
  "season": null,
239
- "episode": 1,
240
- "resolution": "1920x1080",
241
  "source": "BD",
242
- "special": "OP"
243
  },
244
  "pred": {
245
- "group": "QTS",
246
- "title": "QUIZ MAGIC ACADEMY The Original Animation OMAKE Eizou",
247
  "season": null,
248
- "episode": 1,
249
- "resolution": "1920x1080",
250
- "source": "BD",
251
- "special": "D"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
252
  }
253
  },
254
  {
255
- "filename": "[Moozzi2] Ojamajo Doremi Movie - 01 [ Sharp ] (BD 1920x1032 x.264 Flac)",
256
  "errors": {
 
 
 
 
 
 
 
 
257
  "special": {
258
- "gold": "movie",
259
- "pred": "0"
260
  }
261
  },
262
  "gold": {
263
- "group": "Moozzi2",
264
- "title": "Ojamajo Doremi",
265
  "season": null,
266
- "episode": 1,
267
- "resolution": "1920x1032",
268
- "source": "BD",
269
- "special": "Movie"
270
  },
271
  "pred": {
272
- "group": "Moozzi2",
273
- "title": "Ojamajo Doremi",
274
  "season": null,
275
- "episode": 1,
276
- "resolution": "1920x1032",
277
- "source": "BD",
278
- "special": "0"
279
  }
280
  },
281
  {
282
- "filename": "[Nekomoe kissaten&VCB-Studio] THE IDOLM@STER CINDERELLA GIRLS U149 [NCED07 お願い!シンデレラ][Ma10p_1080p][x265_flac]",
283
  "errors": {
284
- "special": {
285
- "gold": "nced",
286
- "pred": "7"
 
 
 
 
287
  }
288
  },
289
  "gold": {
290
- "group": "Nekomoe kissaten&VCB-Studio",
291
- "title": "THE IDOLM@STER CINDERELLA GIRLS U",
292
  "season": null,
293
- "episode": 149,
294
- "resolution": "1080p",
295
- "source": "x265-flac",
296
- "special": "NCED"
297
  },
298
  "pred": {
299
- "group": "Nekomoe kissaten&VCB-Studio",
300
- "title": "THE IDOLM@STER CINDERELLA GIRLS U",
301
  "season": null,
302
- "episode": 149,
303
- "resolution": "1080p",
304
- "source": "x265-flac",
305
- "special": "7"
306
  }
307
- }
308
- ]
309
- },
310
- "normalized_only": {
311
- "constrain_bio": true,
312
- "sample_count": 1024,
313
- "field_accuracy": {
314
- "group": 1.0,
315
- "title": 0.9970703125,
316
- "season": 1.0,
317
- "episode": 1.0,
318
- "resolution": 1.0,
319
- "source": 0.9990234375,
320
- "special": 0.9970703125
321
- },
322
- "field_correct": {
323
- "group": 1024,
324
- "title": 1021,
325
- "season": 1024,
326
- "episode": 1024,
327
- "resolution": 1024,
328
- "source": 1023,
329
- "special": 1021
330
- },
331
- "field_total": {
332
- "group": 1024,
333
- "title": 1024,
334
- "season": 1024,
335
- "episode": 1024,
336
- "resolution": 1024,
337
- "source": 1024,
338
- "special": 1024
339
- },
340
- "full_match_accuracy": 0.9931640625,
341
- "full_match_correct": 1017,
342
- "full_match_total": 1024,
343
- "failures": [
344
  {
345
- "filename": "BD Menu Vol.05",
346
  "errors": {
347
  "title": {
348
- "gold": "menu",
349
- "pred": "men"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
350
  }
351
  },
352
  "gold": {
353
  "group": null,
354
- "title": "Menu",
355
  "season": null,
356
  "episode": null,
357
  "resolution": null,
358
  "source": "BD",
359
- "special": null
360
  },
361
  "pred": {
362
  "group": null,
363
- "title": "Men",
364
  "season": null,
365
  "episode": null,
366
  "resolution": null,
367
- "source": "BD",
368
- "special": null
369
  }
370
  },
371
  {
372
- "filename": "[YYDM-11FANS][Shaman King][43][DVDRip][720P][X264-10bit_AACx2][ED490609]",
373
  "errors": {
 
 
 
 
374
  "special": {
375
- "gold": "ed490609",
376
- "pred": "ed"
377
  }
378
  },
379
  "gold": {
380
- "group": "YYDM-11FANS",
381
- "title": "Shaman King",
382
  "season": null,
383
- "episode": 43,
384
- "resolution": "720P",
385
- "source": "DVDRip",
386
- "special": "ED490609"
387
  },
388
  "pred": {
389
- "group": "YYDM-11FANS",
390
- "title": "Shaman King",
391
  "season": null,
392
- "episode": 43,
393
- "resolution": "720P",
394
- "source": "DVDRip",
395
- "special": "ED"
396
  }
397
  },
398
  {
399
- "filename": "[UHA-WINGS&VCB-Studio] Karakai Jouzu no Takagi-san 2 [Binaural Sound EP09][Ma10p_1080p][x265_flac]",
400
  "errors": {
401
  "title": {
402
- "gold": "uha-wings&vcb-studio karakai jouzu no takagi san 2 binaural sound ep",
403
- "pred": "uha-wings&vcb-studio karakai jouzu no takagi san 2 binaural sound"
 
 
 
 
404
  }
405
  },
406
  "gold": {
407
  "group": null,
408
- "title": "UHA-WINGS&VCB-Studio Karakai Jouzu no Takagi san 2 Binaural Sound EP",
409
  "season": null,
410
- "episode": 9,
411
- "resolution": "1080p",
412
- "source": "x265-flac",
413
- "special": null
414
  },
415
  "pred": {
416
  "group": null,
417
- "title": "UHA-WINGS&VCB-Studio Karakai Jouzu no Takagi san 2 Binaural Sound",
418
  "season": null,
419
- "episode": 9,
420
- "resolution": "1080p",
421
- "source": "x265-flac",
422
  "special": null
423
  }
424
  },
425
  {
426
- "filename": "[QTS] CITY HUNTER TV 3rd & '91 Series BD-BOX Eizou Tokuten - City Hunter 3 Housouchuu CM2 30sec (BD Hi10P 960x720 AAC)",
427
  "errors": {
428
- "special": {
429
- "gold": "cm2",
430
- "pred": "cm2 3"
431
  }
432
  },
433
  "gold": {
434
- "group": "QTS",
435
- "title": "CITY HUNTER TV 3rd & '91 Series",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
436
  "season": null,
437
  "episode": null,
438
- "resolution": "960x720",
439
- "source": "BD",
440
- "special": "CM2"
441
  },
442
  "pred": {
443
- "group": "QTS",
444
- "title": "CITY HUNTER TV 3rd & '91 Series",
445
  "season": null,
446
  "episode": null,
447
- "resolution": "960x720",
448
- "source": "BD",
449
- "special": "CM2 3"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
450
  }
451
  },
452
  {
453
- "filename": "22話「最凶恶的“他”Part 1/最凶恶的“他”Part 2」",
454
  "errors": {
 
 
 
 
455
  "title": {
456
- "gold": "22話「最凶恶的“他”part 1/最凶恶的“他”part 2」",
457
- "pred": "22 話「最凶恶的“他”part 1/最凶恶的“他”part 2」"
458
  }
459
  },
460
  "gold": {
461
  "group": null,
462
- "title": "22話「最凶恶的“他”Part 1/最凶恶的“他”Part 2」",
463
  "season": null,
464
  "episode": null,
465
  "resolution": null,
466
- "source": null,
467
  "special": null
468
  },
469
  "pred": {
470
- "group": null,
471
- "title": "22 話「最凶恶的“他”Part 1/最凶恶的“他”Part 2」",
472
  "season": null,
473
  "episode": null,
474
  "resolution": null,
475
- "source": null,
476
  "special": null
477
  }
478
- },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
479
  {
480
- "filename": "[Judgment] Kareshi Kanojo no Jijou - NCED19.0 [6C5BD6E2]",
481
  "errors": {
482
- "source": {
483
- "gold": "bd",
484
  "pred": null
 
 
 
 
485
  }
486
  },
487
  "gold": {
488
- "group": "Judgment",
489
- "title": "Kareshi Kanojo no Jijou",
490
  "season": null,
491
  "episode": null,
492
  "resolution": null,
493
- "source": "BD",
494
- "special": "NCED19"
495
  },
496
  "pred": {
497
- "group": "Judgment",
498
- "title": "Kareshi Kanojo no Jijou",
499
  "season": null,
500
- "episode": null,
501
  "resolution": null,
502
- "source": null,
503
- "special": "NCED19"
504
  }
505
  },
506
  {
507
- "filename": "[Nekomoe kissaten&VCB-Studio] THE IDOLM@STER CINDERELLA GIRLS U149 [NCED07 お願い!シンデレラ][Ma10p_1080p][x265_flac]",
508
  "errors": {
 
 
 
 
509
  "special": {
510
- "gold": "nced",
511
- "pred": "nced07"
512
  }
513
  },
514
  "gold": {
515
- "group": "Nekomoe kissaten&VCB-Studio",
516
- "title": "THE IDOLM@STER CINDERELLA GIRLS U",
517
  "season": null,
518
- "episode": 149,
519
  "resolution": "1080p",
520
- "source": "x265-flac",
521
- "special": "NCED"
522
  },
523
  "pred": {
524
- "group": "Nekomoe kissaten&VCB-Studio",
525
- "title": "THE IDOLM@STER CINDERELLA GIRLS U",
526
  "season": null,
527
- "episode": 149,
528
  "resolution": "1080p",
529
- "source": "x265-flac",
530
- "special": "NCED07"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
531
  }
532
  }
533
  ]
534
  }
535
  }
536
- }
 
3
  "modes": {
4
  "model_only": {
5
  "constrain_bio": false,
6
+ "sample_count": 2048,
7
  "field_accuracy": {
8
+ "group": 0.98583984375,
9
+ "title": 0.97119140625,
10
+ "season": 0.99609375,
11
+ "episode": 0.990234375,
12
  "resolution": 1.0,
13
+ "source": 0.990234375,
14
+ "special": 0.9775390625
15
  },
16
  "field_correct": {
17
+ "group": 2019,
18
+ "title": 1989,
19
+ "season": 2040,
20
+ "episode": 2028,
21
+ "resolution": 2048,
22
+ "source": 2028,
23
+ "special": 2002
24
  },
25
  "field_total": {
26
+ "group": 2048,
27
+ "title": 2048,
28
+ "season": 2048,
29
+ "episode": 2048,
30
+ "resolution": 2048,
31
+ "source": 2048,
32
+ "special": 2048
33
  },
34
+ "full_match_accuracy": 0.95068359375,
35
+ "full_match_correct": 1947,
36
+ "full_match_total": 2048,
37
  "failures": [
38
  {
39
+ "filename": "01; - flac",
40
  "errors": {
41
  "title": {
42
+ "gold": "01;",
43
+ "pred": ";"
44
+ },
45
+ "episode": {
46
+ "gold": null,
47
+ "pred": "1"
48
  }
49
  },
50
  "gold": {
51
  "group": null,
52
+ "title": "01;",
53
  "season": null,
54
  "episode": null,
55
  "resolution": null,
56
+ "source": "flac",
57
  "special": null
58
  },
59
  "pred": {
60
  "group": null,
61
+ "title": ";",
62
  "season": null,
63
+ "episode": 1,
64
  "resolution": null,
65
+ "source": "flac",
66
  "special": null
67
  }
68
  },
69
  {
70
+ "filename": "[VCB-Studio] Durarara!!×2 Shou [IV][Ma10p_1080p][x265_aac]",
71
  "errors": {
72
+ "title": {
73
+ "gold": "durarara!!×2 shou iv",
74
+ "pred": "durarara!!×2 shou"
75
+ },
76
  "special": {
77
+ "gold": null,
78
+ "pred": "iv"
79
  }
80
  },
81
  "gold": {
82
+ "group": "VCB-Studio",
83
+ "title": "Durarara!!×2 Shou IV",
84
  "season": null,
85
+ "episode": null,
86
+ "resolution": "1080p",
87
+ "source": "x265-aac",
88
+ "special": null
89
  },
90
  "pred": {
91
+ "group": "VCB-Studio",
92
+ "title": "Durarara!!×2 Shou",
93
  "season": null,
94
+ "episode": null,
95
+ "resolution": "1080p",
96
+ "source": "x265-aac",
97
+ "special": "IV"
98
  }
99
  },
100
  {
101
+ "filename": "AC3 Chap - BD Menu16",
102
  "errors": {
103
+ "source": {
104
+ "gold": "bd",
105
+ "pred": null
106
+ },
107
+ "special": {
108
+ "gold": "menu16",
109
+ "pred": "bd menu16"
110
  }
111
  },
112
  "gold": {
113
  "group": null,
114
+ "title": "AC3 Chap",
115
  "season": null,
116
+ "episode": null,
117
+ "resolution": null,
118
+ "source": "BD",
119
+ "special": "Menu16"
120
  },
121
  "pred": {
122
  "group": null,
123
+ "title": "AC3 Chap",
124
  "season": null,
125
+ "episode": null,
126
+ "resolution": null,
127
+ "source": null,
128
+ "special": "BD Menu16"
129
  }
130
  },
131
  {
132
+ "filename": "Puella Magi Madoka Magica - BD Menu14",
133
  "errors": {
134
+ "source": {
135
+ "gold": "bd",
136
+ "pred": null
137
+ },
138
  "special": {
139
+ "gold": "menu14",
140
+ "pred": "bd menu14"
141
  }
142
  },
143
  "gold": {
144
  "group": null,
145
+ "title": "Puella Magi Madoka Magica",
146
  "season": null,
147
  "episode": null,
148
  "resolution": null,
149
+ "source": "BD",
150
+ "special": "Menu14"
151
  },
152
  "pred": {
153
  "group": null,
154
+ "title": "Puella Magi Madoka Magica",
155
  "season": null,
156
  "episode": null,
157
  "resolution": null,
158
  "source": null,
159
+ "special": "BD Menu14"
160
  }
161
  },
162
  {
163
+ "filename": "Kirion Hikaru no Go 72 [960x720]",
164
  "errors": {
165
+ "group": {
166
+ "gold": "kirion",
167
+ "pred": null
168
+ },
169
+ "title": {
170
+ "gold": "hikaru no go",
171
+ "pred": "kirion hikaru no go 72"
172
+ },
173
+ "episode": {
174
+ "gold": "72",
175
+ "pred": null
176
  }
177
  },
178
  "gold": {
179
+ "group": "Kirion",
180
+ "title": "Hikaru no Go",
181
  "season": null,
182
+ "episode": 72,
183
  "resolution": "960x720",
184
+ "source": null,
185
+ "special": null
186
  },
187
  "pred": {
188
+ "group": null,
189
+ "title": "Kirion Hikaru no Go 72",
190
  "season": null,
191
  "episode": null,
192
  "resolution": "960x720",
193
+ "source": null,
194
+ "special": null
195
  }
196
  },
197
  {
198
+ "filename": "葬送芙莉莲 - 喵萌奶茶屋",
199
  "errors": {
200
+ "group": {
201
+ "gold": "喵萌奶茶屋",
202
+ "pred": null
203
+ },
204
  "title": {
205
+ "gold": "葬送芙莉莲",
206
+ "pred": "葬送芙莉莲 - 喵萌奶茶屋"
207
  }
208
  },
209
  "gold": {
210
+ "group": "喵萌奶茶屋",
211
+ "title": "葬送芙莉莲",
212
  "season": null,
213
  "episode": null,
214
  "resolution": null,
 
217
  },
218
  "pred": {
219
  "group": null,
220
+ "title": "葬送芙莉莲 - 喵萌奶茶屋",
221
  "season": null,
222
  "episode": null,
223
  "resolution": null,
 
226
  }
227
  },
228
  {
229
+ "filename": "[VCB-Studio] Taimadou Gakuen 35 Shiken Shoutai [IV][Ma10p_1080p][x265_aac]",
230
+ "errors": {
231
+ "title": {
232
+ "gold": "taimadou gakuen 35 shiken shoutai iv",
233
+ "pred": "taimadou gakuen 35 shiken shoutai v"
234
+ }
235
+ },
236
+ "gold": {
237
+ "group": "VCB-Studio",
238
+ "title": "Taimadou Gakuen 35 Shiken Shoutai IV",
239
+ "season": null,
240
+ "episode": null,
241
+ "resolution": "1080p",
242
+ "source": "x265-aac",
243
+ "special": null
244
+ },
245
+ "pred": {
246
+ "group": "VCB-Studio",
247
+ "title": "Taimadou Gakuen 35 Shiken Shoutai V",
248
+ "season": null,
249
+ "episode": null,
250
+ "resolution": "1080p",
251
+ "source": "x265-aac",
252
+ "special": null
253
+ }
254
+ },
255
+ {
256
+ "filename": "Dr.Slump.Arale-chan.097 - BD Menu14",
257
  "errors": {
258
  "source": {
259
  "gold": "bd",
260
  "pred": null
261
+ },
262
+ "special": {
263
+ "gold": "menu14",
264
+ "pred": "bd menu14"
265
  }
266
  },
267
  "gold": {
268
+ "group": null,
269
+ "title": "Dr.Slump.Arale-chan.097",
270
  "season": null,
271
  "episode": null,
272
  "resolution": null,
273
  "source": "BD",
274
+ "special": "Menu14"
275
  },
276
  "pred": {
277
+ "group": null,
278
+ "title": "Dr.Slump.Arale-chan.097",
279
  "season": null,
280
  "episode": null,
281
  "resolution": null,
282
  "source": null,
283
+ "special": "BD Menu14"
284
  }
285
  },
286
  {
287
+ "filename": "Shiroi Suna no Aquatope - BD Menu05",
288
  "errors": {
289
+ "source": {
290
+ "gold": "bd",
291
+ "pred": null
292
+ },
293
  "special": {
294
+ "gold": "menu05",
295
+ "pred": "bd menu05"
296
  }
297
  },
298
  "gold": {
299
+ "group": null,
300
+ "title": "Shiroi Suna no Aquatope",
301
  "season": null,
302
+ "episode": null,
303
+ "resolution": null,
304
  "source": "BD",
305
+ "special": "Menu05"
306
  },
307
  "pred": {
308
+ "group": null,
309
+ "title": "Shiroi Suna no Aquatope",
310
  "season": null,
311
+ "episode": null,
312
+ "resolution": null,
313
+ "source": null,
314
+ "special": "BD Menu05"
315
+ }
316
+ },
317
+ {
318
+ "filename": "[VCB-Studio] Mob Psycho 100 II [NCOP_OVA][Ma10p_1080p][x265_flac]",
319
+ "errors": {
320
+ "season": {
321
+ "gold": null,
322
+ "pred": "2"
323
+ }
324
+ },
325
+ "gold": {
326
+ "group": "VCB-Studio",
327
+ "title": "Mob Psycho",
328
+ "season": null,
329
+ "episode": 100,
330
+ "resolution": "1080p",
331
+ "source": "x265-flac",
332
+ "special": "OVA"
333
+ },
334
+ "pred": {
335
+ "group": "VCB-Studio",
336
+ "title": "Mob Psycho",
337
+ "season": 2,
338
+ "episode": 100,
339
+ "resolution": "1080p",
340
+ "source": "x265-flac",
341
+ "special": "OVA"
342
  }
343
  },
344
  {
345
+ "filename": "アニメCM宣伝1",
346
  "errors": {
347
+ "group": {
348
+ "gold": null,
349
+ "pred": "ア"
350
+ },
351
+ "title": {
352
+ "gold": "アニメ",
353
+ "pred": "ニ 宣伝"
354
+ },
355
  "special": {
356
+ "gold": "cm",
357
+ "pred": "1"
358
  }
359
  },
360
  "gold": {
361
+ "group": null,
362
+ "title": "アニメ",
363
  "season": null,
364
+ "episode": null,
365
+ "resolution": null,
366
+ "source": null,
367
+ "special": "CM"
368
  },
369
  "pred": {
370
+ "group": "",
371
+ "title": " 宣伝",
372
  "season": null,
373
+ "episode": null,
374
+ "resolution": null,
375
+ "source": null,
376
+ "special": "1"
377
  }
378
  },
379
  {
380
+ "filename": "960x720 SLAM DUNK LoliHouse",
381
  "errors": {
382
+ "group": {
383
+ "gold": "lolihouse",
384
+ "pred": "ihouse"
385
+ },
386
+ "title": {
387
+ "gold": "slam dunk",
388
+ "pred": "slam dunk lol"
389
  }
390
  },
391
  "gold": {
392
+ "group": "LoliHouse",
393
+ "title": "SLAM DUNK",
394
  "season": null,
395
+ "episode": null,
396
+ "resolution": "960x720",
397
+ "source": null,
398
+ "special": null
399
  },
400
  "pred": {
401
+ "group": "iHouse",
402
+ "title": "SLAM DUNK Lol",
403
  "season": null,
404
+ "episode": null,
405
+ "resolution": "960x720",
406
+ "source": null,
407
+ "special": null
408
  }
409
+ },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
410
  {
411
+ "filename": "GM-Team [GB] 4K 逆天邪神 04",
412
  "errors": {
413
  "title": {
414
+ "gold": "逆天邪神",
415
+ "pred": "逆天邪神 04"
416
+ },
417
+ "episode": {
418
+ "gold": "4",
419
+ "pred": null
420
+ }
421
+ },
422
+ "gold": {
423
+ "group": "GM-Team",
424
+ "title": "逆天邪神",
425
+ "season": null,
426
+ "episode": 4,
427
+ "resolution": "4K",
428
+ "source": "GB",
429
+ "special": null
430
+ },
431
+ "pred": {
432
+ "group": "GM-Team",
433
+ "title": "逆天邪神 04",
434
+ "season": null,
435
+ "episode": null,
436
+ "resolution": "4K",
437
+ "source": "GB",
438
+ "special": null
439
+ }
440
+ },
441
+ {
442
+ "filename": "CM 15 - BD - CITY HUNTER TV 3rd & '91 Series",
443
+ "errors": {
444
+ "source": {
445
+ "gold": "bd",
446
+ "pred": "b"
447
+ },
448
+ "special": {
449
+ "gold": "cm 15",
450
+ "pred": "d"
451
  }
452
  },
453
  "gold": {
454
  "group": null,
455
+ "title": "CITY HUNTER TV 3rd & '91 Series",
456
  "season": null,
457
  "episode": null,
458
  "resolution": null,
459
  "source": "BD",
460
+ "special": "CM 15"
461
  },
462
  "pred": {
463
  "group": null,
464
+ "title": "CITY HUNTER TV 3rd & '91 Series",
465
  "season": null,
466
  "episode": null,
467
  "resolution": null,
468
+ "source": "B",
469
+ "special": "D"
470
  }
471
  },
472
  {
473
+ "filename": "12 - HEVC",
474
  "errors": {
475
+ "episode": {
476
+ "gold": null,
477
+ "pred": "12"
478
+ },
479
  "special": {
480
+ "gold": "12",
481
+ "pred": null
482
  }
483
  },
484
  "gold": {
485
+ "group": null,
486
+ "title": null,
487
  "season": null,
488
+ "episode": null,
489
+ "resolution": null,
490
+ "source": "HEVC",
491
+ "special": "12"
492
  },
493
  "pred": {
494
+ "group": null,
495
+ "title": null,
496
  "season": null,
497
+ "episode": 12,
498
+ "resolution": null,
499
+ "source": "HEVC",
500
+ "special": null
501
  }
502
  },
503
  {
504
+ "filename": "07][檢索:魔法姊妹露露特莉莉][CHT&JPN",
505
  "errors": {
506
  "title": {
507
+ "gold": null,
508
+ "pred": "檢索:魔法姊妹露露特莉莉"
509
+ },
510
+ "special": {
511
+ "gold": "檢索:魔法姊妹露露特莉莉",
512
+ "pred": null
513
  }
514
  },
515
  "gold": {
516
  "group": null,
517
+ "title": null,
518
  "season": null,
519
+ "episode": 7,
520
+ "resolution": null,
521
+ "source": "CHT&JPN",
522
+ "special": "檢索:魔法姊妹露露特莉莉"
523
  },
524
  "pred": {
525
  "group": null,
526
+ "title": "檢索:魔法姊妹露露特莉莉",
527
  "season": null,
528
+ "episode": 7,
529
+ "resolution": null,
530
+ "source": "CHT&JPN",
531
  "special": null
532
  }
533
  },
534
  {
535
+ "filename": "[12]_1080P_Baha_[ANi]_29 歲單身中堅冒險家的日常",
536
  "errors": {
537
+ "title": {
538
+ "gold": "29 歲單身中堅冒險家的日常",
539
+ "pred": "9 歲單身中堅冒險家的日常"
540
  }
541
  },
542
  "gold": {
543
+ "group": "ANi",
544
+ "title": "29 歲單身中堅冒險家的日常",
545
+ "season": null,
546
+ "episode": 12,
547
+ "resolution": "1080P",
548
+ "source": "Baha",
549
+ "special": null
550
+ },
551
+ "pred": {
552
+ "group": "ANi",
553
+ "title": "9 歲單身中堅冒險家的日常",
554
+ "season": null,
555
+ "episode": 12,
556
+ "resolution": "1080P",
557
+ "source": "Baha",
558
+ "special": null
559
+ }
560
+ },
561
+ {
562
+ "filename": "[CM_03] Onimonogatari SFEO-Raws",
563
+ "errors": {
564
+ "group": {
565
+ "gold": "sfeo-raws",
566
+ "pred": "feo-raws"
567
+ },
568
+ "title": {
569
+ "gold": "onimonogatari",
570
+ "pred": "onimonogatari s"
571
+ }
572
+ },
573
+ "gold": {
574
+ "group": "SFEO-Raws",
575
+ "title": "Onimonogatari",
576
  "season": null,
577
  "episode": null,
578
+ "resolution": null,
579
+ "source": null,
580
+ "special": "CM_03"
581
  },
582
  "pred": {
583
+ "group": "FEO-Raws",
584
+ "title": "Onimonogatari S",
585
  "season": null,
586
  "episode": null,
587
+ "resolution": null,
588
+ "source": null,
589
+ "special": "CM_03"
590
+ }
591
+ },
592
+ {
593
+ "filename": "16][S2][[DBD-Raws]",
594
+ "errors": {
595
+ "episode": {
596
+ "gold": null,
597
+ "pred": "16"
598
+ },
599
+ "special": {
600
+ "gold": "16",
601
+ "pred": null
602
+ }
603
+ },
604
+ "gold": {
605
+ "group": "DBD-Raws",
606
+ "title": null,
607
+ "season": 2,
608
+ "episode": null,
609
+ "resolution": null,
610
+ "source": null,
611
+ "special": "16"
612
+ },
613
+ "pred": {
614
+ "group": "DBD-Raws",
615
+ "title": null,
616
+ "season": 2,
617
+ "episode": 16,
618
+ "resolution": null,
619
+ "source": null,
620
+ "special": null
621
  }
622
  },
623
  {
624
+ "filename": "Captain.Tsubasa.Road.to.2002.Intro1.BGSubs.TVRip.XviD-TBO",
625
  "errors": {
626
+ "group": {
627
+ "gold": null,
628
+ "pred": "gsu"
629
+ },
630
  "title": {
631
+ "gold": "captain.tsubasa.road.to intro1.bgsubs",
632
+ "pred": "captain.tsubasa.road.to intro1.b b id o"
633
  }
634
  },
635
  "gold": {
636
  "group": null,
637
+ "title": "Captain.Tsubasa.Road.to Intro1.BGSubs",
638
  "season": null,
639
  "episode": null,
640
  "resolution": null,
641
+ "source": "TVRip",
642
  "special": null
643
  },
644
  "pred": {
645
+ "group": "GSu",
646
+ "title": "Captain.Tsubasa.Road.to Intro1.B b iD O",
647
  "season": null,
648
  "episode": null,
649
  "resolution": null,
650
+ "source": "TVRip",
651
  "special": null
652
  }
653
+ }
654
+ ]
655
+ },
656
+ "normalized_only": {
657
+ "constrain_bio": true,
658
+ "sample_count": 2048,
659
+ "field_accuracy": {
660
+ "group": 0.990234375,
661
+ "title": 0.978515625,
662
+ "season": 0.99755859375,
663
+ "episode": 0.9912109375,
664
+ "resolution": 1.0,
665
+ "source": 0.990234375,
666
+ "special": 0.9794921875
667
+ },
668
+ "field_correct": {
669
+ "group": 2028,
670
+ "title": 2004,
671
+ "season": 2043,
672
+ "episode": 2030,
673
+ "resolution": 2048,
674
+ "source": 2028,
675
+ "special": 2006
676
+ },
677
+ "field_total": {
678
+ "group": 2048,
679
+ "title": 2048,
680
+ "season": 2048,
681
+ "episode": 2048,
682
+ "resolution": 2048,
683
+ "source": 2048,
684
+ "special": 2048
685
+ },
686
+ "full_match_accuracy": 0.9599609375,
687
+ "full_match_correct": 1966,
688
+ "full_match_total": 2048,
689
+ "failures": [
690
  {
691
+ "filename": "01; - flac",
692
  "errors": {
693
+ "title": {
694
+ "gold": "01;",
695
  "pred": null
696
+ },
697
+ "episode": {
698
+ "gold": null,
699
+ "pred": "1"
700
  }
701
  },
702
  "gold": {
703
+ "group": null,
704
+ "title": "01;",
705
  "season": null,
706
  "episode": null,
707
  "resolution": null,
708
+ "source": "flac",
709
+ "special": null
710
  },
711
  "pred": {
712
+ "group": null,
713
+ "title": null,
714
  "season": null,
715
+ "episode": 1,
716
  "resolution": null,
717
+ "source": "flac",
718
+ "special": null
719
  }
720
  },
721
  {
722
+ "filename": "[VCB-Studio] Durarara!!×2 Shou [IV][Ma10p_1080p][x265_aac]",
723
  "errors": {
724
+ "title": {
725
+ "gold": "durarara!!×2 shou iv",
726
+ "pred": "durarara!!×2 shou"
727
+ },
728
  "special": {
729
+ "gold": null,
730
+ "pred": "iv"
731
  }
732
  },
733
  "gold": {
734
+ "group": "VCB-Studio",
735
+ "title": "Durarara!!×2 Shou IV",
736
  "season": null,
737
+ "episode": null,
738
  "resolution": "1080p",
739
+ "source": "x265-aac",
740
+ "special": null
741
  },
742
  "pred": {
743
+ "group": "VCB-Studio",
744
+ "title": "Durarara!!×2 Shou",
745
  "season": null,
746
+ "episode": null,
747
  "resolution": "1080p",
748
+ "source": "x265-aac",
749
+ "special": "IV"
750
+ }
751
+ },
752
+ {
753
+ "filename": "AC3 Chap - BD Menu16",
754
+ "errors": {
755
+ "source": {
756
+ "gold": "bd",
757
+ "pred": null
758
+ },
759
+ "special": {
760
+ "gold": "menu16",
761
+ "pred": "bd menu16"
762
+ }
763
+ },
764
+ "gold": {
765
+ "group": null,
766
+ "title": "AC3 Chap",
767
+ "season": null,
768
+ "episode": null,
769
+ "resolution": null,
770
+ "source": "BD",
771
+ "special": "Menu16"
772
+ },
773
+ "pred": {
774
+ "group": null,
775
+ "title": "AC3 Chap",
776
+ "season": null,
777
+ "episode": null,
778
+ "resolution": null,
779
+ "source": null,
780
+ "special": "BD Menu16"
781
+ }
782
+ },
783
+ {
784
+ "filename": "Puella Magi Madoka Magica - BD Menu14",
785
+ "errors": {
786
+ "source": {
787
+ "gold": "bd",
788
+ "pred": null
789
+ },
790
+ "special": {
791
+ "gold": "menu14",
792
+ "pred": "bd menu14"
793
+ }
794
+ },
795
+ "gold": {
796
+ "group": null,
797
+ "title": "Puella Magi Madoka Magica",
798
+ "season": null,
799
+ "episode": null,
800
+ "resolution": null,
801
+ "source": "BD",
802
+ "special": "Menu14"
803
+ },
804
+ "pred": {
805
+ "group": null,
806
+ "title": "Puella Magi Madoka Magica",
807
+ "season": null,
808
+ "episode": null,
809
+ "resolution": null,
810
+ "source": null,
811
+ "special": "BD Menu14"
812
+ }
813
+ },
814
+ {
815
+ "filename": "Kirion Hikaru no Go 72 [960x720]",
816
+ "errors": {
817
+ "group": {
818
+ "gold": "kirion",
819
+ "pred": null
820
+ },
821
+ "title": {
822
+ "gold": "hikaru no go",
823
+ "pred": "kirion hikaru no go 72"
824
+ },
825
+ "episode": {
826
+ "gold": "72",
827
+ "pred": null
828
+ }
829
+ },
830
+ "gold": {
831
+ "group": "Kirion",
832
+ "title": "Hikaru no Go",
833
+ "season": null,
834
+ "episode": 72,
835
+ "resolution": "960x720",
836
+ "source": null,
837
+ "special": null
838
+ },
839
+ "pred": {
840
+ "group": null,
841
+ "title": "Kirion Hikaru no Go 72",
842
+ "season": null,
843
+ "episode": null,
844
+ "resolution": "960x720",
845
+ "source": null,
846
+ "special": null
847
+ }
848
+ },
849
+ {
850
+ "filename": "葬送的芙莉莲 - 喵萌奶茶屋",
851
+ "errors": {
852
+ "group": {
853
+ "gold": "喵萌奶茶屋",
854
+ "pred": null
855
+ },
856
+ "title": {
857
+ "gold": "葬送的芙莉莲",
858
+ "pred": "葬送的芙莉莲 - 喵萌奶茶屋"
859
+ }
860
+ },
861
+ "gold": {
862
+ "group": "喵萌奶茶屋",
863
+ "title": "葬送的芙莉莲",
864
+ "season": null,
865
+ "episode": null,
866
+ "resolution": null,
867
+ "source": null,
868
+ "special": null
869
+ },
870
+ "pred": {
871
+ "group": null,
872
+ "title": "葬送的芙莉莲 - 喵萌奶茶屋",
873
+ "season": null,
874
+ "episode": null,
875
+ "resolution": null,
876
+ "source": null,
877
+ "special": null
878
+ }
879
+ },
880
+ {
881
+ "filename": "[VCB-Studio] Taimadou Gakuen 35 Shiken Shoutai [IV][Ma10p_1080p][x265_aac]",
882
+ "errors": {
883
+ "title": {
884
+ "gold": "taimadou gakuen 35 shiken shoutai iv",
885
+ "pred": "taimadou gakuen 35 shiken shoutai"
886
+ },
887
+ "special": {
888
+ "gold": null,
889
+ "pred": "iv"
890
+ }
891
+ },
892
+ "gold": {
893
+ "group": "VCB-Studio",
894
+ "title": "Taimadou Gakuen 35 Shiken Shoutai IV",
895
+ "season": null,
896
+ "episode": null,
897
+ "resolution": "1080p",
898
+ "source": "x265-aac",
899
+ "special": null
900
+ },
901
+ "pred": {
902
+ "group": "VCB-Studio",
903
+ "title": "Taimadou Gakuen 35 Shiken Shoutai",
904
+ "season": null,
905
+ "episode": null,
906
+ "resolution": "1080p",
907
+ "source": "x265-aac",
908
+ "special": "IV"
909
+ }
910
+ },
911
+ {
912
+ "filename": "Dr.Slump.Arale-chan.097 - BD Menu14",
913
+ "errors": {
914
+ "source": {
915
+ "gold": "bd",
916
+ "pred": null
917
+ },
918
+ "special": {
919
+ "gold": "menu14",
920
+ "pred": "bd menu14"
921
+ }
922
+ },
923
+ "gold": {
924
+ "group": null,
925
+ "title": "Dr.Slump.Arale-chan.097",
926
+ "season": null,
927
+ "episode": null,
928
+ "resolution": null,
929
+ "source": "BD",
930
+ "special": "Menu14"
931
+ },
932
+ "pred": {
933
+ "group": null,
934
+ "title": "Dr.Slump.Arale-chan.097",
935
+ "season": null,
936
+ "episode": null,
937
+ "resolution": null,
938
+ "source": null,
939
+ "special": "BD Menu14"
940
+ }
941
+ },
942
+ {
943
+ "filename": "Shiroi Suna no Aquatope - BD Menu05",
944
+ "errors": {
945
+ "source": {
946
+ "gold": "bd",
947
+ "pred": null
948
+ },
949
+ "special": {
950
+ "gold": "menu05",
951
+ "pred": "bd menu05"
952
+ }
953
+ },
954
+ "gold": {
955
+ "group": null,
956
+ "title": "Shiroi Suna no Aquatope",
957
+ "season": null,
958
+ "episode": null,
959
+ "resolution": null,
960
+ "source": "BD",
961
+ "special": "Menu05"
962
+ },
963
+ "pred": {
964
+ "group": null,
965
+ "title": "Shiroi Suna no Aquatope",
966
+ "season": null,
967
+ "episode": null,
968
+ "resolution": null,
969
+ "source": null,
970
+ "special": "BD Menu05"
971
+ }
972
+ },
973
+ {
974
+ "filename": "[VCB-Studio] Mob Psycho 100 II [NCOP_OVA][Ma10p_1080p][x265_flac]",
975
+ "errors": {
976
+ "season": {
977
+ "gold": null,
978
+ "pred": "2"
979
+ }
980
+ },
981
+ "gold": {
982
+ "group": "VCB-Studio",
983
+ "title": "Mob Psycho",
984
+ "season": null,
985
+ "episode": 100,
986
+ "resolution": "1080p",
987
+ "source": "x265-flac",
988
+ "special": "OVA"
989
+ },
990
+ "pred": {
991
+ "group": "VCB-Studio",
992
+ "title": "Mob Psycho",
993
+ "season": 2,
994
+ "episode": 100,
995
+ "resolution": "1080p",
996
+ "source": "x265-flac",
997
+ "special": "OVA"
998
+ }
999
+ },
1000
+ {
1001
+ "filename": "アニメCM宣伝1",
1002
+ "errors": {
1003
+ "title": {
1004
+ "gold": "アニメ",
1005
+ "pred": "アニメcm宣伝1"
1006
+ },
1007
+ "special": {
1008
+ "gold": "cm",
1009
+ "pred": null
1010
+ }
1011
+ },
1012
+ "gold": {
1013
+ "group": null,
1014
+ "title": "アニメ",
1015
+ "season": null,
1016
+ "episode": null,
1017
+ "resolution": null,
1018
+ "source": null,
1019
+ "special": "CM"
1020
+ },
1021
+ "pred": {
1022
+ "group": null,
1023
+ "title": "アニメCM宣伝1",
1024
+ "season": null,
1025
+ "episode": null,
1026
+ "resolution": null,
1027
+ "source": null,
1028
+ "special": null
1029
+ }
1030
+ },
1031
+ {
1032
+ "filename": "GM-Team [GB] 4K 逆天邪神 04",
1033
+ "errors": {
1034
+ "title": {
1035
+ "gold": "逆天邪神",
1036
+ "pred": "逆天邪神 04"
1037
+ },
1038
+ "episode": {
1039
+ "gold": "4",
1040
+ "pred": null
1041
+ }
1042
+ },
1043
+ "gold": {
1044
+ "group": "GM-Team",
1045
+ "title": "逆天邪神",
1046
+ "season": null,
1047
+ "episode": 4,
1048
+ "resolution": "4K",
1049
+ "source": "GB",
1050
+ "special": null
1051
+ },
1052
+ "pred": {
1053
+ "group": "GM-Team",
1054
+ "title": "逆天邪神 04",
1055
+ "season": null,
1056
+ "episode": null,
1057
+ "resolution": "4K",
1058
+ "source": "GB",
1059
+ "special": null
1060
+ }
1061
+ },
1062
+ {
1063
+ "filename": "CM 15 - BD - CITY HUNTER TV 3rd & '91 Series",
1064
+ "errors": {
1065
+ "source": {
1066
+ "gold": "bd",
1067
+ "pred": null
1068
+ },
1069
+ "special": {
1070
+ "gold": "cm 15",
1071
+ "pred": "bd"
1072
+ }
1073
+ },
1074
+ "gold": {
1075
+ "group": null,
1076
+ "title": "CITY HUNTER TV 3rd & '91 Series",
1077
+ "season": null,
1078
+ "episode": null,
1079
+ "resolution": null,
1080
+ "source": "BD",
1081
+ "special": "CM 15"
1082
+ },
1083
+ "pred": {
1084
+ "group": null,
1085
+ "title": "CITY HUNTER TV 3rd & '91 Series",
1086
+ "season": null,
1087
+ "episode": null,
1088
+ "resolution": null,
1089
+ "source": null,
1090
+ "special": "BD"
1091
+ }
1092
+ },
1093
+ {
1094
+ "filename": "12 - HEVC",
1095
+ "errors": {
1096
+ "episode": {
1097
+ "gold": null,
1098
+ "pred": "12"
1099
+ },
1100
+ "special": {
1101
+ "gold": "12",
1102
+ "pred": null
1103
+ }
1104
+ },
1105
+ "gold": {
1106
+ "group": null,
1107
+ "title": null,
1108
+ "season": null,
1109
+ "episode": null,
1110
+ "resolution": null,
1111
+ "source": "HEVC",
1112
+ "special": "12"
1113
+ },
1114
+ "pred": {
1115
+ "group": null,
1116
+ "title": null,
1117
+ "season": null,
1118
+ "episode": 12,
1119
+ "resolution": null,
1120
+ "source": "HEVC",
1121
+ "special": null
1122
+ }
1123
+ },
1124
+ {
1125
+ "filename": "07][檢索:魔法姊妹露露特莉莉][CHT&JPN",
1126
+ "errors": {
1127
+ "title": {
1128
+ "gold": null,
1129
+ "pred": "檢索:魔法姊妹露露特莉莉"
1130
+ },
1131
+ "special": {
1132
+ "gold": "檢索:魔法姊妹露露特莉莉",
1133
+ "pred": null
1134
+ }
1135
+ },
1136
+ "gold": {
1137
+ "group": null,
1138
+ "title": null,
1139
+ "season": null,
1140
+ "episode": 7,
1141
+ "resolution": null,
1142
+ "source": "CHT&JPN",
1143
+ "special": "檢索:魔法姊妹露露特莉莉"
1144
+ },
1145
+ "pred": {
1146
+ "group": null,
1147
+ "title": "檢索:魔法姊妹露露特莉莉",
1148
+ "season": null,
1149
+ "episode": 7,
1150
+ "resolution": null,
1151
+ "source": "CHT&JPN",
1152
+ "special": null
1153
+ }
1154
+ },
1155
+ {
1156
+ "filename": "[12]_1080P_Baha_[ANi]_29 歲單身中堅冒險家的日常",
1157
+ "errors": {
1158
+ "title": {
1159
+ "gold": "29 歲單身中堅冒險家的日常",
1160
+ "pred": "歲單身中堅冒險家的日常"
1161
+ }
1162
+ },
1163
+ "gold": {
1164
+ "group": "ANi",
1165
+ "title": "29 歲單身中堅冒險家的日常",
1166
+ "season": null,
1167
+ "episode": 12,
1168
+ "resolution": "1080P",
1169
+ "source": "Baha",
1170
+ "special": null
1171
+ },
1172
+ "pred": {
1173
+ "group": "ANi",
1174
+ "title": "歲單身中堅冒險家的日常",
1175
+ "season": null,
1176
+ "episode": 12,
1177
+ "resolution": "1080P",
1178
+ "source": "Baha",
1179
+ "special": null
1180
+ }
1181
+ },
1182
+ {
1183
+ "filename": "16][S2][[DBD-Raws]",
1184
+ "errors": {
1185
+ "episode": {
1186
+ "gold": null,
1187
+ "pred": "16"
1188
+ },
1189
+ "special": {
1190
+ "gold": "16",
1191
+ "pred": null
1192
+ }
1193
+ },
1194
+ "gold": {
1195
+ "group": "DBD-Raws",
1196
+ "title": null,
1197
+ "season": 2,
1198
+ "episode": null,
1199
+ "resolution": null,
1200
+ "source": null,
1201
+ "special": "16"
1202
+ },
1203
+ "pred": {
1204
+ "group": "DBD-Raws",
1205
+ "title": null,
1206
+ "season": 2,
1207
+ "episode": 16,
1208
+ "resolution": null,
1209
+ "source": null,
1210
+ "special": null
1211
+ }
1212
+ },
1213
+ {
1214
+ "filename": "Captain.Tsubasa.Road.to.2002.Intro1.BGSubs.TVRip.XviD-TBO",
1215
+ "errors": {
1216
+ "group": {
1217
+ "gold": null,
1218
+ "pred": "bgsubs"
1219
+ },
1220
+ "title": {
1221
+ "gold": "captain.tsubasa.road.to intro1.bgsubs",
1222
+ "pred": "captain.tsubasa.road.to intro1"
1223
+ }
1224
+ },
1225
+ "gold": {
1226
+ "group": null,
1227
+ "title": "Captain.Tsubasa.Road.to Intro1.BGSubs",
1228
+ "season": null,
1229
+ "episode": null,
1230
+ "resolution": null,
1231
+ "source": "TVRip",
1232
+ "special": null
1233
+ },
1234
+ "pred": {
1235
+ "group": "BGSubs",
1236
+ "title": "Captain.Tsubasa.Road.to Intro1",
1237
+ "season": null,
1238
+ "episode": null,
1239
+ "resolution": null,
1240
+ "source": "TVRip",
1241
+ "special": null
1242
+ }
1243
+ },
1244
+ {
1245
+ "filename": "HNK 006 ITA audio + jap audio + sub ita",
1246
+ "errors": {
1247
+ "title": {
1248
+ "gold": "hnk 006 ita audio + audio + sub ita",
1249
+ "pred": "hnk 006 ita audio + jap audio + sub ita"
1250
+ }
1251
+ },
1252
+ "gold": {
1253
+ "group": null,
1254
+ "title": "HNK 006 ITA audio + audio + sub ita",
1255
+ "season": null,
1256
+ "episode": null,
1257
+ "resolution": null,
1258
+ "source": null,
1259
+ "special": null
1260
+ },
1261
+ "pred": {
1262
+ "group": null,
1263
+ "title": "HNK 006 ITA audio + jap audio + sub ita",
1264
+ "season": null,
1265
+ "episode": null,
1266
+ "resolution": null,
1267
+ "source": null,
1268
+ "special": null
1269
+ }
1270
+ },
1271
+ {
1272
+ "filename": "Babylon][subbers][10][WebRip",
1273
+ "errors": {
1274
+ "group": {
1275
+ "gold": "subbers",
1276
+ "pred": "babylon"
1277
+ },
1278
+ "title": {
1279
+ "gold": "babylon",
1280
+ "pred": "subbers"
1281
+ }
1282
+ },
1283
+ "gold": {
1284
+ "group": "subbers",
1285
+ "title": "Babylon",
1286
+ "season": null,
1287
+ "episode": 10,
1288
+ "resolution": null,
1289
+ "source": "WebRip",
1290
+ "special": null
1291
+ },
1292
+ "pred": {
1293
+ "group": "Babylon",
1294
+ "title": "subbers",
1295
+ "season": null,
1296
+ "episode": 10,
1297
+ "resolution": null,
1298
+ "source": "WebRip",
1299
+ "special": null
1300
  }
1301
  }
1302
  ]
1303
  }
1304
  }
1305
+ }
reports/perf_metrics.json ADDED
@@ -0,0 +1,2070 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sample_count": 6,
3
+ "samples": [
4
+ {
5
+ "step": 50.0,
6
+ "elapsed_seconds": 11.341162500000792,
7
+ "window_seconds": 11.341162500000792,
8
+ "steps_per_second": 4.408719123810854,
9
+ "samples_per_second": 7900.4246698690495,
10
+ "tokens_per_second": 1011254.3577432383,
11
+ "process_rss_mb": 3596.62890625,
12
+ "cuda_allocated_mb": 122.5029296875,
13
+ "cuda_reserved_mb": 12124.0,
14
+ "cuda_max_allocated_mb": 11120.271484375,
15
+ "cuda_max_reserved_mb": 12124.0,
16
+ "gpu_util_percent": 65.0,
17
+ "gpu_memory_util_percent": 49.0,
18
+ "gpu_memory_used_mb": 13350.20703125,
19
+ "gpu_memory_total_mb": 16303.0,
20
+ "gpu_temperature_c": 57.0,
21
+ "gpu_power_w": 214.297
22
+ },
23
+ {
24
+ "step": 100.0,
25
+ "elapsed_seconds": 22.133552699990105,
26
+ "window_seconds": 10.792390199989313,
27
+ "steps_per_second": 4.632894018236064,
28
+ "samples_per_second": 8302.146080679026,
29
+ "tokens_per_second": 1062674.6983269153,
30
+ "process_rss_mb": 3596.62890625,
31
+ "cuda_allocated_mb": 122.5029296875,
32
+ "cuda_reserved_mb": 12124.0,
33
+ "cuda_max_allocated_mb": 11120.271484375,
34
+ "cuda_max_reserved_mb": 12124.0,
35
+ "gpu_util_percent": 65.0,
36
+ "gpu_memory_util_percent": 48.0,
37
+ "gpu_memory_used_mb": 13350.20703125,
38
+ "gpu_memory_total_mb": 16303.0,
39
+ "gpu_temperature_c": 60.0,
40
+ "gpu_power_w": 216.032
41
+ },
42
+ {
43
+ "step": 150.0,
44
+ "elapsed_seconds": 32.92555089999223,
45
+ "window_seconds": 10.791998200002126,
46
+ "steps_per_second": 4.633062299805624,
47
+ "samples_per_second": 8302.447641251678,
48
+ "tokens_per_second": 1062713.2980802148,
49
+ "process_rss_mb": 3612.890625,
50
+ "cuda_allocated_mb": 122.5029296875,
51
+ "cuda_reserved_mb": 12124.0,
52
+ "cuda_max_allocated_mb": 11120.271484375,
53
+ "cuda_max_reserved_mb": 12124.0,
54
+ "gpu_util_percent": 100.0,
55
+ "gpu_memory_util_percent": 77.0,
56
+ "gpu_memory_used_mb": 13350.20703125,
57
+ "gpu_memory_total_mb": 16303.0,
58
+ "gpu_temperature_c": 68.0,
59
+ "gpu_power_w": 224.4
60
+ },
61
+ {
62
+ "step": 200.0,
63
+ "elapsed_seconds": 43.340594499983126,
64
+ "window_seconds": 10.415043599990895,
65
+ "steps_per_second": 4.800748025677368,
66
+ "samples_per_second": 8602.940462013845,
67
+ "tokens_per_second": 1101176.3791377721,
68
+ "process_rss_mb": 3651.80078125,
69
+ "cuda_allocated_mb": 122.5029296875,
70
+ "cuda_reserved_mb": 12124.0,
71
+ "cuda_max_allocated_mb": 11120.271484375,
72
+ "cuda_max_reserved_mb": 12124.0,
73
+ "gpu_util_percent": 64.0,
74
+ "gpu_memory_util_percent": 48.0,
75
+ "gpu_memory_used_mb": 13350.20703125,
76
+ "gpu_memory_total_mb": 16303.0,
77
+ "gpu_temperature_c": 64.0,
78
+ "gpu_power_w": 219.672
79
+ },
80
+ {
81
+ "step": 250.0,
82
+ "elapsed_seconds": 53.830062900000485,
83
+ "window_seconds": 10.489468400017358,
84
+ "steps_per_second": 4.766685793144413,
85
+ "samples_per_second": 8541.900941314789,
86
+ "tokens_per_second": 1093363.320488293,
87
+ "process_rss_mb": 3651.80078125,
88
+ "cuda_allocated_mb": 122.5029296875,
89
+ "cuda_reserved_mb": 12124.0,
90
+ "cuda_max_allocated_mb": 11120.271484375,
91
+ "cuda_max_reserved_mb": 12124.0,
92
+ "gpu_util_percent": 63.0,
93
+ "gpu_memory_util_percent": 49.0,
94
+ "gpu_memory_used_mb": 13350.20703125,
95
+ "gpu_memory_total_mb": 16303.0,
96
+ "gpu_temperature_c": 66.0,
97
+ "gpu_power_w": 221.349
98
+ },
99
+ {
100
+ "step": 300.0,
101
+ "elapsed_seconds": 64.34275290000369,
102
+ "window_seconds": 10.512690000003204,
103
+ "steps_per_second": 4.756156606918378,
104
+ "samples_per_second": 8523.032639597734,
105
+ "tokens_per_second": 1090948.17786851,
106
+ "process_rss_mb": 3651.80078125,
107
+ "cuda_allocated_mb": 122.5029296875,
108
+ "cuda_reserved_mb": 12124.0,
109
+ "cuda_max_allocated_mb": 11120.271484375,
110
+ "cuda_max_reserved_mb": 12124.0,
111
+ "gpu_util_percent": 66.0,
112
+ "gpu_memory_util_percent": 50.0,
113
+ "gpu_memory_used_mb": 13350.20703125,
114
+ "gpu_memory_total_mb": 16303.0,
115
+ "gpu_temperature_c": 66.0,
116
+ "gpu_power_w": 224.853
117
+ }
118
+ ],
119
+ "background_sample_count": 135,
120
+ "background_samples": [
121
+ {
122
+ "process_rss_mb": 3310.83203125,
123
+ "cuda_allocated_mb": 10644.87158203125,
124
+ "cuda_reserved_mb": 11200.0,
125
+ "cuda_max_allocated_mb": 11051.73876953125,
126
+ "cuda_max_reserved_mb": 11200.0,
127
+ "gpu_util_percent": 92.0,
128
+ "gpu_memory_util_percent": 49.0,
129
+ "gpu_memory_used_mb": 12360.20703125,
130
+ "gpu_memory_total_mb": 16303.0,
131
+ "gpu_temperature_c": 52.0,
132
+ "gpu_power_w": 57.852,
133
+ "elapsed_seconds": 0.5343180999916513
134
+ },
135
+ {
136
+ "process_rss_mb": 3596.44921875,
137
+ "cuda_allocated_mb": 126.2216796875,
138
+ "cuda_reserved_mb": 12124.0,
139
+ "cuda_max_allocated_mb": 11120.271484375,
140
+ "cuda_max_reserved_mb": 12124.0,
141
+ "gpu_util_percent": 100.0,
142
+ "gpu_memory_util_percent": 76.0,
143
+ "gpu_memory_used_mb": 13350.20703125,
144
+ "gpu_memory_total_mb": 16303.0,
145
+ "gpu_temperature_c": 57.0,
146
+ "gpu_power_w": 103.938,
147
+ "elapsed_seconds": 1.0462713000015356
148
+ },
149
+ {
150
+ "process_rss_mb": 3596.62890625,
151
+ "cuda_allocated_mb": 141.64453125,
152
+ "cuda_reserved_mb": 12124.0,
153
+ "cuda_max_allocated_mb": 11120.271484375,
154
+ "cuda_max_reserved_mb": 12124.0,
155
+ "gpu_util_percent": 65.0,
156
+ "gpu_memory_util_percent": 49.0,
157
+ "gpu_memory_used_mb": 13350.20703125,
158
+ "gpu_memory_total_mb": 16303.0,
159
+ "gpu_temperature_c": 52.0,
160
+ "gpu_power_w": 176.565,
161
+ "elapsed_seconds": 1.5571539000084158
162
+ },
163
+ {
164
+ "process_rss_mb": 3596.62890625,
165
+ "cuda_allocated_mb": 126.2216796875,
166
+ "cuda_reserved_mb": 12124.0,
167
+ "cuda_max_allocated_mb": 11120.271484375,
168
+ "cuda_max_reserved_mb": 12124.0,
169
+ "gpu_util_percent": 100.0,
170
+ "gpu_memory_util_percent": 74.0,
171
+ "gpu_memory_used_mb": 13350.20703125,
172
+ "gpu_memory_total_mb": 16303.0,
173
+ "gpu_temperature_c": 58.0,
174
+ "gpu_power_w": 213.648,
175
+ "elapsed_seconds": 2.068373599991901
176
+ },
177
+ {
178
+ "process_rss_mb": 3596.62890625,
179
+ "cuda_allocated_mb": 141.64453125,
180
+ "cuda_reserved_mb": 12124.0,
181
+ "cuda_max_allocated_mb": 11120.271484375,
182
+ "cuda_max_reserved_mb": 12124.0,
183
+ "gpu_util_percent": 66.0,
184
+ "gpu_memory_util_percent": 52.0,
185
+ "gpu_memory_used_mb": 13350.20703125,
186
+ "gpu_memory_total_mb": 16303.0,
187
+ "gpu_temperature_c": 56.0,
188
+ "gpu_power_w": 215.538,
189
+ "elapsed_seconds": 2.5774495000077877
190
+ },
191
+ {
192
+ "process_rss_mb": 3596.62890625,
193
+ "cuda_allocated_mb": 126.2216796875,
194
+ "cuda_reserved_mb": 12124.0,
195
+ "cuda_max_allocated_mb": 11120.271484375,
196
+ "cuda_max_reserved_mb": 12124.0,
197
+ "gpu_util_percent": 90.0,
198
+ "gpu_memory_util_percent": 67.0,
199
+ "gpu_memory_used_mb": 13350.20703125,
200
+ "gpu_memory_total_mb": 16303.0,
201
+ "gpu_temperature_c": 60.0,
202
+ "gpu_power_w": 218.962,
203
+ "elapsed_seconds": 3.090203700005077
204
+ },
205
+ {
206
+ "process_rss_mb": 3596.62890625,
207
+ "cuda_allocated_mb": 141.64453125,
208
+ "cuda_reserved_mb": 12124.0,
209
+ "cuda_max_allocated_mb": 11120.271484375,
210
+ "cuda_max_reserved_mb": 12124.0,
211
+ "gpu_util_percent": 90.0,
212
+ "gpu_memory_util_percent": 71.0,
213
+ "gpu_memory_used_mb": 13350.20703125,
214
+ "gpu_memory_total_mb": 16303.0,
215
+ "gpu_temperature_c": 60.0,
216
+ "gpu_power_w": 216.43,
217
+ "elapsed_seconds": 3.596891900000628
218
+ },
219
+ {
220
+ "process_rss_mb": 3596.62890625,
221
+ "cuda_allocated_mb": 126.2216796875,
222
+ "cuda_reserved_mb": 12124.0,
223
+ "cuda_max_allocated_mb": 11120.271484375,
224
+ "cuda_max_reserved_mb": 12124.0,
225
+ "gpu_util_percent": 66.0,
226
+ "gpu_memory_util_percent": 47.0,
227
+ "gpu_memory_used_mb": 13350.20703125,
228
+ "gpu_memory_total_mb": 16303.0,
229
+ "gpu_temperature_c": 60.0,
230
+ "gpu_power_w": 214.673,
231
+ "elapsed_seconds": 4.114909399999306
232
+ },
233
+ {
234
+ "process_rss_mb": 3596.62890625,
235
+ "cuda_allocated_mb": 141.64453125,
236
+ "cuda_reserved_mb": 12124.0,
237
+ "cuda_max_allocated_mb": 11120.271484375,
238
+ "cuda_max_reserved_mb": 12124.0,
239
+ "gpu_util_percent": 0.0,
240
+ "gpu_memory_util_percent": 2.0,
241
+ "gpu_memory_used_mb": 13350.20703125,
242
+ "gpu_memory_total_mb": 16303.0,
243
+ "gpu_temperature_c": 51.0,
244
+ "gpu_power_w": 187.155,
245
+ "elapsed_seconds": 4.619414599990705
246
+ },
247
+ {
248
+ "process_rss_mb": 3596.62890625,
249
+ "cuda_allocated_mb": 141.64453125,
250
+ "cuda_reserved_mb": 12124.0,
251
+ "cuda_max_allocated_mb": 11120.271484375,
252
+ "cuda_max_reserved_mb": 12124.0,
253
+ "gpu_util_percent": 65.0,
254
+ "gpu_memory_util_percent": 51.0,
255
+ "gpu_memory_used_mb": 13350.20703125,
256
+ "gpu_memory_total_mb": 16303.0,
257
+ "gpu_temperature_c": 56.0,
258
+ "gpu_power_w": 175.609,
259
+ "elapsed_seconds": 5.127158199989935
260
+ },
261
+ {
262
+ "process_rss_mb": 3596.62890625,
263
+ "cuda_allocated_mb": 141.64453125,
264
+ "cuda_reserved_mb": 12124.0,
265
+ "cuda_max_allocated_mb": 11120.271484375,
266
+ "cuda_max_reserved_mb": 12124.0,
267
+ "gpu_util_percent": 92.0,
268
+ "gpu_memory_util_percent": 69.0,
269
+ "gpu_memory_used_mb": 13350.20703125,
270
+ "gpu_memory_total_mb": 16303.0,
271
+ "gpu_temperature_c": 61.0,
272
+ "gpu_power_w": 191.053,
273
+ "elapsed_seconds": 5.6363462999870535
274
+ },
275
+ {
276
+ "process_rss_mb": 3596.62890625,
277
+ "cuda_allocated_mb": 141.64453125,
278
+ "cuda_reserved_mb": 12124.0,
279
+ "cuda_max_allocated_mb": 11120.271484375,
280
+ "cuda_max_reserved_mb": 12124.0,
281
+ "gpu_util_percent": 84.0,
282
+ "gpu_memory_util_percent": 65.0,
283
+ "gpu_memory_used_mb": 13350.20703125,
284
+ "gpu_memory_total_mb": 16303.0,
285
+ "gpu_temperature_c": 62.0,
286
+ "gpu_power_w": 220.276,
287
+ "elapsed_seconds": 6.146641400002409
288
+ },
289
+ {
290
+ "process_rss_mb": 3596.62890625,
291
+ "cuda_allocated_mb": 141.64453125,
292
+ "cuda_reserved_mb": 12124.0,
293
+ "cuda_max_allocated_mb": 11120.271484375,
294
+ "cuda_max_reserved_mb": 12124.0,
295
+ "gpu_util_percent": 70.0,
296
+ "gpu_memory_util_percent": 52.0,
297
+ "gpu_memory_used_mb": 13350.20703125,
298
+ "gpu_memory_total_mb": 16303.0,
299
+ "gpu_temperature_c": 62.0,
300
+ "gpu_power_w": 216.665,
301
+ "elapsed_seconds": 6.656054299994139
302
+ },
303
+ {
304
+ "process_rss_mb": 3596.62890625,
305
+ "cuda_allocated_mb": 141.64453125,
306
+ "cuda_reserved_mb": 12124.0,
307
+ "cuda_max_allocated_mb": 11120.271484375,
308
+ "cuda_max_reserved_mb": 12124.0,
309
+ "gpu_util_percent": 100.0,
310
+ "gpu_memory_util_percent": 77.0,
311
+ "gpu_memory_used_mb": 13350.20703125,
312
+ "gpu_memory_total_mb": 16303.0,
313
+ "gpu_temperature_c": 61.0,
314
+ "gpu_power_w": 219.437,
315
+ "elapsed_seconds": 7.16469489998417
316
+ },
317
+ {
318
+ "process_rss_mb": 3596.62890625,
319
+ "cuda_allocated_mb": 141.64453125,
320
+ "cuda_reserved_mb": 12124.0,
321
+ "cuda_max_allocated_mb": 11120.271484375,
322
+ "cuda_max_reserved_mb": 12124.0,
323
+ "gpu_util_percent": 66.0,
324
+ "gpu_memory_util_percent": 48.0,
325
+ "gpu_memory_used_mb": 13350.20703125,
326
+ "gpu_memory_total_mb": 16303.0,
327
+ "gpu_temperature_c": 61.0,
328
+ "gpu_power_w": 216.638,
329
+ "elapsed_seconds": 7.6759840000013355
330
+ },
331
+ {
332
+ "process_rss_mb": 3596.62890625,
333
+ "cuda_allocated_mb": 141.64453125,
334
+ "cuda_reserved_mb": 12124.0,
335
+ "cuda_max_allocated_mb": 11120.271484375,
336
+ "cuda_max_reserved_mb": 12124.0,
337
+ "gpu_util_percent": 100.0,
338
+ "gpu_memory_util_percent": 77.0,
339
+ "gpu_memory_used_mb": 13350.20703125,
340
+ "gpu_memory_total_mb": 16303.0,
341
+ "gpu_temperature_c": 62.0,
342
+ "gpu_power_w": 216.693,
343
+ "elapsed_seconds": 8.185786499991082
344
+ },
345
+ {
346
+ "process_rss_mb": 3596.62890625,
347
+ "cuda_allocated_mb": 141.64453125,
348
+ "cuda_reserved_mb": 12124.0,
349
+ "cuda_max_allocated_mb": 11120.271484375,
350
+ "cuda_max_reserved_mb": 12124.0,
351
+ "gpu_util_percent": 66.0,
352
+ "gpu_memory_util_percent": 50.0,
353
+ "gpu_memory_used_mb": 13350.20703125,
354
+ "gpu_memory_total_mb": 16303.0,
355
+ "gpu_temperature_c": 56.0,
356
+ "gpu_power_w": 216.372,
357
+ "elapsed_seconds": 8.695240300003206
358
+ },
359
+ {
360
+ "process_rss_mb": 3596.62890625,
361
+ "cuda_allocated_mb": 141.64453125,
362
+ "cuda_reserved_mb": 12124.0,
363
+ "cuda_max_allocated_mb": 11120.271484375,
364
+ "cuda_max_reserved_mb": 12124.0,
365
+ "gpu_util_percent": 1.0,
366
+ "gpu_memory_util_percent": 2.0,
367
+ "gpu_memory_used_mb": 13350.20703125,
368
+ "gpu_memory_total_mb": 16303.0,
369
+ "gpu_temperature_c": 53.0,
370
+ "gpu_power_w": 199.724,
371
+ "elapsed_seconds": 9.203403499996057
372
+ },
373
+ {
374
+ "process_rss_mb": 3596.62890625,
375
+ "cuda_allocated_mb": 126.2216796875,
376
+ "cuda_reserved_mb": 12124.0,
377
+ "cuda_max_allocated_mb": 11120.271484375,
378
+ "cuda_max_reserved_mb": 12124.0,
379
+ "gpu_util_percent": 100.0,
380
+ "gpu_memory_util_percent": 77.0,
381
+ "gpu_memory_used_mb": 13350.20703125,
382
+ "gpu_memory_total_mb": 16303.0,
383
+ "gpu_temperature_c": 63.0,
384
+ "gpu_power_w": 181.048,
385
+ "elapsed_seconds": 9.724752899986925
386
+ },
387
+ {
388
+ "process_rss_mb": 3596.62890625,
389
+ "cuda_allocated_mb": 141.64453125,
390
+ "cuda_reserved_mb": 12124.0,
391
+ "cuda_max_allocated_mb": 11120.271484375,
392
+ "cuda_max_reserved_mb": 12124.0,
393
+ "gpu_util_percent": 67.0,
394
+ "gpu_memory_util_percent": 49.0,
395
+ "gpu_memory_used_mb": 13350.20703125,
396
+ "gpu_memory_total_mb": 16303.0,
397
+ "gpu_temperature_c": 61.0,
398
+ "gpu_power_w": 196.523,
399
+ "elapsed_seconds": 10.2389542000019
400
+ },
401
+ {
402
+ "process_rss_mb": 3596.62890625,
403
+ "cuda_allocated_mb": 126.2216796875,
404
+ "cuda_reserved_mb": 12124.0,
405
+ "cuda_max_allocated_mb": 11120.271484375,
406
+ "cuda_max_reserved_mb": 12124.0,
407
+ "gpu_util_percent": 100.0,
408
+ "gpu_memory_util_percent": 77.0,
409
+ "gpu_memory_used_mb": 13350.20703125,
410
+ "gpu_memory_total_mb": 16303.0,
411
+ "gpu_temperature_c": 63.0,
412
+ "gpu_power_w": 220.472,
413
+ "elapsed_seconds": 10.747453499992844
414
+ },
415
+ {
416
+ "process_rss_mb": 3596.62890625,
417
+ "cuda_allocated_mb": 141.64453125,
418
+ "cuda_reserved_mb": 12124.0,
419
+ "cuda_max_allocated_mb": 11120.271484375,
420
+ "cuda_max_reserved_mb": 12124.0,
421
+ "gpu_util_percent": 65.0,
422
+ "gpu_memory_util_percent": 49.0,
423
+ "gpu_memory_used_mb": 13350.20703125,
424
+ "gpu_memory_total_mb": 16303.0,
425
+ "gpu_temperature_c": 57.0,
426
+ "gpu_power_w": 214.297,
427
+ "elapsed_seconds": 11.256059200008167
428
+ },
429
+ {
430
+ "process_rss_mb": 3596.62890625,
431
+ "cuda_allocated_mb": 126.2216796875,
432
+ "cuda_reserved_mb": 12124.0,
433
+ "cuda_max_allocated_mb": 11120.271484375,
434
+ "cuda_max_reserved_mb": 12124.0,
435
+ "gpu_util_percent": 100.0,
436
+ "gpu_memory_util_percent": 75.0,
437
+ "gpu_memory_used_mb": 13350.20703125,
438
+ "gpu_memory_total_mb": 16303.0,
439
+ "gpu_temperature_c": 63.0,
440
+ "gpu_power_w": 220.449,
441
+ "elapsed_seconds": 11.772158899984788
442
+ },
443
+ {
444
+ "process_rss_mb": 3596.62890625,
445
+ "cuda_allocated_mb": 141.64453125,
446
+ "cuda_reserved_mb": 12124.0,
447
+ "cuda_max_allocated_mb": 11120.271484375,
448
+ "cuda_max_reserved_mb": 12124.0,
449
+ "gpu_util_percent": 67.0,
450
+ "gpu_memory_util_percent": 52.0,
451
+ "gpu_memory_used_mb": 13350.20703125,
452
+ "gpu_memory_total_mb": 16303.0,
453
+ "gpu_temperature_c": 60.0,
454
+ "gpu_power_w": 215.206,
455
+ "elapsed_seconds": 12.287043399992399
456
+ },
457
+ {
458
+ "process_rss_mb": 3596.62890625,
459
+ "cuda_allocated_mb": 126.2216796875,
460
+ "cuda_reserved_mb": 12124.0,
461
+ "cuda_max_allocated_mb": 11120.271484375,
462
+ "cuda_max_reserved_mb": 12124.0,
463
+ "gpu_util_percent": 87.0,
464
+ "gpu_memory_util_percent": 65.0,
465
+ "gpu_memory_used_mb": 13350.20703125,
466
+ "gpu_memory_total_mb": 16303.0,
467
+ "gpu_temperature_c": 63.0,
468
+ "gpu_power_w": 218.221,
469
+ "elapsed_seconds": 12.796272500010673
470
+ },
471
+ {
472
+ "process_rss_mb": 3596.62890625,
473
+ "cuda_allocated_mb": 141.64453125,
474
+ "cuda_reserved_mb": 12124.0,
475
+ "cuda_max_allocated_mb": 11120.271484375,
476
+ "cuda_max_reserved_mb": 12124.0,
477
+ "gpu_util_percent": 91.0,
478
+ "gpu_memory_util_percent": 71.0,
479
+ "gpu_memory_used_mb": 13350.20703125,
480
+ "gpu_memory_total_mb": 16303.0,
481
+ "gpu_temperature_c": 63.0,
482
+ "gpu_power_w": 222.484,
483
+ "elapsed_seconds": 13.301871300005587
484
+ },
485
+ {
486
+ "process_rss_mb": 3596.62890625,
487
+ "cuda_allocated_mb": 126.2216796875,
488
+ "cuda_reserved_mb": 12124.0,
489
+ "cuda_max_allocated_mb": 11120.271484375,
490
+ "cuda_max_reserved_mb": 12124.0,
491
+ "gpu_util_percent": 67.0,
492
+ "gpu_memory_util_percent": 49.0,
493
+ "gpu_memory_used_mb": 13350.20703125,
494
+ "gpu_memory_total_mb": 16303.0,
495
+ "gpu_temperature_c": 64.0,
496
+ "gpu_power_w": 218.572,
497
+ "elapsed_seconds": 13.88012049999088
498
+ },
499
+ {
500
+ "process_rss_mb": 3596.62890625,
501
+ "cuda_allocated_mb": 141.64453125,
502
+ "cuda_reserved_mb": 12124.0,
503
+ "cuda_max_allocated_mb": 11120.271484375,
504
+ "cuda_max_reserved_mb": 12124.0,
505
+ "gpu_util_percent": 85.0,
506
+ "gpu_memory_util_percent": 63.0,
507
+ "gpu_memory_used_mb": 13350.20703125,
508
+ "gpu_memory_total_mb": 16303.0,
509
+ "gpu_temperature_c": 61.0,
510
+ "gpu_power_w": 179.005,
511
+ "elapsed_seconds": 14.386946899991017
512
+ },
513
+ {
514
+ "process_rss_mb": 3596.62890625,
515
+ "cuda_allocated_mb": 126.2216796875,
516
+ "cuda_reserved_mb": 12124.0,
517
+ "cuda_max_allocated_mb": 11120.271484375,
518
+ "cuda_max_reserved_mb": 12124.0,
519
+ "gpu_util_percent": 93.0,
520
+ "gpu_memory_util_percent": 73.0,
521
+ "gpu_memory_used_mb": 13350.20703125,
522
+ "gpu_memory_total_mb": 16303.0,
523
+ "gpu_temperature_c": 63.0,
524
+ "gpu_power_w": 178.29,
525
+ "elapsed_seconds": 14.909591800009366
526
+ },
527
+ {
528
+ "process_rss_mb": 3596.62890625,
529
+ "cuda_allocated_mb": 141.64453125,
530
+ "cuda_reserved_mb": 12124.0,
531
+ "cuda_max_allocated_mb": 11120.271484375,
532
+ "cuda_max_reserved_mb": 12124.0,
533
+ "gpu_util_percent": 66.0,
534
+ "gpu_memory_util_percent": 47.0,
535
+ "gpu_memory_used_mb": 13350.20703125,
536
+ "gpu_memory_total_mb": 16303.0,
537
+ "gpu_temperature_c": 65.0,
538
+ "gpu_power_w": 218.862,
539
+ "elapsed_seconds": 15.418887899984838
540
+ },
541
+ {
542
+ "process_rss_mb": 3596.62890625,
543
+ "cuda_allocated_mb": 126.2216796875,
544
+ "cuda_reserved_mb": 12124.0,
545
+ "cuda_max_allocated_mb": 11120.271484375,
546
+ "cuda_max_reserved_mb": 12124.0,
547
+ "gpu_util_percent": 100.0,
548
+ "gpu_memory_util_percent": 79.0,
549
+ "gpu_memory_used_mb": 13350.20703125,
550
+ "gpu_memory_total_mb": 16303.0,
551
+ "gpu_temperature_c": 64.0,
552
+ "gpu_power_w": 221.606,
553
+ "elapsed_seconds": 15.933654699998442
554
+ },
555
+ {
556
+ "process_rss_mb": 3596.62890625,
557
+ "cuda_allocated_mb": 141.64453125,
558
+ "cuda_reserved_mb": 12124.0,
559
+ "cuda_max_allocated_mb": 11120.271484375,
560
+ "cuda_max_reserved_mb": 12124.0,
561
+ "gpu_util_percent": 67.0,
562
+ "gpu_memory_util_percent": 49.0,
563
+ "gpu_memory_used_mb": 13350.20703125,
564
+ "gpu_memory_total_mb": 16303.0,
565
+ "gpu_temperature_c": 63.0,
566
+ "gpu_power_w": 218.428,
567
+ "elapsed_seconds": 16.43813369999407
568
+ },
569
+ {
570
+ "process_rss_mb": 3596.62890625,
571
+ "cuda_allocated_mb": 126.2216796875,
572
+ "cuda_reserved_mb": 12124.0,
573
+ "cuda_max_allocated_mb": 11120.271484375,
574
+ "cuda_max_reserved_mb": 12124.0,
575
+ "gpu_util_percent": 100.0,
576
+ "gpu_memory_util_percent": 76.0,
577
+ "gpu_memory_used_mb": 13350.20703125,
578
+ "gpu_memory_total_mb": 16303.0,
579
+ "gpu_temperature_c": 65.0,
580
+ "gpu_power_w": 221.864,
581
+ "elapsed_seconds": 16.955908100004308
582
+ },
583
+ {
584
+ "process_rss_mb": 3596.62890625,
585
+ "cuda_allocated_mb": 141.64453125,
586
+ "cuda_reserved_mb": 12124.0,
587
+ "cuda_max_allocated_mb": 11120.271484375,
588
+ "cuda_max_reserved_mb": 12124.0,
589
+ "gpu_util_percent": 65.0,
590
+ "gpu_memory_util_percent": 50.0,
591
+ "gpu_memory_used_mb": 13350.20703125,
592
+ "gpu_memory_total_mb": 16303.0,
593
+ "gpu_temperature_c": 59.0,
594
+ "gpu_power_w": 218.845,
595
+ "elapsed_seconds": 17.458802300010575
596
+ },
597
+ {
598
+ "process_rss_mb": 3596.62890625,
599
+ "cuda_allocated_mb": 126.2216796875,
600
+ "cuda_reserved_mb": 12124.0,
601
+ "cuda_max_allocated_mb": 11120.271484375,
602
+ "cuda_max_reserved_mb": 12124.0,
603
+ "gpu_util_percent": 100.0,
604
+ "gpu_memory_util_percent": 74.0,
605
+ "gpu_memory_used_mb": 13350.20703125,
606
+ "gpu_memory_total_mb": 16303.0,
607
+ "gpu_temperature_c": 65.0,
608
+ "gpu_power_w": 219.259,
609
+ "elapsed_seconds": 17.98001659999136
610
+ },
611
+ {
612
+ "process_rss_mb": 3596.62890625,
613
+ "cuda_allocated_mb": 141.64453125,
614
+ "cuda_reserved_mb": 12124.0,
615
+ "cuda_max_allocated_mb": 11120.271484375,
616
+ "cuda_max_reserved_mb": 12124.0,
617
+ "gpu_util_percent": 71.0,
618
+ "gpu_memory_util_percent": 55.0,
619
+ "gpu_memory_used_mb": 13350.20703125,
620
+ "gpu_memory_total_mb": 16303.0,
621
+ "gpu_temperature_c": 62.0,
622
+ "gpu_power_w": 217.625,
623
+ "elapsed_seconds": 18.493281700008083
624
+ },
625
+ {
626
+ "process_rss_mb": 3596.62890625,
627
+ "cuda_allocated_mb": 141.64453125,
628
+ "cuda_reserved_mb": 12124.0,
629
+ "cuda_max_allocated_mb": 11120.271484375,
630
+ "cuda_max_reserved_mb": 12124.0,
631
+ "gpu_util_percent": 82.0,
632
+ "gpu_memory_util_percent": 61.0,
633
+ "gpu_memory_used_mb": 13350.20703125,
634
+ "gpu_memory_total_mb": 16303.0,
635
+ "gpu_temperature_c": 65.0,
636
+ "gpu_power_w": 223.113,
637
+ "elapsed_seconds": 19.00455859999056
638
+ },
639
+ {
640
+ "process_rss_mb": 3596.62890625,
641
+ "cuda_allocated_mb": 6600.91796875,
642
+ "cuda_reserved_mb": 12124.0,
643
+ "cuda_max_allocated_mb": 11120.271484375,
644
+ "cuda_max_reserved_mb": 12124.0,
645
+ "gpu_util_percent": 94.0,
646
+ "gpu_memory_util_percent": 70.0,
647
+ "gpu_memory_used_mb": 13350.20703125,
648
+ "gpu_memory_total_mb": 16303.0,
649
+ "gpu_temperature_c": 63.0,
650
+ "gpu_power_w": 176.144,
651
+ "elapsed_seconds": 19.51709879998816
652
+ },
653
+ {
654
+ "process_rss_mb": 3596.62890625,
655
+ "cuda_allocated_mb": 141.64453125,
656
+ "cuda_reserved_mb": 12124.0,
657
+ "cuda_max_allocated_mb": 11120.271484375,
658
+ "cuda_max_reserved_mb": 12124.0,
659
+ "gpu_util_percent": 74.0,
660
+ "gpu_memory_util_percent": 55.0,
661
+ "gpu_memory_used_mb": 13350.20703125,
662
+ "gpu_memory_total_mb": 16303.0,
663
+ "gpu_temperature_c": 66.0,
664
+ "gpu_power_w": 221.989,
665
+ "elapsed_seconds": 20.026390199986054
666
+ },
667
+ {
668
+ "process_rss_mb": 3596.62890625,
669
+ "cuda_allocated_mb": 8451.15673828125,
670
+ "cuda_reserved_mb": 12124.0,
671
+ "cuda_max_allocated_mb": 11120.271484375,
672
+ "cuda_max_reserved_mb": 12124.0,
673
+ "gpu_util_percent": 100.0,
674
+ "gpu_memory_util_percent": 78.0,
675
+ "gpu_memory_used_mb": 13350.20703125,
676
+ "gpu_memory_total_mb": 16303.0,
677
+ "gpu_temperature_c": 65.0,
678
+ "gpu_power_w": 222.741,
679
+ "elapsed_seconds": 20.537088000011863
680
+ },
681
+ {
682
+ "process_rss_mb": 3596.62890625,
683
+ "cuda_allocated_mb": 141.64453125,
684
+ "cuda_reserved_mb": 12124.0,
685
+ "cuda_max_allocated_mb": 11120.271484375,
686
+ "cuda_max_reserved_mb": 12124.0,
687
+ "gpu_util_percent": 64.0,
688
+ "gpu_memory_util_percent": 46.0,
689
+ "gpu_memory_used_mb": 13350.20703125,
690
+ "gpu_memory_total_mb": 16303.0,
691
+ "gpu_temperature_c": 65.0,
692
+ "gpu_power_w": 218.985,
693
+ "elapsed_seconds": 21.044752499990864
694
+ },
695
+ {
696
+ "process_rss_mb": 3596.62890625,
697
+ "cuda_allocated_mb": 5214.01220703125,
698
+ "cuda_reserved_mb": 12124.0,
699
+ "cuda_max_allocated_mb": 11120.271484375,
700
+ "cuda_max_reserved_mb": 12124.0,
701
+ "gpu_util_percent": 100.0,
702
+ "gpu_memory_util_percent": 77.0,
703
+ "gpu_memory_used_mb": 13350.20703125,
704
+ "gpu_memory_total_mb": 16303.0,
705
+ "gpu_temperature_c": 65.0,
706
+ "gpu_power_w": 222.352,
707
+ "elapsed_seconds": 21.555139400006738
708
+ },
709
+ {
710
+ "process_rss_mb": 3596.62890625,
711
+ "cuda_allocated_mb": 141.64453125,
712
+ "cuda_reserved_mb": 12124.0,
713
+ "cuda_max_allocated_mb": 11120.271484375,
714
+ "cuda_max_reserved_mb": 12124.0,
715
+ "gpu_util_percent": 65.0,
716
+ "gpu_memory_util_percent": 48.0,
717
+ "gpu_memory_used_mb": 13350.20703125,
718
+ "gpu_memory_total_mb": 16303.0,
719
+ "gpu_temperature_c": 60.0,
720
+ "gpu_power_w": 216.032,
721
+ "elapsed_seconds": 22.065228299994487
722
+ },
723
+ {
724
+ "process_rss_mb": 3612.890625,
725
+ "cuda_allocated_mb": 126.2216796875,
726
+ "cuda_reserved_mb": 12124.0,
727
+ "cuda_max_allocated_mb": 11120.271484375,
728
+ "cuda_max_reserved_mb": 12124.0,
729
+ "gpu_util_percent": 100.0,
730
+ "gpu_memory_util_percent": 74.0,
731
+ "gpu_memory_used_mb": 13350.20703125,
732
+ "gpu_memory_total_mb": 16303.0,
733
+ "gpu_temperature_c": 67.0,
734
+ "gpu_power_w": 222.12,
735
+ "elapsed_seconds": 22.576357499987353
736
+ },
737
+ {
738
+ "process_rss_mb": 3612.890625,
739
+ "cuda_allocated_mb": 141.64453125,
740
+ "cuda_reserved_mb": 12124.0,
741
+ "cuda_max_allocated_mb": 11120.271484375,
742
+ "cuda_max_reserved_mb": 12124.0,
743
+ "gpu_util_percent": 74.0,
744
+ "gpu_memory_util_percent": 58.0,
745
+ "gpu_memory_used_mb": 13350.20703125,
746
+ "gpu_memory_total_mb": 16303.0,
747
+ "gpu_temperature_c": 64.0,
748
+ "gpu_power_w": 221.54,
749
+ "elapsed_seconds": 23.087020799983293
750
+ },
751
+ {
752
+ "process_rss_mb": 3612.890625,
753
+ "cuda_allocated_mb": 126.2216796875,
754
+ "cuda_reserved_mb": 12124.0,
755
+ "cuda_max_allocated_mb": 11120.271484375,
756
+ "cuda_max_reserved_mb": 12124.0,
757
+ "gpu_util_percent": 85.0,
758
+ "gpu_memory_util_percent": 64.0,
759
+ "gpu_memory_used_mb": 13350.20703125,
760
+ "gpu_memory_total_mb": 16303.0,
761
+ "gpu_temperature_c": 66.0,
762
+ "gpu_power_w": 221.585,
763
+ "elapsed_seconds": 23.59532359999139
764
+ },
765
+ {
766
+ "process_rss_mb": 3612.890625,
767
+ "cuda_allocated_mb": 141.64453125,
768
+ "cuda_reserved_mb": 12124.0,
769
+ "cuda_max_allocated_mb": 11120.271484375,
770
+ "cuda_max_reserved_mb": 12124.0,
771
+ "gpu_util_percent": 1.0,
772
+ "gpu_memory_util_percent": 2.0,
773
+ "gpu_memory_used_mb": 13350.20703125,
774
+ "gpu_memory_total_mb": 16303.0,
775
+ "gpu_temperature_c": 56.0,
776
+ "gpu_power_w": 193.905,
777
+ "elapsed_seconds": 24.106666300009238
778
+ },
779
+ {
780
+ "process_rss_mb": 3612.890625,
781
+ "cuda_allocated_mb": 141.64453125,
782
+ "cuda_reserved_mb": 12124.0,
783
+ "cuda_max_allocated_mb": 11120.271484375,
784
+ "cuda_max_reserved_mb": 12124.0,
785
+ "gpu_util_percent": 67.0,
786
+ "gpu_memory_util_percent": 53.0,
787
+ "gpu_memory_used_mb": 13350.20703125,
788
+ "gpu_memory_total_mb": 16303.0,
789
+ "gpu_temperature_c": 63.0,
790
+ "gpu_power_w": 180.115,
791
+ "elapsed_seconds": 24.61678059998667
792
+ },
793
+ {
794
+ "process_rss_mb": 3612.890625,
795
+ "cuda_allocated_mb": 399.6669921875,
796
+ "cuda_reserved_mb": 12124.0,
797
+ "cuda_max_allocated_mb": 11120.271484375,
798
+ "cuda_max_reserved_mb": 12124.0,
799
+ "gpu_util_percent": 90.0,
800
+ "gpu_memory_util_percent": 67.0,
801
+ "gpu_memory_used_mb": 13350.20703125,
802
+ "gpu_memory_total_mb": 16303.0,
803
+ "gpu_temperature_c": 67.0,
804
+ "gpu_power_w": 208.806,
805
+ "elapsed_seconds": 25.127415800001472
806
+ },
807
+ {
808
+ "process_rss_mb": 3612.890625,
809
+ "cuda_allocated_mb": 141.64453125,
810
+ "cuda_reserved_mb": 12124.0,
811
+ "cuda_max_allocated_mb": 11120.271484375,
812
+ "cuda_max_reserved_mb": 12124.0,
813
+ "gpu_util_percent": 92.0,
814
+ "gpu_memory_util_percent": 72.0,
815
+ "gpu_memory_used_mb": 13350.20703125,
816
+ "gpu_memory_total_mb": 16303.0,
817
+ "gpu_temperature_c": 66.0,
818
+ "gpu_power_w": 225.106,
819
+ "elapsed_seconds": 25.63698320000549
820
+ },
821
+ {
822
+ "process_rss_mb": 3612.890625,
823
+ "cuda_allocated_mb": 2104.0634765625,
824
+ "cuda_reserved_mb": 12124.0,
825
+ "cuda_max_allocated_mb": 11120.271484375,
826
+ "cuda_max_reserved_mb": 12124.0,
827
+ "gpu_util_percent": 66.0,
828
+ "gpu_memory_util_percent": 48.0,
829
+ "gpu_memory_used_mb": 13350.20703125,
830
+ "gpu_memory_total_mb": 16303.0,
831
+ "gpu_temperature_c": 67.0,
832
+ "gpu_power_w": 221.467,
833
+ "elapsed_seconds": 26.145683699985966
834
+ },
835
+ {
836
+ "process_rss_mb": 3612.890625,
837
+ "cuda_allocated_mb": 141.64453125,
838
+ "cuda_reserved_mb": 12124.0,
839
+ "cuda_max_allocated_mb": 11120.271484375,
840
+ "cuda_max_reserved_mb": 12124.0,
841
+ "gpu_util_percent": 100.0,
842
+ "gpu_memory_util_percent": 79.0,
843
+ "gpu_memory_used_mb": 13350.20703125,
844
+ "gpu_memory_total_mb": 16303.0,
845
+ "gpu_temperature_c": 67.0,
846
+ "gpu_power_w": 223.909,
847
+ "elapsed_seconds": 26.656147300003795
848
+ },
849
+ {
850
+ "process_rss_mb": 3612.890625,
851
+ "cuda_allocated_mb": 5922.0439453125,
852
+ "cuda_reserved_mb": 12124.0,
853
+ "cuda_max_allocated_mb": 11120.271484375,
854
+ "cuda_max_reserved_mb": 12124.0,
855
+ "gpu_util_percent": 65.0,
856
+ "gpu_memory_util_percent": 47.0,
857
+ "gpu_memory_used_mb": 13350.20703125,
858
+ "gpu_memory_total_mb": 16303.0,
859
+ "gpu_temperature_c": 65.0,
860
+ "gpu_power_w": 220.797,
861
+ "elapsed_seconds": 27.16638400001102
862
+ },
863
+ {
864
+ "process_rss_mb": 3612.890625,
865
+ "cuda_allocated_mb": 141.64453125,
866
+ "cuda_reserved_mb": 12124.0,
867
+ "cuda_max_allocated_mb": 11120.271484375,
868
+ "cuda_max_reserved_mb": 12124.0,
869
+ "gpu_util_percent": 100.0,
870
+ "gpu_memory_util_percent": 76.0,
871
+ "gpu_memory_used_mb": 13350.20703125,
872
+ "gpu_memory_total_mb": 16303.0,
873
+ "gpu_temperature_c": 68.0,
874
+ "gpu_power_w": 224.129,
875
+ "elapsed_seconds": 27.677494300005492
876
+ },
877
+ {
878
+ "process_rss_mb": 3612.890625,
879
+ "cuda_allocated_mb": 5752.5478515625,
880
+ "cuda_reserved_mb": 12124.0,
881
+ "cuda_max_allocated_mb": 11120.271484375,
882
+ "cuda_max_reserved_mb": 12124.0,
883
+ "gpu_util_percent": 65.0,
884
+ "gpu_memory_util_percent": 50.0,
885
+ "gpu_memory_used_mb": 13350.20703125,
886
+ "gpu_memory_total_mb": 16303.0,
887
+ "gpu_temperature_c": 61.0,
888
+ "gpu_power_w": 220.716,
889
+ "elapsed_seconds": 28.18874740001047
890
+ },
891
+ {
892
+ "process_rss_mb": 3612.890625,
893
+ "cuda_allocated_mb": 141.64453125,
894
+ "cuda_reserved_mb": 12124.0,
895
+ "cuda_max_allocated_mb": 11120.271484375,
896
+ "cuda_max_reserved_mb": 12124.0,
897
+ "gpu_util_percent": 100.0,
898
+ "gpu_memory_util_percent": 75.0,
899
+ "gpu_memory_used_mb": 13350.20703125,
900
+ "gpu_memory_total_mb": 16303.0,
901
+ "gpu_temperature_c": 67.0,
902
+ "gpu_power_w": 221.391,
903
+ "elapsed_seconds": 28.699434799986193
904
+ },
905
+ {
906
+ "process_rss_mb": 3612.890625,
907
+ "cuda_allocated_mb": 10308.271484375,
908
+ "cuda_reserved_mb": 12124.0,
909
+ "cuda_max_allocated_mb": 11120.271484375,
910
+ "cuda_max_reserved_mb": 12124.0,
911
+ "gpu_util_percent": 70.0,
912
+ "gpu_memory_util_percent": 54.0,
913
+ "gpu_memory_used_mb": 13350.20703125,
914
+ "gpu_memory_total_mb": 16303.0,
915
+ "gpu_temperature_c": 65.0,
916
+ "gpu_power_w": 219.822,
917
+ "elapsed_seconds": 29.21012229999178
918
+ },
919
+ {
920
+ "process_rss_mb": 3612.890625,
921
+ "cuda_allocated_mb": 141.64453125,
922
+ "cuda_reserved_mb": 12124.0,
923
+ "cuda_max_allocated_mb": 11120.271484375,
924
+ "cuda_max_reserved_mb": 12124.0,
925
+ "gpu_util_percent": 0.0,
926
+ "gpu_memory_util_percent": 2.0,
927
+ "gpu_memory_used_mb": 13350.20703125,
928
+ "gpu_memory_total_mb": 16303.0,
929
+ "gpu_temperature_c": 59.0,
930
+ "gpu_power_w": 210.546,
931
+ "elapsed_seconds": 29.718780900002457
932
+ },
933
+ {
934
+ "process_rss_mb": 3612.890625,
935
+ "cuda_allocated_mb": 141.64453125,
936
+ "cuda_reserved_mb": 12124.0,
937
+ "cuda_max_allocated_mb": 11120.271484375,
938
+ "cuda_max_reserved_mb": 12124.0,
939
+ "gpu_util_percent": 97.0,
940
+ "gpu_memory_util_percent": 72.0,
941
+ "gpu_memory_used_mb": 13350.20703125,
942
+ "gpu_memory_total_mb": 16303.0,
943
+ "gpu_temperature_c": 66.0,
944
+ "gpu_power_w": 178.409,
945
+ "elapsed_seconds": 30.229401099990355
946
+ },
947
+ {
948
+ "process_rss_mb": 3612.890625,
949
+ "cuda_allocated_mb": 141.64453125,
950
+ "cuda_reserved_mb": 12124.0,
951
+ "cuda_max_allocated_mb": 11120.271484375,
952
+ "cuda_max_reserved_mb": 12124.0,
953
+ "gpu_util_percent": 82.0,
954
+ "gpu_memory_util_percent": 64.0,
955
+ "gpu_memory_used_mb": 13350.20703125,
956
+ "gpu_memory_total_mb": 16303.0,
957
+ "gpu_temperature_c": 68.0,
958
+ "gpu_power_w": 192.887,
959
+ "elapsed_seconds": 30.739007500000298
960
+ },
961
+ {
962
+ "process_rss_mb": 3612.890625,
963
+ "cuda_allocated_mb": 141.64453125,
964
+ "cuda_reserved_mb": 12124.0,
965
+ "cuda_max_allocated_mb": 11120.271484375,
966
+ "cuda_max_reserved_mb": 12124.0,
967
+ "gpu_util_percent": 73.0,
968
+ "gpu_memory_util_percent": 54.0,
969
+ "gpu_memory_used_mb": 13350.20703125,
970
+ "gpu_memory_total_mb": 16303.0,
971
+ "gpu_temperature_c": 68.0,
972
+ "gpu_power_w": 223.767,
973
+ "elapsed_seconds": 31.248938000004273
974
+ },
975
+ {
976
+ "process_rss_mb": 3612.890625,
977
+ "cuda_allocated_mb": 141.64453125,
978
+ "cuda_reserved_mb": 12124.0,
979
+ "cuda_max_allocated_mb": 11120.271484375,
980
+ "cuda_max_reserved_mb": 12124.0,
981
+ "gpu_util_percent": 100.0,
982
+ "gpu_memory_util_percent": 78.0,
983
+ "gpu_memory_used_mb": 13350.20703125,
984
+ "gpu_memory_total_mb": 16303.0,
985
+ "gpu_temperature_c": 68.0,
986
+ "gpu_power_w": 224.212,
987
+ "elapsed_seconds": 31.757667500001844
988
+ },
989
+ {
990
+ "process_rss_mb": 3612.890625,
991
+ "cuda_allocated_mb": 141.64453125,
992
+ "cuda_reserved_mb": 12124.0,
993
+ "cuda_max_allocated_mb": 11120.271484375,
994
+ "cuda_max_reserved_mb": 12124.0,
995
+ "gpu_util_percent": 64.0,
996
+ "gpu_memory_util_percent": 46.0,
997
+ "gpu_memory_used_mb": 13350.20703125,
998
+ "gpu_memory_total_mb": 16303.0,
999
+ "gpu_temperature_c": 67.0,
1000
+ "gpu_power_w": 221.526,
1001
+ "elapsed_seconds": 32.26673880001181
1002
+ },
1003
+ {
1004
+ "process_rss_mb": 3612.890625,
1005
+ "cuda_allocated_mb": 640.3212890625,
1006
+ "cuda_reserved_mb": 12124.0,
1007
+ "cuda_max_allocated_mb": 11120.271484375,
1008
+ "cuda_max_reserved_mb": 12124.0,
1009
+ "gpu_util_percent": 100.0,
1010
+ "gpu_memory_util_percent": 77.0,
1011
+ "gpu_memory_used_mb": 13350.20703125,
1012
+ "gpu_memory_total_mb": 16303.0,
1013
+ "gpu_temperature_c": 68.0,
1014
+ "gpu_power_w": 224.4,
1015
+ "elapsed_seconds": 32.7766130999953
1016
+ },
1017
+ {
1018
+ "process_rss_mb": 3612.890625,
1019
+ "cuda_allocated_mb": 141.64453125,
1020
+ "cuda_reserved_mb": 12124.0,
1021
+ "cuda_max_allocated_mb": 11120.271484375,
1022
+ "cuda_max_reserved_mb": 12124.0,
1023
+ "gpu_util_percent": 62.0,
1024
+ "gpu_memory_util_percent": 47.0,
1025
+ "gpu_memory_used_mb": 13350.20703125,
1026
+ "gpu_memory_total_mb": 16303.0,
1027
+ "gpu_temperature_c": 62.0,
1028
+ "gpu_power_w": 217.718,
1029
+ "elapsed_seconds": 33.28791949999868
1030
+ },
1031
+ {
1032
+ "process_rss_mb": 3612.890625,
1033
+ "cuda_allocated_mb": 3393.1826171875,
1034
+ "cuda_reserved_mb": 12124.0,
1035
+ "cuda_max_allocated_mb": 11120.271484375,
1036
+ "cuda_max_reserved_mb": 12124.0,
1037
+ "gpu_util_percent": 100.0,
1038
+ "gpu_memory_util_percent": 75.0,
1039
+ "gpu_memory_used_mb": 13350.20703125,
1040
+ "gpu_memory_total_mb": 16303.0,
1041
+ "gpu_temperature_c": 67.0,
1042
+ "gpu_power_w": 221.852,
1043
+ "elapsed_seconds": 33.79941800000961
1044
+ },
1045
+ {
1046
+ "process_rss_mb": 3612.93359375,
1047
+ "cuda_allocated_mb": 141.64453125,
1048
+ "cuda_reserved_mb": 12124.0,
1049
+ "cuda_max_allocated_mb": 11120.271484375,
1050
+ "cuda_max_reserved_mb": 12124.0,
1051
+ "gpu_util_percent": 67.0,
1052
+ "gpu_memory_util_percent": 51.0,
1053
+ "gpu_memory_used_mb": 13350.20703125,
1054
+ "gpu_memory_total_mb": 16303.0,
1055
+ "gpu_temperature_c": 65.0,
1056
+ "gpu_power_w": 223.379,
1057
+ "elapsed_seconds": 34.30993029999081
1058
+ },
1059
+ {
1060
+ "process_rss_mb": 3612.94140625,
1061
+ "cuda_allocated_mb": 3445.80859375,
1062
+ "cuda_reserved_mb": 12124.0,
1063
+ "cuda_max_allocated_mb": 11120.271484375,
1064
+ "cuda_max_reserved_mb": 12124.0,
1065
+ "gpu_util_percent": 91.0,
1066
+ "gpu_memory_util_percent": 68.0,
1067
+ "gpu_memory_used_mb": 13350.20703125,
1068
+ "gpu_memory_total_mb": 16303.0,
1069
+ "gpu_temperature_c": 69.0,
1070
+ "gpu_power_w": 222.715,
1071
+ "elapsed_seconds": 34.820057700009784
1072
+ },
1073
+ {
1074
+ "process_rss_mb": 3651.80078125,
1075
+ "cuda_allocated_mb": 8961.90380859375,
1076
+ "cuda_reserved_mb": 12124.0,
1077
+ "cuda_max_allocated_mb": 11120.271484375,
1078
+ "cuda_max_reserved_mb": 12124.0,
1079
+ "gpu_util_percent": 87.0,
1080
+ "gpu_memory_util_percent": 68.0,
1081
+ "gpu_memory_used_mb": 13350.20703125,
1082
+ "gpu_memory_total_mb": 16303.0,
1083
+ "gpu_temperature_c": 69.0,
1084
+ "gpu_power_w": 226.682,
1085
+ "elapsed_seconds": 35.32873710000422
1086
+ },
1087
+ {
1088
+ "process_rss_mb": 3651.80078125,
1089
+ "cuda_allocated_mb": 126.2216796875,
1090
+ "cuda_reserved_mb": 12124.0,
1091
+ "cuda_max_allocated_mb": 11120.271484375,
1092
+ "cuda_max_reserved_mb": 12124.0,
1093
+ "gpu_util_percent": 100.0,
1094
+ "gpu_memory_util_percent": 78.0,
1095
+ "gpu_memory_used_mb": 13350.20703125,
1096
+ "gpu_memory_total_mb": 16303.0,
1097
+ "gpu_temperature_c": 67.0,
1098
+ "gpu_power_w": 217.093,
1099
+ "elapsed_seconds": 35.98900939998566
1100
+ },
1101
+ {
1102
+ "process_rss_mb": 3651.80078125,
1103
+ "cuda_allocated_mb": 140.751953125,
1104
+ "cuda_reserved_mb": 12124.0,
1105
+ "cuda_max_allocated_mb": 11120.271484375,
1106
+ "cuda_max_reserved_mb": 12124.0,
1107
+ "gpu_util_percent": 1.0,
1108
+ "gpu_memory_util_percent": 2.0,
1109
+ "gpu_memory_used_mb": 13350.20703125,
1110
+ "gpu_memory_total_mb": 16303.0,
1111
+ "gpu_temperature_c": 58.0,
1112
+ "gpu_power_w": 173.996,
1113
+ "elapsed_seconds": 36.49037069999031
1114
+ },
1115
+ {
1116
+ "process_rss_mb": 3651.80078125,
1117
+ "cuda_allocated_mb": 126.2216796875,
1118
+ "cuda_reserved_mb": 12124.0,
1119
+ "cuda_max_allocated_mb": 11120.271484375,
1120
+ "cuda_max_reserved_mb": 12124.0,
1121
+ "gpu_util_percent": 75.0,
1122
+ "gpu_memory_util_percent": 56.0,
1123
+ "gpu_memory_used_mb": 13350.20703125,
1124
+ "gpu_memory_total_mb": 16303.0,
1125
+ "gpu_temperature_c": 69.0,
1126
+ "gpu_power_w": 176.62,
1127
+ "elapsed_seconds": 37.00997529999586
1128
+ },
1129
+ {
1130
+ "process_rss_mb": 3651.80078125,
1131
+ "cuda_allocated_mb": 140.751953125,
1132
+ "cuda_reserved_mb": 12124.0,
1133
+ "cuda_max_allocated_mb": 11120.271484375,
1134
+ "cuda_max_reserved_mb": 12124.0,
1135
+ "gpu_util_percent": 100.0,
1136
+ "gpu_memory_util_percent": 77.0,
1137
+ "gpu_memory_used_mb": 13350.20703125,
1138
+ "gpu_memory_total_mb": 16303.0,
1139
+ "gpu_temperature_c": 70.0,
1140
+ "gpu_power_w": 225.539,
1141
+ "elapsed_seconds": 37.51092579998658
1142
+ },
1143
+ {
1144
+ "process_rss_mb": 3651.80078125,
1145
+ "cuda_allocated_mb": 126.2216796875,
1146
+ "cuda_reserved_mb": 12124.0,
1147
+ "cuda_max_allocated_mb": 11120.271484375,
1148
+ "cuda_max_reserved_mb": 12124.0,
1149
+ "gpu_util_percent": 100.0,
1150
+ "gpu_memory_util_percent": 77.0,
1151
+ "gpu_memory_used_mb": 13350.20703125,
1152
+ "gpu_memory_total_mb": 16303.0,
1153
+ "gpu_temperature_c": 70.0,
1154
+ "gpu_power_w": 224.74,
1155
+ "elapsed_seconds": 38.03694089999772
1156
+ },
1157
+ {
1158
+ "process_rss_mb": 3651.80078125,
1159
+ "cuda_allocated_mb": 140.751953125,
1160
+ "cuda_reserved_mb": 12124.0,
1161
+ "cuda_max_allocated_mb": 11120.271484375,
1162
+ "cuda_max_reserved_mb": 12124.0,
1163
+ "gpu_util_percent": 66.0,
1164
+ "gpu_memory_util_percent": 50.0,
1165
+ "gpu_memory_used_mb": 13350.20703125,
1166
+ "gpu_memory_total_mb": 16303.0,
1167
+ "gpu_temperature_c": 63.0,
1168
+ "gpu_power_w": 218.941,
1169
+ "elapsed_seconds": 38.545965199999046
1170
+ },
1171
+ {
1172
+ "process_rss_mb": 3651.80078125,
1173
+ "cuda_allocated_mb": 126.2216796875,
1174
+ "cuda_reserved_mb": 12124.0,
1175
+ "cuda_max_allocated_mb": 11120.271484375,
1176
+ "cuda_max_reserved_mb": 12124.0,
1177
+ "gpu_util_percent": 100.0,
1178
+ "gpu_memory_util_percent": 75.0,
1179
+ "gpu_memory_used_mb": 13350.20703125,
1180
+ "gpu_memory_total_mb": 16303.0,
1181
+ "gpu_temperature_c": 69.0,
1182
+ "gpu_power_w": 225.898,
1183
+ "elapsed_seconds": 39.06172140000854
1184
+ },
1185
+ {
1186
+ "process_rss_mb": 3651.80078125,
1187
+ "cuda_allocated_mb": 140.751953125,
1188
+ "cuda_reserved_mb": 12124.0,
1189
+ "cuda_max_allocated_mb": 11120.271484375,
1190
+ "cuda_max_reserved_mb": 12124.0,
1191
+ "gpu_util_percent": 64.0,
1192
+ "gpu_memory_util_percent": 51.0,
1193
+ "gpu_memory_used_mb": 13350.20703125,
1194
+ "gpu_memory_total_mb": 16303.0,
1195
+ "gpu_temperature_c": 65.0,
1196
+ "gpu_power_w": 223.082,
1197
+ "elapsed_seconds": 39.56581679999363
1198
+ },
1199
+ {
1200
+ "process_rss_mb": 3651.80078125,
1201
+ "cuda_allocated_mb": 126.2216796875,
1202
+ "cuda_reserved_mb": 12124.0,
1203
+ "cuda_max_allocated_mb": 11120.271484375,
1204
+ "cuda_max_reserved_mb": 12124.0,
1205
+ "gpu_util_percent": 93.0,
1206
+ "gpu_memory_util_percent": 69.0,
1207
+ "gpu_memory_used_mb": 13350.20703125,
1208
+ "gpu_memory_total_mb": 16303.0,
1209
+ "gpu_temperature_c": 70.0,
1210
+ "gpu_power_w": 222.575,
1211
+ "elapsed_seconds": 40.08639479998965
1212
+ },
1213
+ {
1214
+ "process_rss_mb": 3651.80078125,
1215
+ "cuda_allocated_mb": 140.751953125,
1216
+ "cuda_reserved_mb": 12124.0,
1217
+ "cuda_max_allocated_mb": 11120.271484375,
1218
+ "cuda_max_reserved_mb": 12124.0,
1219
+ "gpu_util_percent": 87.0,
1220
+ "gpu_memory_util_percent": 68.0,
1221
+ "gpu_memory_used_mb": 13350.20703125,
1222
+ "gpu_memory_total_mb": 16303.0,
1223
+ "gpu_temperature_c": 70.0,
1224
+ "gpu_power_w": 223.698,
1225
+ "elapsed_seconds": 40.6014307999867
1226
+ },
1227
+ {
1228
+ "process_rss_mb": 3651.80078125,
1229
+ "cuda_allocated_mb": 126.2216796875,
1230
+ "cuda_reserved_mb": 12124.0,
1231
+ "cuda_max_allocated_mb": 11120.271484375,
1232
+ "cuda_max_reserved_mb": 12124.0,
1233
+ "gpu_util_percent": 69.0,
1234
+ "gpu_memory_util_percent": 51.0,
1235
+ "gpu_memory_used_mb": 13350.20703125,
1236
+ "gpu_memory_total_mb": 16303.0,
1237
+ "gpu_temperature_c": 70.0,
1238
+ "gpu_power_w": 224.483,
1239
+ "elapsed_seconds": 41.112792400002945
1240
+ },
1241
+ {
1242
+ "process_rss_mb": 3651.80078125,
1243
+ "cuda_allocated_mb": 140.751953125,
1244
+ "cuda_reserved_mb": 12124.0,
1245
+ "cuda_max_allocated_mb": 11120.271484375,
1246
+ "cuda_max_reserved_mb": 12124.0,
1247
+ "gpu_util_percent": 100.0,
1248
+ "gpu_memory_util_percent": 77.0,
1249
+ "gpu_memory_used_mb": 13350.20703125,
1250
+ "gpu_memory_total_mb": 16303.0,
1251
+ "gpu_temperature_c": 71.0,
1252
+ "gpu_power_w": 224.626,
1253
+ "elapsed_seconds": 41.62216349999653
1254
+ },
1255
+ {
1256
+ "process_rss_mb": 3651.80078125,
1257
+ "cuda_allocated_mb": 126.2216796875,
1258
+ "cuda_reserved_mb": 12124.0,
1259
+ "cuda_max_allocated_mb": 11120.271484375,
1260
+ "cuda_max_reserved_mb": 12124.0,
1261
+ "gpu_util_percent": 64.0,
1262
+ "gpu_memory_util_percent": 48.0,
1263
+ "gpu_memory_used_mb": 13350.20703125,
1264
+ "gpu_memory_total_mb": 16303.0,
1265
+ "gpu_temperature_c": 68.0,
1266
+ "gpu_power_w": 222.202,
1267
+ "elapsed_seconds": 42.135246999998344
1268
+ },
1269
+ {
1270
+ "process_rss_mb": 3651.80078125,
1271
+ "cuda_allocated_mb": 140.751953125,
1272
+ "cuda_reserved_mb": 12124.0,
1273
+ "cuda_max_allocated_mb": 11120.271484375,
1274
+ "cuda_max_reserved_mb": 12124.0,
1275
+ "gpu_util_percent": 100.0,
1276
+ "gpu_memory_util_percent": 76.0,
1277
+ "gpu_memory_used_mb": 13350.20703125,
1278
+ "gpu_memory_total_mb": 16303.0,
1279
+ "gpu_temperature_c": 70.0,
1280
+ "gpu_power_w": 222.999,
1281
+ "elapsed_seconds": 42.63937769999029
1282
+ },
1283
+ {
1284
+ "process_rss_mb": 3651.80078125,
1285
+ "cuda_allocated_mb": 126.2216796875,
1286
+ "cuda_reserved_mb": 12124.0,
1287
+ "cuda_max_allocated_mb": 11120.271484375,
1288
+ "cuda_max_reserved_mb": 12124.0,
1289
+ "gpu_util_percent": 64.0,
1290
+ "gpu_memory_util_percent": 48.0,
1291
+ "gpu_memory_used_mb": 13350.20703125,
1292
+ "gpu_memory_total_mb": 16303.0,
1293
+ "gpu_temperature_c": 64.0,
1294
+ "gpu_power_w": 219.672,
1295
+ "elapsed_seconds": 43.1591141000099
1296
+ },
1297
+ {
1298
+ "process_rss_mb": 3651.80078125,
1299
+ "cuda_allocated_mb": 140.751953125,
1300
+ "cuda_reserved_mb": 12124.0,
1301
+ "cuda_max_allocated_mb": 11120.271484375,
1302
+ "cuda_max_reserved_mb": 12124.0,
1303
+ "gpu_util_percent": 100.0,
1304
+ "gpu_memory_util_percent": 74.0,
1305
+ "gpu_memory_used_mb": 13350.20703125,
1306
+ "gpu_memory_total_mb": 16303.0,
1307
+ "gpu_temperature_c": 70.0,
1308
+ "gpu_power_w": 226.506,
1309
+ "elapsed_seconds": 43.67472969999653
1310
+ },
1311
+ {
1312
+ "process_rss_mb": 3651.80078125,
1313
+ "cuda_allocated_mb": 126.2216796875,
1314
+ "cuda_reserved_mb": 12124.0,
1315
+ "cuda_max_allocated_mb": 11120.271484375,
1316
+ "cuda_max_reserved_mb": 12124.0,
1317
+ "gpu_util_percent": 68.0,
1318
+ "gpu_memory_util_percent": 53.0,
1319
+ "gpu_memory_used_mb": 13350.20703125,
1320
+ "gpu_memory_total_mb": 16303.0,
1321
+ "gpu_temperature_c": 67.0,
1322
+ "gpu_power_w": 224.814,
1323
+ "elapsed_seconds": 44.185869899985846
1324
+ },
1325
+ {
1326
+ "process_rss_mb": 3651.80078125,
1327
+ "cuda_allocated_mb": 140.751953125,
1328
+ "cuda_reserved_mb": 12124.0,
1329
+ "cuda_max_allocated_mb": 11120.271484375,
1330
+ "cuda_max_reserved_mb": 12124.0,
1331
+ "gpu_util_percent": 86.0,
1332
+ "gpu_memory_util_percent": 64.0,
1333
+ "gpu_memory_used_mb": 13350.20703125,
1334
+ "gpu_memory_total_mb": 16303.0,
1335
+ "gpu_temperature_c": 69.0,
1336
+ "gpu_power_w": 223.741,
1337
+ "elapsed_seconds": 44.69514809999964
1338
+ },
1339
+ {
1340
+ "process_rss_mb": 3651.80078125,
1341
+ "cuda_allocated_mb": 126.2216796875,
1342
+ "cuda_reserved_mb": 12124.0,
1343
+ "cuda_max_allocated_mb": 11120.271484375,
1344
+ "cuda_max_reserved_mb": 12124.0,
1345
+ "gpu_util_percent": 91.0,
1346
+ "gpu_memory_util_percent": 71.0,
1347
+ "gpu_memory_used_mb": 13350.20703125,
1348
+ "gpu_memory_total_mb": 16303.0,
1349
+ "gpu_temperature_c": 70.0,
1350
+ "gpu_power_w": 225.243,
1351
+ "elapsed_seconds": 45.20475219999207
1352
+ },
1353
+ {
1354
+ "process_rss_mb": 3651.80078125,
1355
+ "cuda_allocated_mb": 140.751953125,
1356
+ "cuda_reserved_mb": 12124.0,
1357
+ "cuda_max_allocated_mb": 11120.271484375,
1358
+ "cuda_max_reserved_mb": 12124.0,
1359
+ "gpu_util_percent": 65.0,
1360
+ "gpu_memory_util_percent": 48.0,
1361
+ "gpu_memory_used_mb": 13350.20703125,
1362
+ "gpu_memory_total_mb": 16303.0,
1363
+ "gpu_temperature_c": 70.0,
1364
+ "gpu_power_w": 224.265,
1365
+ "elapsed_seconds": 45.714895399985835
1366
+ },
1367
+ {
1368
+ "process_rss_mb": 3651.80078125,
1369
+ "cuda_allocated_mb": 140.751953125,
1370
+ "cuda_reserved_mb": 12124.0,
1371
+ "cuda_max_allocated_mb": 11120.271484375,
1372
+ "cuda_max_reserved_mb": 12124.0,
1373
+ "gpu_util_percent": 1.0,
1374
+ "gpu_memory_util_percent": 2.0,
1375
+ "gpu_memory_used_mb": 13350.20703125,
1376
+ "gpu_memory_total_mb": 16303.0,
1377
+ "gpu_temperature_c": 60.0,
1378
+ "gpu_power_w": 199.361,
1379
+ "elapsed_seconds": 46.226491599984
1380
+ },
1381
+ {
1382
+ "process_rss_mb": 3651.80078125,
1383
+ "cuda_allocated_mb": 140.751953125,
1384
+ "cuda_reserved_mb": 12124.0,
1385
+ "cuda_max_allocated_mb": 11120.271484375,
1386
+ "cuda_max_reserved_mb": 12124.0,
1387
+ "gpu_util_percent": 82.0,
1388
+ "gpu_memory_util_percent": 64.0,
1389
+ "gpu_memory_used_mb": 13350.20703125,
1390
+ "gpu_memory_total_mb": 16303.0,
1391
+ "gpu_temperature_c": 70.0,
1392
+ "gpu_power_w": 183.775,
1393
+ "elapsed_seconds": 46.73763419999159
1394
+ },
1395
+ {
1396
+ "process_rss_mb": 3651.80078125,
1397
+ "cuda_allocated_mb": 140.751953125,
1398
+ "cuda_reserved_mb": 12124.0,
1399
+ "cuda_max_allocated_mb": 11120.271484375,
1400
+ "cuda_max_reserved_mb": 12124.0,
1401
+ "gpu_util_percent": 75.0,
1402
+ "gpu_memory_util_percent": 55.0,
1403
+ "gpu_memory_used_mb": 13350.20703125,
1404
+ "gpu_memory_total_mb": 16303.0,
1405
+ "gpu_temperature_c": 71.0,
1406
+ "gpu_power_w": 209.171,
1407
+ "elapsed_seconds": 47.24767229999998
1408
+ },
1409
+ {
1410
+ "process_rss_mb": 3651.80078125,
1411
+ "cuda_allocated_mb": 140.751953125,
1412
+ "cuda_reserved_mb": 12124.0,
1413
+ "cuda_max_allocated_mb": 11120.271484375,
1414
+ "cuda_max_reserved_mb": 12124.0,
1415
+ "gpu_util_percent": 100.0,
1416
+ "gpu_memory_util_percent": 78.0,
1417
+ "gpu_memory_used_mb": 13350.20703125,
1418
+ "gpu_memory_total_mb": 16303.0,
1419
+ "gpu_temperature_c": 69.0,
1420
+ "gpu_power_w": 226.806,
1421
+ "elapsed_seconds": 47.7600390999869
1422
+ },
1423
+ {
1424
+ "process_rss_mb": 3651.80078125,
1425
+ "cuda_allocated_mb": 140.751953125,
1426
+ "cuda_reserved_mb": 12124.0,
1427
+ "cuda_max_allocated_mb": 11120.271484375,
1428
+ "cuda_max_reserved_mb": 12124.0,
1429
+ "gpu_util_percent": 66.0,
1430
+ "gpu_memory_util_percent": 49.0,
1431
+ "gpu_memory_used_mb": 13350.20703125,
1432
+ "gpu_memory_total_mb": 16303.0,
1433
+ "gpu_temperature_c": 71.0,
1434
+ "gpu_power_w": 223.771,
1435
+ "elapsed_seconds": 48.268198999983724
1436
+ },
1437
+ {
1438
+ "process_rss_mb": 3651.80078125,
1439
+ "cuda_allocated_mb": 140.751953125,
1440
+ "cuda_reserved_mb": 12124.0,
1441
+ "cuda_max_allocated_mb": 11120.271484375,
1442
+ "cuda_max_reserved_mb": 12124.0,
1443
+ "gpu_util_percent": 100.0,
1444
+ "gpu_memory_util_percent": 77.0,
1445
+ "gpu_memory_used_mb": 13350.20703125,
1446
+ "gpu_memory_total_mb": 16303.0,
1447
+ "gpu_temperature_c": 71.0,
1448
+ "gpu_power_w": 223.924,
1449
+ "elapsed_seconds": 48.77904500000295
1450
+ },
1451
+ {
1452
+ "process_rss_mb": 3651.80078125,
1453
+ "cuda_allocated_mb": 140.751953125,
1454
+ "cuda_reserved_mb": 12124.0,
1455
+ "cuda_max_allocated_mb": 11120.271484375,
1456
+ "cuda_max_reserved_mb": 12124.0,
1457
+ "gpu_util_percent": 66.0,
1458
+ "gpu_memory_util_percent": 50.0,
1459
+ "gpu_memory_used_mb": 13350.20703125,
1460
+ "gpu_memory_total_mb": 16303.0,
1461
+ "gpu_temperature_c": 66.0,
1462
+ "gpu_power_w": 223.157,
1463
+ "elapsed_seconds": 49.28964350000024
1464
+ },
1465
+ {
1466
+ "process_rss_mb": 3651.80078125,
1467
+ "cuda_allocated_mb": 140.751953125,
1468
+ "cuda_reserved_mb": 12124.0,
1469
+ "cuda_max_allocated_mb": 11120.271484375,
1470
+ "cuda_max_reserved_mb": 12124.0,
1471
+ "gpu_util_percent": 100.0,
1472
+ "gpu_memory_util_percent": 76.0,
1473
+ "gpu_memory_used_mb": 13350.20703125,
1474
+ "gpu_memory_total_mb": 16303.0,
1475
+ "gpu_temperature_c": 72.0,
1476
+ "gpu_power_w": 227.113,
1477
+ "elapsed_seconds": 49.799869399983436
1478
+ },
1479
+ {
1480
+ "process_rss_mb": 3651.80078125,
1481
+ "cuda_allocated_mb": 140.751953125,
1482
+ "cuda_reserved_mb": 12124.0,
1483
+ "cuda_max_allocated_mb": 11120.271484375,
1484
+ "cuda_max_reserved_mb": 12124.0,
1485
+ "gpu_util_percent": 65.0,
1486
+ "gpu_memory_util_percent": 52.0,
1487
+ "gpu_memory_used_mb": 13350.20703125,
1488
+ "gpu_memory_total_mb": 16303.0,
1489
+ "gpu_temperature_c": 66.0,
1490
+ "gpu_power_w": 223.839,
1491
+ "elapsed_seconds": 50.30973179999273
1492
+ },
1493
+ {
1494
+ "process_rss_mb": 3651.80078125,
1495
+ "cuda_allocated_mb": 584.3232421875,
1496
+ "cuda_reserved_mb": 12124.0,
1497
+ "cuda_max_allocated_mb": 11120.271484375,
1498
+ "cuda_max_reserved_mb": 12124.0,
1499
+ "gpu_util_percent": 96.0,
1500
+ "gpu_memory_util_percent": 72.0,
1501
+ "gpu_memory_used_mb": 13350.20703125,
1502
+ "gpu_memory_total_mb": 16303.0,
1503
+ "gpu_temperature_c": 71.0,
1504
+ "gpu_power_w": 227.682,
1505
+ "elapsed_seconds": 50.81797879998339
1506
+ },
1507
+ {
1508
+ "process_rss_mb": 3651.80078125,
1509
+ "cuda_allocated_mb": 140.751953125,
1510
+ "cuda_reserved_mb": 12124.0,
1511
+ "cuda_max_allocated_mb": 11120.271484375,
1512
+ "cuda_max_reserved_mb": 12124.0,
1513
+ "gpu_util_percent": 83.0,
1514
+ "gpu_memory_util_percent": 64.0,
1515
+ "gpu_memory_used_mb": 13350.20703125,
1516
+ "gpu_memory_total_mb": 16303.0,
1517
+ "gpu_temperature_c": 71.0,
1518
+ "gpu_power_w": 224.619,
1519
+ "elapsed_seconds": 51.32866830000421
1520
+ },
1521
+ {
1522
+ "process_rss_mb": 3651.80078125,
1523
+ "cuda_allocated_mb": 367.50244140625,
1524
+ "cuda_reserved_mb": 12124.0,
1525
+ "cuda_max_allocated_mb": 11120.271484375,
1526
+ "cuda_max_reserved_mb": 12124.0,
1527
+ "gpu_util_percent": 75.0,
1528
+ "gpu_memory_util_percent": 56.0,
1529
+ "gpu_memory_used_mb": 13350.20703125,
1530
+ "gpu_memory_total_mb": 16303.0,
1531
+ "gpu_temperature_c": 72.0,
1532
+ "gpu_power_w": 225.161,
1533
+ "elapsed_seconds": 51.840583999990486
1534
+ },
1535
+ {
1536
+ "process_rss_mb": 3651.80078125,
1537
+ "cuda_allocated_mb": 140.751953125,
1538
+ "cuda_reserved_mb": 12124.0,
1539
+ "cuda_max_allocated_mb": 11120.271484375,
1540
+ "cuda_max_reserved_mb": 12124.0,
1541
+ "gpu_util_percent": 100.0,
1542
+ "gpu_memory_util_percent": 78.0,
1543
+ "gpu_memory_used_mb": 13350.20703125,
1544
+ "gpu_memory_total_mb": 16303.0,
1545
+ "gpu_temperature_c": 70.0,
1546
+ "gpu_power_w": 227.579,
1547
+ "elapsed_seconds": 52.35056530000293
1548
+ },
1549
+ {
1550
+ "process_rss_mb": 3651.80078125,
1551
+ "cuda_allocated_mb": 1088.0693359375,
1552
+ "cuda_reserved_mb": 12124.0,
1553
+ "cuda_max_allocated_mb": 11120.271484375,
1554
+ "cuda_max_reserved_mb": 12124.0,
1555
+ "gpu_util_percent": 64.0,
1556
+ "gpu_memory_util_percent": 47.0,
1557
+ "gpu_memory_used_mb": 13350.20703125,
1558
+ "gpu_memory_total_mb": 16303.0,
1559
+ "gpu_temperature_c": 71.0,
1560
+ "gpu_power_w": 222.789,
1561
+ "elapsed_seconds": 52.860525099997176
1562
+ },
1563
+ {
1564
+ "process_rss_mb": 3651.80078125,
1565
+ "cuda_allocated_mb": 140.751953125,
1566
+ "cuda_reserved_mb": 12124.0,
1567
+ "cuda_max_allocated_mb": 11120.271484375,
1568
+ "cuda_max_reserved_mb": 12124.0,
1569
+ "gpu_util_percent": 100.0,
1570
+ "gpu_memory_util_percent": 76.0,
1571
+ "gpu_memory_used_mb": 13350.20703125,
1572
+ "gpu_memory_total_mb": 16303.0,
1573
+ "gpu_temperature_c": 71.0,
1574
+ "gpu_power_w": 227.236,
1575
+ "elapsed_seconds": 53.37119559998973
1576
+ },
1577
+ {
1578
+ "process_rss_mb": 3651.80078125,
1579
+ "cuda_allocated_mb": 3840.9306640625,
1580
+ "cuda_reserved_mb": 12124.0,
1581
+ "cuda_max_allocated_mb": 11120.271484375,
1582
+ "cuda_max_reserved_mb": 12124.0,
1583
+ "gpu_util_percent": 63.0,
1584
+ "gpu_memory_util_percent": 49.0,
1585
+ "gpu_memory_used_mb": 13350.20703125,
1586
+ "gpu_memory_total_mb": 16303.0,
1587
+ "gpu_temperature_c": 66.0,
1588
+ "gpu_power_w": 221.349,
1589
+ "elapsed_seconds": 53.881874099985
1590
+ },
1591
+ {
1592
+ "process_rss_mb": 3651.80078125,
1593
+ "cuda_allocated_mb": 140.751953125,
1594
+ "cuda_reserved_mb": 12124.0,
1595
+ "cuda_max_allocated_mb": 11120.271484375,
1596
+ "cuda_max_reserved_mb": 12124.0,
1597
+ "gpu_util_percent": 100.0,
1598
+ "gpu_memory_util_percent": 75.0,
1599
+ "gpu_memory_used_mb": 13350.20703125,
1600
+ "gpu_memory_total_mb": 16303.0,
1601
+ "gpu_temperature_c": 71.0,
1602
+ "gpu_power_w": 227.584,
1603
+ "elapsed_seconds": 54.3920272999967
1604
+ },
1605
+ {
1606
+ "process_rss_mb": 3651.80078125,
1607
+ "cuda_allocated_mb": 4297.05078125,
1608
+ "cuda_reserved_mb": 12124.0,
1609
+ "cuda_max_allocated_mb": 11120.271484375,
1610
+ "cuda_max_reserved_mb": 12124.0,
1611
+ "gpu_util_percent": 65.0,
1612
+ "gpu_memory_util_percent": 51.0,
1613
+ "gpu_memory_used_mb": 13350.20703125,
1614
+ "gpu_memory_total_mb": 16303.0,
1615
+ "gpu_temperature_c": 67.0,
1616
+ "gpu_power_w": 224.702,
1617
+ "elapsed_seconds": 54.902947499998845
1618
+ },
1619
+ {
1620
+ "process_rss_mb": 3651.80078125,
1621
+ "cuda_allocated_mb": 140.751953125,
1622
+ "cuda_reserved_mb": 12124.0,
1623
+ "cuda_max_allocated_mb": 11120.271484375,
1624
+ "cuda_max_reserved_mb": 12124.0,
1625
+ "gpu_util_percent": 95.0,
1626
+ "gpu_memory_util_percent": 70.0,
1627
+ "gpu_memory_used_mb": 13350.20703125,
1628
+ "gpu_memory_total_mb": 16303.0,
1629
+ "gpu_temperature_c": 71.0,
1630
+ "gpu_power_w": 224.96,
1631
+ "elapsed_seconds": 55.4142581000051
1632
+ },
1633
+ {
1634
+ "process_rss_mb": 3651.80078125,
1635
+ "cuda_allocated_mb": 7386.53857421875,
1636
+ "cuda_reserved_mb": 12124.0,
1637
+ "cuda_max_allocated_mb": 11120.271484375,
1638
+ "cuda_max_reserved_mb": 12124.0,
1639
+ "gpu_util_percent": 83.0,
1640
+ "gpu_memory_util_percent": 65.0,
1641
+ "gpu_memory_used_mb": 13350.20703125,
1642
+ "gpu_memory_total_mb": 16303.0,
1643
+ "gpu_temperature_c": 72.0,
1644
+ "gpu_power_w": 229.283,
1645
+ "elapsed_seconds": 55.92322180001065
1646
+ },
1647
+ {
1648
+ "process_rss_mb": 3651.80078125,
1649
+ "cuda_allocated_mb": 140.751953125,
1650
+ "cuda_reserved_mb": 12124.0,
1651
+ "cuda_max_allocated_mb": 11120.271484375,
1652
+ "cuda_max_reserved_mb": 12124.0,
1653
+ "gpu_util_percent": 73.0,
1654
+ "gpu_memory_util_percent": 54.0,
1655
+ "gpu_memory_used_mb": 13350.20703125,
1656
+ "gpu_memory_total_mb": 16303.0,
1657
+ "gpu_temperature_c": 73.0,
1658
+ "gpu_power_w": 225.416,
1659
+ "elapsed_seconds": 56.434711399982916
1660
+ },
1661
+ {
1662
+ "process_rss_mb": 3651.80078125,
1663
+ "cuda_allocated_mb": 8115.15771484375,
1664
+ "cuda_reserved_mb": 12124.0,
1665
+ "cuda_max_allocated_mb": 11120.271484375,
1666
+ "cuda_max_reserved_mb": 12124.0,
1667
+ "gpu_util_percent": 100.0,
1668
+ "gpu_memory_util_percent": 78.0,
1669
+ "gpu_memory_used_mb": 13350.20703125,
1670
+ "gpu_memory_total_mb": 16303.0,
1671
+ "gpu_temperature_c": 71.0,
1672
+ "gpu_power_w": 227.937,
1673
+ "elapsed_seconds": 56.94552159999148
1674
+ },
1675
+ {
1676
+ "process_rss_mb": 3651.80078125,
1677
+ "cuda_allocated_mb": 140.751953125,
1678
+ "cuda_reserved_mb": 12124.0,
1679
+ "cuda_max_allocated_mb": 11120.271484375,
1680
+ "cuda_max_reserved_mb": 12124.0,
1681
+ "gpu_util_percent": 67.0,
1682
+ "gpu_memory_util_percent": 48.0,
1683
+ "gpu_memory_used_mb": 13350.20703125,
1684
+ "gpu_memory_total_mb": 16303.0,
1685
+ "gpu_temperature_c": 72.0,
1686
+ "gpu_power_w": 223.304,
1687
+ "elapsed_seconds": 57.45550720000756
1688
+ },
1689
+ {
1690
+ "process_rss_mb": 3651.80078125,
1691
+ "cuda_allocated_mb": 10308.271484375,
1692
+ "cuda_reserved_mb": 12124.0,
1693
+ "cuda_max_allocated_mb": 11120.271484375,
1694
+ "cuda_max_reserved_mb": 12124.0,
1695
+ "gpu_util_percent": 100.0,
1696
+ "gpu_memory_util_percent": 77.0,
1697
+ "gpu_memory_used_mb": 13350.20703125,
1698
+ "gpu_memory_total_mb": 16303.0,
1699
+ "gpu_temperature_c": 72.0,
1700
+ "gpu_power_w": 225.256,
1701
+ "elapsed_seconds": 57.96506930000032
1702
+ },
1703
+ {
1704
+ "process_rss_mb": 3651.80078125,
1705
+ "cuda_allocated_mb": 140.751953125,
1706
+ "cuda_reserved_mb": 12124.0,
1707
+ "cuda_max_allocated_mb": 11120.271484375,
1708
+ "cuda_max_reserved_mb": 12124.0,
1709
+ "gpu_util_percent": 67.0,
1710
+ "gpu_memory_util_percent": 50.0,
1711
+ "gpu_memory_used_mb": 13350.20703125,
1712
+ "gpu_memory_total_mb": 16303.0,
1713
+ "gpu_temperature_c": 66.0,
1714
+ "gpu_power_w": 224.621,
1715
+ "elapsed_seconds": 58.47955930000171
1716
+ },
1717
+ {
1718
+ "process_rss_mb": 3651.80078125,
1719
+ "cuda_allocated_mb": 140.751953125,
1720
+ "cuda_reserved_mb": 12124.0,
1721
+ "cuda_max_allocated_mb": 11120.271484375,
1722
+ "cuda_max_reserved_mb": 12124.0,
1723
+ "gpu_util_percent": 37.0,
1724
+ "gpu_memory_util_percent": 28.0,
1725
+ "gpu_memory_used_mb": 13350.20703125,
1726
+ "gpu_memory_total_mb": 16303.0,
1727
+ "gpu_temperature_c": 66.0,
1728
+ "gpu_power_w": 176.663,
1729
+ "elapsed_seconds": 58.9897634999943
1730
+ },
1731
+ {
1732
+ "process_rss_mb": 3651.80078125,
1733
+ "cuda_allocated_mb": 140.751953125,
1734
+ "cuda_reserved_mb": 12124.0,
1735
+ "cuda_max_allocated_mb": 11120.271484375,
1736
+ "cuda_max_reserved_mb": 12124.0,
1737
+ "gpu_util_percent": 100.0,
1738
+ "gpu_memory_util_percent": 76.0,
1739
+ "gpu_memory_used_mb": 13350.20703125,
1740
+ "gpu_memory_total_mb": 16303.0,
1741
+ "gpu_temperature_c": 72.0,
1742
+ "gpu_power_w": 184.69,
1743
+ "elapsed_seconds": 59.49904029999743
1744
+ },
1745
+ {
1746
+ "process_rss_mb": 3651.80078125,
1747
+ "cuda_allocated_mb": 140.751953125,
1748
+ "cuda_reserved_mb": 12124.0,
1749
+ "cuda_max_allocated_mb": 11120.271484375,
1750
+ "cuda_max_reserved_mb": 12124.0,
1751
+ "gpu_util_percent": 64.0,
1752
+ "gpu_memory_util_percent": 50.0,
1753
+ "gpu_memory_used_mb": 13350.20703125,
1754
+ "gpu_memory_total_mb": 16303.0,
1755
+ "gpu_temperature_c": 66.0,
1756
+ "gpu_power_w": 216.346,
1757
+ "elapsed_seconds": 60.01004590000957
1758
+ },
1759
+ {
1760
+ "process_rss_mb": 3651.80078125,
1761
+ "cuda_allocated_mb": 140.751953125,
1762
+ "cuda_reserved_mb": 12124.0,
1763
+ "cuda_max_allocated_mb": 11120.271484375,
1764
+ "cuda_max_reserved_mb": 12124.0,
1765
+ "gpu_util_percent": 100.0,
1766
+ "gpu_memory_util_percent": 74.0,
1767
+ "gpu_memory_used_mb": 13350.20703125,
1768
+ "gpu_memory_total_mb": 16303.0,
1769
+ "gpu_temperature_c": 72.0,
1770
+ "gpu_power_w": 229.064,
1771
+ "elapsed_seconds": 60.51880980000715
1772
+ },
1773
+ {
1774
+ "process_rss_mb": 3651.80078125,
1775
+ "cuda_allocated_mb": 140.751953125,
1776
+ "cuda_reserved_mb": 12124.0,
1777
+ "cuda_max_allocated_mb": 11120.271484375,
1778
+ "cuda_max_reserved_mb": 12124.0,
1779
+ "gpu_util_percent": 71.0,
1780
+ "gpu_memory_util_percent": 55.0,
1781
+ "gpu_memory_used_mb": 13350.20703125,
1782
+ "gpu_memory_total_mb": 16303.0,
1783
+ "gpu_temperature_c": 69.0,
1784
+ "gpu_power_w": 228.047,
1785
+ "elapsed_seconds": 61.02798049998819
1786
+ },
1787
+ {
1788
+ "process_rss_mb": 3651.80078125,
1789
+ "cuda_allocated_mb": 140.751953125,
1790
+ "cuda_reserved_mb": 12124.0,
1791
+ "cuda_max_allocated_mb": 11120.271484375,
1792
+ "cuda_max_reserved_mb": 12124.0,
1793
+ "gpu_util_percent": 93.0,
1794
+ "gpu_memory_util_percent": 73.0,
1795
+ "gpu_memory_used_mb": 13350.20703125,
1796
+ "gpu_memory_total_mb": 16303.0,
1797
+ "gpu_temperature_c": 71.0,
1798
+ "gpu_power_w": 229.588,
1799
+ "elapsed_seconds": 61.54037430000608
1800
+ },
1801
+ {
1802
+ "process_rss_mb": 3651.80078125,
1803
+ "cuda_allocated_mb": 140.751953125,
1804
+ "cuda_reserved_mb": 12124.0,
1805
+ "cuda_max_allocated_mb": 11120.271484375,
1806
+ "cuda_max_reserved_mb": 12124.0,
1807
+ "gpu_util_percent": 66.0,
1808
+ "gpu_memory_util_percent": 47.0,
1809
+ "gpu_memory_used_mb": 13350.20703125,
1810
+ "gpu_memory_total_mb": 16303.0,
1811
+ "gpu_temperature_c": 73.0,
1812
+ "gpu_power_w": 225.498,
1813
+ "elapsed_seconds": 62.049058300006436
1814
+ },
1815
+ {
1816
+ "process_rss_mb": 3651.80078125,
1817
+ "cuda_allocated_mb": 140.751953125,
1818
+ "cuda_reserved_mb": 12124.0,
1819
+ "cuda_max_allocated_mb": 11120.271484375,
1820
+ "cuda_max_reserved_mb": 12124.0,
1821
+ "gpu_util_percent": 100.0,
1822
+ "gpu_memory_util_percent": 78.0,
1823
+ "gpu_memory_used_mb": 13350.20703125,
1824
+ "gpu_memory_total_mb": 16303.0,
1825
+ "gpu_temperature_c": 72.0,
1826
+ "gpu_power_w": 228.11,
1827
+ "elapsed_seconds": 62.55962849999196
1828
+ },
1829
+ {
1830
+ "process_rss_mb": 3651.80078125,
1831
+ "cuda_allocated_mb": 140.751953125,
1832
+ "cuda_reserved_mb": 12124.0,
1833
+ "cuda_max_allocated_mb": 11120.271484375,
1834
+ "cuda_max_reserved_mb": 12124.0,
1835
+ "gpu_util_percent": 66.0,
1836
+ "gpu_memory_util_percent": 49.0,
1837
+ "gpu_memory_used_mb": 13350.20703125,
1838
+ "gpu_memory_total_mb": 16303.0,
1839
+ "gpu_temperature_c": 70.0,
1840
+ "gpu_power_w": 222.692,
1841
+ "elapsed_seconds": 63.07071030000225
1842
+ },
1843
+ {
1844
+ "process_rss_mb": 3651.80078125,
1845
+ "cuda_allocated_mb": 824.71728515625,
1846
+ "cuda_reserved_mb": 12124.0,
1847
+ "cuda_max_allocated_mb": 11120.271484375,
1848
+ "cuda_max_reserved_mb": 12124.0,
1849
+ "gpu_util_percent": 100.0,
1850
+ "gpu_memory_util_percent": 77.0,
1851
+ "gpu_memory_used_mb": 13350.20703125,
1852
+ "gpu_memory_total_mb": 16303.0,
1853
+ "gpu_temperature_c": 73.0,
1854
+ "gpu_power_w": 228.831,
1855
+ "elapsed_seconds": 63.5797109999985
1856
+ },
1857
+ {
1858
+ "process_rss_mb": 3651.80078125,
1859
+ "cuda_allocated_mb": 140.751953125,
1860
+ "cuda_reserved_mb": 12124.0,
1861
+ "cuda_max_allocated_mb": 11120.271484375,
1862
+ "cuda_max_reserved_mb": 12124.0,
1863
+ "gpu_util_percent": 66.0,
1864
+ "gpu_memory_util_percent": 50.0,
1865
+ "gpu_memory_used_mb": 13350.20703125,
1866
+ "gpu_memory_total_mb": 16303.0,
1867
+ "gpu_temperature_c": 66.0,
1868
+ "gpu_power_w": 224.853,
1869
+ "elapsed_seconds": 64.08942380000371
1870
+ },
1871
+ {
1872
+ "process_rss_mb": 3659.08203125,
1873
+ "cuda_allocated_mb": 140.751953125,
1874
+ "cuda_reserved_mb": 12124.0,
1875
+ "cuda_max_allocated_mb": 11120.271484375,
1876
+ "cuda_max_reserved_mb": 12124.0,
1877
+ "gpu_util_percent": 2.0,
1878
+ "gpu_memory_util_percent": 2.0,
1879
+ "gpu_memory_used_mb": 13350.20703125,
1880
+ "gpu_memory_total_mb": 16303.0,
1881
+ "gpu_temperature_c": 63.0,
1882
+ "gpu_power_w": 205.274,
1883
+ "elapsed_seconds": 64.60033210000256
1884
+ },
1885
+ {
1886
+ "process_rss_mb": 3659.08203125,
1887
+ "cuda_allocated_mb": 8194.51708984375,
1888
+ "cuda_reserved_mb": 12124.0,
1889
+ "cuda_max_allocated_mb": 11120.271484375,
1890
+ "cuda_max_reserved_mb": 12124.0,
1891
+ "gpu_util_percent": 84.0,
1892
+ "gpu_memory_util_percent": 62.0,
1893
+ "gpu_memory_used_mb": 13350.20703125,
1894
+ "gpu_memory_total_mb": 16303.0,
1895
+ "gpu_temperature_c": 72.0,
1896
+ "gpu_power_w": 208.652,
1897
+ "elapsed_seconds": 65.11013029998867
1898
+ },
1899
+ {
1900
+ "process_rss_mb": 3659.08203125,
1901
+ "cuda_allocated_mb": 140.751953125,
1902
+ "cuda_reserved_mb": 12124.0,
1903
+ "cuda_max_allocated_mb": 11120.271484375,
1904
+ "cuda_max_reserved_mb": 12124.0,
1905
+ "gpu_util_percent": 95.0,
1906
+ "gpu_memory_util_percent": 74.0,
1907
+ "gpu_memory_used_mb": 13350.20703125,
1908
+ "gpu_memory_total_mb": 16303.0,
1909
+ "gpu_temperature_c": 73.0,
1910
+ "gpu_power_w": 215.071,
1911
+ "elapsed_seconds": 65.6213666999829
1912
+ },
1913
+ {
1914
+ "process_rss_mb": 3659.08203125,
1915
+ "cuda_allocated_mb": 4765.51025390625,
1916
+ "cuda_reserved_mb": 12124.0,
1917
+ "cuda_max_allocated_mb": 11120.271484375,
1918
+ "cuda_max_reserved_mb": 12124.0,
1919
+ "gpu_util_percent": 65.0,
1920
+ "gpu_memory_util_percent": 47.0,
1921
+ "gpu_memory_used_mb": 13350.20703125,
1922
+ "gpu_memory_total_mb": 16303.0,
1923
+ "gpu_temperature_c": 72.0,
1924
+ "gpu_power_w": 225.985,
1925
+ "elapsed_seconds": 66.13057750000735
1926
+ },
1927
+ {
1928
+ "process_rss_mb": 3659.08203125,
1929
+ "cuda_allocated_mb": 140.751953125,
1930
+ "cuda_reserved_mb": 12124.0,
1931
+ "cuda_max_allocated_mb": 11120.271484375,
1932
+ "cuda_max_reserved_mb": 12124.0,
1933
+ "gpu_util_percent": 100.0,
1934
+ "gpu_memory_util_percent": 78.0,
1935
+ "gpu_memory_used_mb": 13350.20703125,
1936
+ "gpu_memory_total_mb": 16303.0,
1937
+ "gpu_temperature_c": 72.0,
1938
+ "gpu_power_w": 227.795,
1939
+ "elapsed_seconds": 66.6385944999929
1940
+ },
1941
+ {
1942
+ "process_rss_mb": 3659.06640625,
1943
+ "cuda_allocated_mb": 1300.37890625,
1944
+ "cuda_reserved_mb": 12124.0,
1945
+ "cuda_max_allocated_mb": 11120.271484375,
1946
+ "cuda_max_reserved_mb": 12124.0,
1947
+ "gpu_util_percent": 65.0,
1948
+ "gpu_memory_util_percent": 49.0,
1949
+ "gpu_memory_used_mb": 13350.20703125,
1950
+ "gpu_memory_total_mb": 16303.0,
1951
+ "gpu_temperature_c": 71.0,
1952
+ "gpu_power_w": 224.744,
1953
+ "elapsed_seconds": 67.14924009999959
1954
+ },
1955
+ {
1956
+ "process_rss_mb": 3659.06640625,
1957
+ "cuda_allocated_mb": 140.751953125,
1958
+ "cuda_reserved_mb": 12124.0,
1959
+ "cuda_max_allocated_mb": 11120.271484375,
1960
+ "cuda_max_reserved_mb": 12124.0,
1961
+ "gpu_util_percent": 100.0,
1962
+ "gpu_memory_util_percent": 76.0,
1963
+ "gpu_memory_used_mb": 13350.20703125,
1964
+ "gpu_memory_total_mb": 16303.0,
1965
+ "gpu_temperature_c": 73.0,
1966
+ "gpu_power_w": 228.754,
1967
+ "elapsed_seconds": 67.65655809998862
1968
+ },
1969
+ {
1970
+ "process_rss_mb": 3659.06640625,
1971
+ "cuda_allocated_mb": 126.2216796875,
1972
+ "cuda_reserved_mb": 12124.0,
1973
+ "cuda_max_allocated_mb": 11120.271484375,
1974
+ "cuda_max_reserved_mb": 12124.0,
1975
+ "gpu_util_percent": 66.0,
1976
+ "gpu_memory_util_percent": 51.0,
1977
+ "gpu_memory_used_mb": 13350.20703125,
1978
+ "gpu_memory_total_mb": 16303.0,
1979
+ "gpu_temperature_c": 67.0,
1980
+ "gpu_power_w": 224.511,
1981
+ "elapsed_seconds": 68.16678259999026
1982
+ },
1983
+ {
1984
+ "process_rss_mb": 3659.06640625,
1985
+ "cuda_allocated_mb": 140.751953125,
1986
+ "cuda_reserved_mb": 12124.0,
1987
+ "cuda_max_allocated_mb": 11120.271484375,
1988
+ "cuda_max_reserved_mb": 12124.0,
1989
+ "gpu_util_percent": 100.0,
1990
+ "gpu_memory_util_percent": 74.0,
1991
+ "gpu_memory_used_mb": 13350.20703125,
1992
+ "gpu_memory_total_mb": 16303.0,
1993
+ "gpu_temperature_c": 73.0,
1994
+ "gpu_power_w": 225.465,
1995
+ "elapsed_seconds": 68.67621050000889
1996
+ },
1997
+ {
1998
+ "process_rss_mb": 3651.48046875,
1999
+ "cuda_allocated_mb": 140.751953125,
2000
+ "cuda_reserved_mb": 12124.0,
2001
+ "cuda_max_allocated_mb": 11120.271484375,
2002
+ "cuda_max_reserved_mb": 12124.0,
2003
+ "gpu_util_percent": 74.0,
2004
+ "gpu_memory_util_percent": 57.0,
2005
+ "gpu_memory_used_mb": 13350.20703125,
2006
+ "gpu_memory_total_mb": 16303.0,
2007
+ "gpu_temperature_c": 71.0,
2008
+ "gpu_power_w": 228.605,
2009
+ "elapsed_seconds": 69.18651979998685
2010
+ }
2011
+ ],
2012
+ "step_samples_per_second_avg": 8362.14873912102,
2013
+ "step_samples_per_second_max": 8602.940462013845,
2014
+ "step_samples_per_second_min": 7900.4246698690495,
2015
+ "step_tokens_per_second_avg": 1070355.0386074905,
2016
+ "step_tokens_per_second_max": 1101176.3791377721,
2017
+ "step_tokens_per_second_min": 1011254.3577432383,
2018
+ "step_process_rss_mb_avg": 3626.9251302083335,
2019
+ "step_process_rss_mb_max": 3651.80078125,
2020
+ "step_process_rss_mb_min": 3596.62890625,
2021
+ "step_cuda_max_allocated_mb_avg": 11120.271484375,
2022
+ "step_cuda_max_allocated_mb_max": 11120.271484375,
2023
+ "step_cuda_max_allocated_mb_min": 11120.271484375,
2024
+ "step_gpu_util_percent_avg": 70.5,
2025
+ "step_gpu_util_percent_max": 100.0,
2026
+ "step_gpu_util_percent_min": 63.0,
2027
+ "step_gpu_memory_util_percent_avg": 53.5,
2028
+ "step_gpu_memory_util_percent_max": 77.0,
2029
+ "step_gpu_memory_util_percent_min": 48.0,
2030
+ "step_gpu_power_w_avg": 220.1005,
2031
+ "step_gpu_power_w_max": 224.853,
2032
+ "step_gpu_power_w_min": 214.297,
2033
+ "step_gpu_temperature_c_avg": 63.5,
2034
+ "step_gpu_temperature_c_max": 68.0,
2035
+ "step_gpu_temperature_c_min": 57.0,
2036
+ "background_process_rss_mb_avg": 3625.386863425926,
2037
+ "background_process_rss_mb_max": 3659.08203125,
2038
+ "background_process_rss_mb_min": 3310.83203125,
2039
+ "background_cuda_max_allocated_mb_avg": 11119.763834635416,
2040
+ "background_cuda_max_allocated_mb_max": 11120.271484375,
2041
+ "background_cuda_max_allocated_mb_min": 11051.73876953125,
2042
+ "background_gpu_util_percent_avg": 78.32592592592593,
2043
+ "background_gpu_util_percent_max": 100.0,
2044
+ "background_gpu_util_percent_min": 0.0,
2045
+ "background_gpu_memory_util_percent_avg": 59.385185185185186,
2046
+ "background_gpu_memory_util_percent_max": 79.0,
2047
+ "background_gpu_memory_util_percent_min": 2.0,
2048
+ "background_gpu_power_w_avg": 214.2482,
2049
+ "background_gpu_power_w_max": 229.588,
2050
+ "background_gpu_power_w_min": 57.852,
2051
+ "background_gpu_temperature_c_avg": 65.91111111111111,
2052
+ "background_gpu_temperature_c_max": 73.0,
2053
+ "background_gpu_temperature_c_min": 51.0,
2054
+ "samples_per_second_avg": 8362.14873912102,
2055
+ "samples_per_second_max": 8602.940462013845,
2056
+ "tokens_per_second_avg": 1070355.0386074905,
2057
+ "tokens_per_second_max": 1101176.3791377721,
2058
+ "process_rss_mb_avg": 3626.9251302083335,
2059
+ "process_rss_mb_max": 3651.80078125,
2060
+ "cuda_max_allocated_mb_avg": 11120.271484375,
2061
+ "cuda_max_allocated_mb_max": 11120.271484375,
2062
+ "gpu_util_percent_avg": 70.5,
2063
+ "gpu_util_percent_max": 100.0,
2064
+ "gpu_memory_util_percent_avg": 53.5,
2065
+ "gpu_memory_util_percent_max": 77.0,
2066
+ "gpu_power_w_avg": 220.1005,
2067
+ "gpu_power_w_max": 224.853,
2068
+ "gpu_temperature_c_avg": 63.5,
2069
+ "gpu_temperature_c_max": 68.0
2070
+ }
reports/run_metadata.json CHANGED
@@ -1,23 +1,58 @@
1
  {
2
- "experiment_name": "dmhy-char-thin-hardfocus",
3
- "data_file": "data/thin_hard_focus_char.jsonl",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  "tokenizer_variant": "char",
5
- "vocab_file": "datasets/AnimeName/vocab.char.json",
6
  "vocab_size": 6199,
7
  "max_seq_length": 128,
8
  "hidden_size": 256,
9
  "num_hidden_layers": 4,
10
  "num_attention_heads": 8,
11
  "intermediate_size": 1024,
12
- "train_samples": 117089,
13
- "eval_samples": 6163,
 
 
14
  "epochs": 2.0,
15
- "batch_size": 256,
16
- "learning_rate": 4e-05,
17
- "warmup_steps": 80,
18
- "seed": 58,
 
19
  "device": "cuda",
20
- "fp16": true,
21
  "gradient_accumulation_steps": 1,
22
- "dataloader_num_workers": 4
 
 
 
 
 
 
 
 
 
 
 
23
  }
 
1
  {
2
+ "experiment_name": "dmhy-char-aug-fragments-10epoch-hardfocus",
3
+ "data_file": "data/generated/focus_after_10epoch_char.jsonl",
4
+ "data_sources": [
5
+ {
6
+ "role": "primary",
7
+ "path": "data/generated/focus_after_10epoch_char.jsonl",
8
+ "samples": 196132,
9
+ "repeat": 1,
10
+ "effective_samples": 196132
11
+ }
12
+ ],
13
+ "augmentation": {
14
+ "partial_requested": 30000,
15
+ "partial_written": 27959,
16
+ "permutation_requested": 60000,
17
+ "permutation_written": 60000,
18
+ "special_requested": 20000,
19
+ "special_written": 20000,
20
+ "max_chars": 160
21
+ },
22
+ "dataset_mode": "encoded",
23
+ "apply_label_repairs": false,
24
+ "keep_raw_dataset": false,
25
  "tokenizer_variant": "char",
26
+ "vocab_file": "vocab.json",
27
  "vocab_size": 6199,
28
  "max_seq_length": 128,
29
  "hidden_size": 256,
30
  "num_hidden_layers": 4,
31
  "num_attention_heads": 8,
32
  "intermediate_size": 1024,
33
+ "train_samples": 288886,
34
+ "eval_samples": 15205,
35
+ "load_seconds": 28.198466799978632,
36
+ "encode_seconds": 21.198125199996866,
37
  "epochs": 2.0,
38
+ "max_steps": -1,
39
+ "batch_size": 1792,
40
+ "learning_rate": 8e-06,
41
+ "warmup_steps": 50,
42
+ "seed": 107,
43
  "device": "cuda",
44
+ "fp16": false,
45
  "gradient_accumulation_steps": 1,
46
+ "dataloader_num_workers": 0,
47
+ "dataloader_prefetch_factor": null,
48
+ "dataloader_persistent_workers": false,
49
+ "dataloader_pin_memory": true,
50
+ "encoded_dataset_device": "cpu",
51
+ "mixed_precision": "bf16",
52
+ "tf32": true,
53
+ "torch_compile": false,
54
+ "auto_find_batch_size": false,
55
+ "perf_log_steps": 50,
56
+ "perf_sample_interval": 0.5,
57
+ "periodic_eval": false
58
  }
reports/trainer_eval_metrics.json CHANGED
@@ -1,11 +1,12 @@
1
  {
2
- "eval_loss": 0.001824101316742599,
3
- "eval_precision": 0.996635213225075,
4
- "eval_recall": 0.9977786457061953,
5
- "eval_f1": 0.9972066016906769,
6
- "eval_accuracy": 0.9994733938512463,
7
- "eval_runtime": 30.171,
8
- "eval_samples_per_second": 204.269,
9
- "eval_steps_per_second": 0.829,
10
- "epoch": 2.0
 
11
  }
 
1
  {
2
+ "eval_loss": 0.014898430556058884,
3
+ "eval_precision": 0.9817063636837442,
4
+ "eval_recall": 0.9877553160806524,
5
+ "eval_f1": 0.9847215505861748,
6
+ "eval_accuracy": 0.9961717168124339,
7
+ "eval_runtime": 7.2816,
8
+ "eval_samples_per_second": 2088.154,
9
+ "eval_steps_per_second": 1.236,
10
+ "epoch": 2.0,
11
+ "num_input_tokens_seen": 73954816.0
12
  }
reports/training_lineage.json CHANGED
@@ -4,51 +4,77 @@
4
  "summary_zh": "当前发布 checkpoint 是两阶段产物:先在 dmhy_weak_char.jsonl 上做全量 CUDA 微调,再做薄层运行时困难样本微调。",
5
  "stages": [
6
  {
7
- "name": "dmhy-char-thin-gpu",
8
- "type": "full_dataset_finetune",
9
  "machine": "adqew@192.168.63.157",
10
  "data_file": "datasets/AnimeName/dmhy_weak_char.jsonl",
11
  "tokenizer_variant": "char",
12
  "vocab_file": "datasets/AnimeName/vocab.char.json",
13
  "vocab_size": 6199,
14
  "max_seq_length": 128,
15
- "train_samples": 619361,
16
- "eval_samples": 12641,
17
- "epochs": 2.0,
18
- "batch_size": 256,
19
- "learning_rate": 0.00006,
20
- "warmup_steps": 300,
21
- "seed": 55,
22
  "device": "cuda",
23
- "fp16": true,
24
- "eval_f1": 0.9962419041019217,
25
- "eval_accuracy": 0.9991988685517916,
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  "role": "Base checkpoint for the final hard-case focus stage."
27
  },
28
  {
29
- "name": "dmhy-char-thin-hardfocus",
30
  "type": "hard_case_focus_finetune",
31
  "machine": "adqew@192.168.63.157",
32
- "data_file": "data/thin_hard_focus_char.jsonl",
33
  "tokenizer_variant": "char",
34
  "vocab_file": "datasets/AnimeName/vocab.char.json",
35
  "vocab_size": 6199,
36
  "max_seq_length": 128,
37
- "train_samples": 117089,
38
- "eval_samples": 6163,
39
  "epochs": 2.0,
40
- "batch_size": 256,
41
- "learning_rate": 0.00004,
42
- "warmup_steps": 80,
43
- "seed": 58,
44
  "device": "cuda",
45
- "fp16": true,
46
- "eval_f1": 0.9972066016906769,
47
- "eval_accuracy": 0.9994733938512463,
 
 
 
 
 
 
 
 
 
48
  "fixed_regression_model_only": "25/26",
49
  "fixed_regression_normalized_only": "26/26",
50
- "heldout_model_only": "1014/1024",
51
- "heldout_normalized_only": "1017/1024",
 
 
 
 
52
  "role": "Published repository-root checkpoint."
53
  }
54
  ]
 
4
  "summary_zh": "当前发布 checkpoint 是两阶段产物:先在 dmhy_weak_char.jsonl 上做全量 CUDA 微调,再做薄层运行时困难样本微调。",
5
  "stages": [
6
  {
7
+ "name": "dmhy-char-aug-fragments-optimized-10epoch",
8
+ "type": "full_dataset_finetune_with_dynamic_augmentation",
9
  "machine": "adqew@192.168.63.157",
10
  "data_file": "datasets/AnimeName/dmhy_weak_char.jsonl",
11
  "tokenizer_variant": "char",
12
  "vocab_file": "datasets/AnimeName/vocab.char.json",
13
  "vocab_size": 6199,
14
  "max_seq_length": 128,
15
+ "train_samples": 1168468,
16
+ "eval_samples": 23847,
17
+ "epochs": 10.0,
18
+ "batch_size": 1792,
19
+ "learning_rate": 0.00002,
20
+ "warmup_steps": 500,
21
+ "seed": 105,
22
  "device": "cuda",
23
+ "bf16": true,
24
+ "augmentation": {
25
+ "partial_requested": 200000,
26
+ "partial_written": 80313,
27
+ "permutation_requested": 400000,
28
+ "permutation_written": 400000,
29
+ "special_requested": 80000,
30
+ "special_written": 80000,
31
+ "max_chars": 160
32
+ },
33
+ "eval_f1": 0.9758312981401465,
34
+ "eval_accuracy": 0.9934884485890851,
35
+ "fixed_regression_model_only": "21/26",
36
+ "fixed_regression_normalized_only": "24/26",
37
+ "heldout_model_only": "1952/2048",
38
+ "heldout_normalized_only": "1976/2048",
39
  "role": "Base checkpoint for the final hard-case focus stage."
40
  },
41
  {
42
+ "name": "dmhy-char-aug-fragments-10epoch-hardfocus",
43
  "type": "hard_case_focus_finetune",
44
  "machine": "adqew@192.168.63.157",
45
+ "data_file": "data/generated/focus_after_10epoch_char.jsonl",
46
  "tokenizer_variant": "char",
47
  "vocab_file": "datasets/AnimeName/vocab.char.json",
48
  "vocab_size": 6199,
49
  "max_seq_length": 128,
50
+ "train_samples": 288886,
51
+ "eval_samples": 15205,
52
  "epochs": 2.0,
53
+ "batch_size": 1792,
54
+ "learning_rate": 0.000008,
55
+ "warmup_steps": 50,
56
+ "seed": 107,
57
  "device": "cuda",
58
+ "bf16": true,
59
+ "augmentation": {
60
+ "partial_requested": 30000,
61
+ "partial_written": 27959,
62
+ "permutation_requested": 60000,
63
+ "permutation_written": 60000,
64
+ "special_requested": 20000,
65
+ "special_written": 20000,
66
+ "max_chars": 160
67
+ },
68
+ "eval_f1": 0.9847215505861748,
69
+ "eval_accuracy": 0.9961717168124339,
70
  "fixed_regression_model_only": "25/26",
71
  "fixed_regression_normalized_only": "26/26",
72
+ "heldout_model_only": "1947/2048",
73
+ "heldout_normalized_only": "1966/2048",
74
+ "perf_tokens_per_second_avg": 1070355.0386074905,
75
+ "perf_tokens_per_second_max": 1101176.3791377721,
76
+ "perf_gpu_util_avg": 78.32592592592593,
77
+ "perf_gpu_util_max": 100.0,
78
  "role": "Published repository-root checkpoint."
79
  }
80
  ]
training_args.bin CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:d04646d7f2d38f632195034cf95c225cde16df9933d0fc48ecbdf375ab0e05b3
3
- size 5265
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7d63537ca05eba3f844cc92336013aea5363ab8ba9576f63d50bceda924b5075
3
+ size 5329