初始化项目,由ModelHub XC社区提供模型
Model: israel/AfriqueQwen-14B-multiturn_1 Source: Original Platform
This commit is contained in:
36
.gitattributes
vendored
Normal file
36
.gitattributes
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||
*.arrow filter=lfs diff=lfs merge=lfs -text
|
||||
*.bin filter=lfs diff=lfs merge=lfs -text
|
||||
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
||||
*.ftz filter=lfs diff=lfs merge=lfs -text
|
||||
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||
*.h5 filter=lfs diff=lfs merge=lfs -text
|
||||
*.joblib filter=lfs diff=lfs merge=lfs -text
|
||||
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
||||
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
||||
*.model filter=lfs diff=lfs merge=lfs -text
|
||||
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
||||
*.npy filter=lfs diff=lfs merge=lfs -text
|
||||
*.npz filter=lfs diff=lfs merge=lfs -text
|
||||
*.onnx filter=lfs diff=lfs merge=lfs -text
|
||||
*.ot filter=lfs diff=lfs merge=lfs -text
|
||||
*.parquet filter=lfs diff=lfs merge=lfs -text
|
||||
*.pb filter=lfs diff=lfs merge=lfs -text
|
||||
*.pickle filter=lfs diff=lfs merge=lfs -text
|
||||
*.pkl filter=lfs diff=lfs merge=lfs -text
|
||||
*.pt filter=lfs diff=lfs merge=lfs -text
|
||||
*.pth filter=lfs diff=lfs merge=lfs -text
|
||||
*.rar filter=lfs diff=lfs merge=lfs -text
|
||||
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
||||
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
||||
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
||||
*.tar filter=lfs diff=lfs merge=lfs -text
|
||||
*.tflite filter=lfs diff=lfs merge=lfs -text
|
||||
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||
*.wasm filter=lfs diff=lfs merge=lfs -text
|
||||
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||
*.zst filter=lfs diff=lfs merge=lfs -text
|
||||
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
||||
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
||||
61
README.md
Normal file
61
README.md
Normal file
@@ -0,0 +1,61 @@
|
||||
---
|
||||
library_name: transformers
|
||||
license: other
|
||||
base_model: McGill-NLP/AfriqueQwen-14B
|
||||
tags:
|
||||
- llama-factory
|
||||
- full
|
||||
- generated_from_trainer
|
||||
model-index:
|
||||
- name: AfriqueQwen-14B-multiturn_1
|
||||
results: []
|
||||
---
|
||||
|
||||
<!-- This model card has been generated automatically according to the information the Trainer had access to. You
|
||||
should probably proofread and complete it, then remove this comment. -->
|
||||
|
||||
# AfriqueQwen-14B-multiturn_1
|
||||
|
||||
This model is a fine-tuned version of [McGill-NLP/AfriqueQwen-14B](https://huggingface.co/McGill-NLP/AfriqueQwen-14B) on the afri_multiturn_1 dataset.
|
||||
|
||||
## Model description
|
||||
|
||||
More information needed
|
||||
|
||||
## Intended uses & limitations
|
||||
|
||||
More information needed
|
||||
|
||||
## Training and evaluation data
|
||||
|
||||
More information needed
|
||||
|
||||
## Training procedure
|
||||
|
||||
### Training hyperparameters
|
||||
|
||||
The following hyperparameters were used during training:
|
||||
- learning_rate: 1e-05
|
||||
- train_batch_size: 1
|
||||
- eval_batch_size: 8
|
||||
- seed: 42
|
||||
- distributed_type: multi-GPU
|
||||
- num_devices: 4
|
||||
- gradient_accumulation_steps: 2
|
||||
- total_train_batch_size: 8
|
||||
- total_eval_batch_size: 32
|
||||
- optimizer: Use OptimizerNames.ADAMW_TORCH_FUSED with betas=(0.9,0.999) and epsilon=1e-08 and optimizer_args=No additional optimizer arguments
|
||||
- lr_scheduler_type: cosine
|
||||
- lr_scheduler_warmup_steps: 0.1
|
||||
- num_epochs: 5.0
|
||||
|
||||
### Training results
|
||||
|
||||
|
||||
|
||||
### Framework versions
|
||||
|
||||
- Transformers 5.2.0
|
||||
- Pytorch 2.10.0+cu128
|
||||
- Datasets 4.0.0
|
||||
- Tokenizers 0.22.2
|
||||
8
all_results.json
Normal file
8
all_results.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"epoch": 5.0,
|
||||
"total_flos": 481722301939712.0,
|
||||
"train_loss": 0.401988563902201,
|
||||
"train_runtime": 92209.7944,
|
||||
"train_samples_per_second": 2.973,
|
||||
"train_steps_per_second": 0.372
|
||||
}
|
||||
85
chat_template.jinja
Normal file
85
chat_template.jinja
Normal file
@@ -0,0 +1,85 @@
|
||||
{%- if tools %}
|
||||
{{- '<|im_start|>system\n' }}
|
||||
{%- if messages[0].role == 'system' %}
|
||||
{{- messages[0].content + '\n\n' }}
|
||||
{%- endif %}
|
||||
{{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>" }}
|
||||
{%- for tool in tools %}
|
||||
{{- "\n" }}
|
||||
{{- tool | tojson }}
|
||||
{%- endfor %}
|
||||
{{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|im_end|>\n" }}
|
||||
{%- else %}
|
||||
{%- if messages[0].role == 'system' %}
|
||||
{{- '<|im_start|>system\n' + messages[0].content + '<|im_end|>\n' }}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}
|
||||
{%- for message in messages[::-1] %}
|
||||
{%- set index = (messages|length - 1) - loop.index0 %}
|
||||
{%- if ns.multi_step_tool and message.role == "user" and not(message.content.startswith('<tool_response>') and message.content.endswith('</tool_response>')) %}
|
||||
{%- set ns.multi_step_tool = false %}
|
||||
{%- set ns.last_query_index = index %}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{%- for message in messages %}
|
||||
{%- if (message.role == "user") or (message.role == "system" and not loop.first) %}
|
||||
{{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }}
|
||||
{%- elif message.role == "assistant" %}
|
||||
{%- set content = message.content %}
|
||||
{%- set reasoning_content = '' %}
|
||||
{%- if message.reasoning_content is defined and message.reasoning_content is not none %}
|
||||
{%- set reasoning_content = message.reasoning_content %}
|
||||
{%- else %}
|
||||
{%- if '</think>' in message.content %}
|
||||
{%- set content = message.content.split('</think>')[-1].lstrip('\n') %}
|
||||
{%- set reasoning_content = message.content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- if loop.index0 > ns.last_query_index %}
|
||||
{%- if loop.last or (not loop.last and reasoning_content) %}
|
||||
{{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content.strip('\n') + '\n</think>\n\n' + content.lstrip('\n') }}
|
||||
{%- else %}
|
||||
{{- '<|im_start|>' + message.role + '\n' + content }}
|
||||
{%- endif %}
|
||||
{%- else %}
|
||||
{{- '<|im_start|>' + message.role + '\n' + content }}
|
||||
{%- endif %}
|
||||
{%- if message.tool_calls %}
|
||||
{%- for tool_call in message.tool_calls %}
|
||||
{%- if (loop.first and content) or (not loop.first) %}
|
||||
{{- '\n' }}
|
||||
{%- endif %}
|
||||
{%- if tool_call.function %}
|
||||
{%- set tool_call = tool_call.function %}
|
||||
{%- endif %}
|
||||
{{- '<tool_call>\n{"name": "' }}
|
||||
{{- tool_call.name }}
|
||||
{{- '", "arguments": ' }}
|
||||
{%- if tool_call.arguments is string %}
|
||||
{{- tool_call.arguments }}
|
||||
{%- else %}
|
||||
{{- tool_call.arguments | tojson }}
|
||||
{%- endif %}
|
||||
{{- '}\n</tool_call>' }}
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
{{- '<|im_end|>\n' }}
|
||||
{%- elif message.role == "tool" %}
|
||||
{%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}
|
||||
{{- '<|im_start|>user' }}
|
||||
{%- endif %}
|
||||
{{- '\n<tool_response>\n' }}
|
||||
{{- message.content }}
|
||||
{{- '\n</tool_response>' }}
|
||||
{%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}
|
||||
{{- '<|im_end|>\n' }}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{%- if add_generation_prompt %}
|
||||
{{- '<|im_start|>assistant\n' }}
|
||||
{%- if enable_thinking is defined and enable_thinking is false %}
|
||||
{{- '<think>\n\n</think>\n\n' }}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
85
checkpoint-34265/chat_template.jinja
Normal file
85
checkpoint-34265/chat_template.jinja
Normal file
@@ -0,0 +1,85 @@
|
||||
{%- if tools %}
|
||||
{{- '<|im_start|>system\n' }}
|
||||
{%- if messages[0].role == 'system' %}
|
||||
{{- messages[0].content + '\n\n' }}
|
||||
{%- endif %}
|
||||
{{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>" }}
|
||||
{%- for tool in tools %}
|
||||
{{- "\n" }}
|
||||
{{- tool | tojson }}
|
||||
{%- endfor %}
|
||||
{{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|im_end|>\n" }}
|
||||
{%- else %}
|
||||
{%- if messages[0].role == 'system' %}
|
||||
{{- '<|im_start|>system\n' + messages[0].content + '<|im_end|>\n' }}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}
|
||||
{%- for message in messages[::-1] %}
|
||||
{%- set index = (messages|length - 1) - loop.index0 %}
|
||||
{%- if ns.multi_step_tool and message.role == "user" and not(message.content.startswith('<tool_response>') and message.content.endswith('</tool_response>')) %}
|
||||
{%- set ns.multi_step_tool = false %}
|
||||
{%- set ns.last_query_index = index %}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{%- for message in messages %}
|
||||
{%- if (message.role == "user") or (message.role == "system" and not loop.first) %}
|
||||
{{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }}
|
||||
{%- elif message.role == "assistant" %}
|
||||
{%- set content = message.content %}
|
||||
{%- set reasoning_content = '' %}
|
||||
{%- if message.reasoning_content is defined and message.reasoning_content is not none %}
|
||||
{%- set reasoning_content = message.reasoning_content %}
|
||||
{%- else %}
|
||||
{%- if '</think>' in message.content %}
|
||||
{%- set content = message.content.split('</think>')[-1].lstrip('\n') %}
|
||||
{%- set reasoning_content = message.content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- if loop.index0 > ns.last_query_index %}
|
||||
{%- if loop.last or (not loop.last and reasoning_content) %}
|
||||
{{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content.strip('\n') + '\n</think>\n\n' + content.lstrip('\n') }}
|
||||
{%- else %}
|
||||
{{- '<|im_start|>' + message.role + '\n' + content }}
|
||||
{%- endif %}
|
||||
{%- else %}
|
||||
{{- '<|im_start|>' + message.role + '\n' + content }}
|
||||
{%- endif %}
|
||||
{%- if message.tool_calls %}
|
||||
{%- for tool_call in message.tool_calls %}
|
||||
{%- if (loop.first and content) or (not loop.first) %}
|
||||
{{- '\n' }}
|
||||
{%- endif %}
|
||||
{%- if tool_call.function %}
|
||||
{%- set tool_call = tool_call.function %}
|
||||
{%- endif %}
|
||||
{{- '<tool_call>\n{"name": "' }}
|
||||
{{- tool_call.name }}
|
||||
{{- '", "arguments": ' }}
|
||||
{%- if tool_call.arguments is string %}
|
||||
{{- tool_call.arguments }}
|
||||
{%- else %}
|
||||
{{- tool_call.arguments | tojson }}
|
||||
{%- endif %}
|
||||
{{- '}\n</tool_call>' }}
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
{{- '<|im_end|>\n' }}
|
||||
{%- elif message.role == "tool" %}
|
||||
{%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}
|
||||
{{- '<|im_start|>user' }}
|
||||
{%- endif %}
|
||||
{{- '\n<tool_response>\n' }}
|
||||
{{- message.content }}
|
||||
{{- '\n</tool_response>' }}
|
||||
{%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}
|
||||
{{- '<|im_end|>\n' }}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{%- if add_generation_prompt %}
|
||||
{{- '<|im_start|>assistant\n' }}
|
||||
{%- if enable_thinking is defined and enable_thinking is false %}
|
||||
{{- '<think>\n\n</think>\n\n' }}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
75
checkpoint-34265/config.json
Normal file
75
checkpoint-34265/config.json
Normal file
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"architectures": [
|
||||
"Qwen3ForCausalLM"
|
||||
],
|
||||
"attention_bias": false,
|
||||
"attention_dropout": 0.0,
|
||||
"bos_token_id": null,
|
||||
"dtype": "bfloat16",
|
||||
"eos_token_id": 151645,
|
||||
"head_dim": 128,
|
||||
"hidden_act": "silu",
|
||||
"hidden_size": 5120,
|
||||
"initializer_range": 0.02,
|
||||
"intermediate_size": 17408,
|
||||
"layer_types": [
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention"
|
||||
],
|
||||
"max_position_embeddings": 32768,
|
||||
"max_window_layers": 40,
|
||||
"model_type": "qwen3",
|
||||
"num_attention_heads": 40,
|
||||
"num_hidden_layers": 40,
|
||||
"num_key_value_heads": 8,
|
||||
"pad_token_id": 151643,
|
||||
"rms_norm_eps": 1e-06,
|
||||
"rope_parameters": {
|
||||
"rope_theta": 1000000,
|
||||
"rope_type": "default"
|
||||
},
|
||||
"sliding_window": null,
|
||||
"tie_word_embeddings": false,
|
||||
"transformers_version": "5.2.0",
|
||||
"use_cache": false,
|
||||
"use_sliding_window": false,
|
||||
"vocab_size": 151936
|
||||
}
|
||||
9
checkpoint-34265/generation_config.json
Normal file
9
checkpoint-34265/generation_config.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"_from_model_config": true,
|
||||
"eos_token_id": [
|
||||
151645,
|
||||
151643
|
||||
],
|
||||
"pad_token_id": 151643,
|
||||
"transformers_version": "5.2.0"
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0bd50d884195d5a02ea5f502a46785abfabd5b1cf47691bc32ccc118d9f4a97e
|
||||
size 44304931131
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4ccd58cb4194e2cf5cf6e1f0a50cbb3e468a2684f9038c240b2a1b3f03ce6e89
|
||||
size 44304931131
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:53b3d5120bd406c8d013b1b00bfbdb667f1ab91aab4a38e481cb6c4dacb00f24
|
||||
size 44304931131
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:22ae7249ce9ebb4f522b9ae323e6e49485156009bdf4a90e9b05200f536fbc5a
|
||||
size 44304931131
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e1a3c69cfa37a40b0012e147f818a20bba4e813563dcb10517df264e6ac3fd6d
|
||||
size 225000
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:9cffa6c83b5cded0b3b59efa268b1d445f3829531df00a4cdb7dea63ae97a23f
|
||||
size 225000
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0552dc1cd3d4a9a9a2a347b48ee4bbc750221f4c507ef4097a4435b8648e4c2a
|
||||
size 225000
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4ac7747d1566dd8677b2c5c41dfa9db4108c7f06a37b76ea63f8e7e651f53763
|
||||
size 225000
|
||||
1
checkpoint-34265/latest
Normal file
1
checkpoint-34265/latest
Normal file
@@ -0,0 +1 @@
|
||||
global_step34265
|
||||
3
checkpoint-34265/model.safetensors
Normal file
3
checkpoint-34265/model.safetensors
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1ca62e96fb25ec28dd201b6314f4ce7ee390c52f386feb103ec06cd666f0fc22
|
||||
size 29536666272
|
||||
3
checkpoint-34265/rng_state_0.pth
Normal file
3
checkpoint-34265/rng_state_0.pth
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:81d5f83aeb4b3f559bd28377336d47659b320e7f6ef2e5a723d284716278a151
|
||||
size 15429
|
||||
3
checkpoint-34265/rng_state_1.pth
Normal file
3
checkpoint-34265/rng_state_1.pth
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2626437dcb133ffcf003ac89603f8cce07459b93a98d760cd9419e0d6a994067
|
||||
size 15429
|
||||
3
checkpoint-34265/rng_state_2.pth
Normal file
3
checkpoint-34265/rng_state_2.pth
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ae777e24d50cb7159634e1245f0697ba0fc64d5b26d535f2c80e411371a90b1c
|
||||
size 15429
|
||||
3
checkpoint-34265/rng_state_3.pth
Normal file
3
checkpoint-34265/rng_state_3.pth
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:afc5a67564eebcfc961e8f1406a7418cc73497c2935a39af0232ef59f8153a6a
|
||||
size 15429
|
||||
3
checkpoint-34265/scheduler.pt
Normal file
3
checkpoint-34265/scheduler.pt
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c94495b2fdaa190f2f28183e73d97cd217405437055caeb77964e4120313faee
|
||||
size 1465
|
||||
3
checkpoint-34265/tokenizer.json
Normal file
3
checkpoint-34265/tokenizer.json
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:be75606093db2094d7cd20f3c2f385c212750648bd6ea4fb2bf507a6a4c55506
|
||||
size 11422650
|
||||
15
checkpoint-34265/tokenizer_config.json
Normal file
15
checkpoint-34265/tokenizer_config.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"add_prefix_space": false,
|
||||
"backend": "tokenizers",
|
||||
"bos_token": null,
|
||||
"clean_up_tokenization_spaces": false,
|
||||
"eos_token": "<|im_end|>",
|
||||
"errors": "replace",
|
||||
"is_local": false,
|
||||
"model_max_length": 131072,
|
||||
"pad_token": "<|endoftext|>",
|
||||
"padding_side": "right",
|
||||
"split_special_tokens": false,
|
||||
"tokenizer_class": "Qwen2Tokenizer",
|
||||
"unk_token": null
|
||||
}
|
||||
272
checkpoint-34265/trainer_state.json
Normal file
272
checkpoint-34265/trainer_state.json
Normal file
@@ -0,0 +1,272 @@
|
||||
{
|
||||
"best_global_step": null,
|
||||
"best_metric": null,
|
||||
"best_model_checkpoint": null,
|
||||
"epoch": 5.0,
|
||||
"eval_steps": 500,
|
||||
"global_step": 34265,
|
||||
"is_hyper_param_search": false,
|
||||
"is_local_process_zero": true,
|
||||
"is_world_process_zero": true,
|
||||
"log_history": [
|
||||
{
|
||||
"epoch": 0.1459321415541773,
|
||||
"grad_norm": 3.8735740724697223,
|
||||
"learning_rate": 2.915086081120514e-06,
|
||||
"loss": 1.154789306640625,
|
||||
"step": 1000
|
||||
},
|
||||
{
|
||||
"epoch": 0.2918642831083546,
|
||||
"grad_norm": 3.513073777315236,
|
||||
"learning_rate": 5.833090166326233e-06,
|
||||
"loss": 0.9386199340820313,
|
||||
"step": 2000
|
||||
},
|
||||
{
|
||||
"epoch": 0.43779642466253194,
|
||||
"grad_norm": 2.667804789171682,
|
||||
"learning_rate": 8.751094251531953e-06,
|
||||
"loss": 0.8885218505859375,
|
||||
"step": 3000
|
||||
},
|
||||
{
|
||||
"epoch": 0.5837285662167092,
|
||||
"grad_norm": 1.8311641416860456,
|
||||
"learning_rate": 9.991513345767592e-06,
|
||||
"loss": 0.8694163208007812,
|
||||
"step": 4000
|
||||
},
|
||||
{
|
||||
"epoch": 0.7296607077708865,
|
||||
"grad_norm": 2.250397237666049,
|
||||
"learning_rate": 9.936020028278053e-06,
|
||||
"loss": 0.85284765625,
|
||||
"step": 5000
|
||||
},
|
||||
{
|
||||
"epoch": 0.8755928493250639,
|
||||
"grad_norm": 2.6756387164181197,
|
||||
"learning_rate": 9.829343371836088e-06,
|
||||
"loss": 0.821312744140625,
|
||||
"step": 6000
|
||||
},
|
||||
{
|
||||
"epoch": 1.021452024808464,
|
||||
"grad_norm": 2.6729990910245593,
|
||||
"learning_rate": 9.672589544454328e-06,
|
||||
"loss": 0.7774617919921875,
|
||||
"step": 7000
|
||||
},
|
||||
{
|
||||
"epoch": 1.1673841663626414,
|
||||
"grad_norm": 2.642277321184833,
|
||||
"learning_rate": 9.46738398205746e-06,
|
||||
"loss": 0.608907958984375,
|
||||
"step": 8000
|
||||
},
|
||||
{
|
||||
"epoch": 1.3133163079168186,
|
||||
"grad_norm": 2.1544218289818913,
|
||||
"learning_rate": 9.215854533761766e-06,
|
||||
"loss": 0.6088528442382812,
|
||||
"step": 9000
|
||||
},
|
||||
{
|
||||
"epoch": 1.459248449470996,
|
||||
"grad_norm": 2.3990917619771497,
|
||||
"learning_rate": 8.920609397454381e-06,
|
||||
"loss": 0.6051533203125,
|
||||
"step": 10000
|
||||
},
|
||||
{
|
||||
"epoch": 1.6051805910251733,
|
||||
"grad_norm": 2.5614175915079387,
|
||||
"learning_rate": 8.584710074466158e-06,
|
||||
"loss": 0.6031138916015625,
|
||||
"step": 11000
|
||||
},
|
||||
{
|
||||
"epoch": 1.7511127325793505,
|
||||
"grad_norm": 1.5472599757402412,
|
||||
"learning_rate": 8.211639623780629e-06,
|
||||
"loss": 0.6085886840820313,
|
||||
"step": 12000
|
||||
},
|
||||
{
|
||||
"epoch": 1.897044874133528,
|
||||
"grad_norm": 2.384688518854998,
|
||||
"learning_rate": 7.805266544962458e-06,
|
||||
"loss": 0.6080531616210938,
|
||||
"step": 13000
|
||||
},
|
||||
{
|
||||
"epoch": 2.042904049616928,
|
||||
"grad_norm": 2.0076063347622974,
|
||||
"learning_rate": 7.3698046643160645e-06,
|
||||
"loss": 0.520530029296875,
|
||||
"step": 14000
|
||||
},
|
||||
{
|
||||
"epoch": 2.1888361911711054,
|
||||
"grad_norm": 1.529742164922155,
|
||||
"learning_rate": 6.909769440229038e-06,
|
||||
"loss": 0.33792144775390626,
|
||||
"step": 15000
|
||||
},
|
||||
{
|
||||
"epoch": 2.334768332725283,
|
||||
"grad_norm": 2.116689548920815,
|
||||
"learning_rate": 6.4299311407857035e-06,
|
||||
"loss": 0.3347291259765625,
|
||||
"step": 16000
|
||||
},
|
||||
{
|
||||
"epoch": 2.48070047427946,
|
||||
"grad_norm": 1.8084278631560584,
|
||||
"learning_rate": 5.935265379168761e-06,
|
||||
"loss": 0.3385657958984375,
|
||||
"step": 17000
|
||||
},
|
||||
{
|
||||
"epoch": 2.6266326158336373,
|
||||
"grad_norm": 3.29945063597593,
|
||||
"learning_rate": 5.430901519764892e-06,
|
||||
"loss": 0.33349261474609376,
|
||||
"step": 18000
|
||||
},
|
||||
{
|
||||
"epoch": 2.7725647573878147,
|
||||
"grad_norm": 1.9290178050582503,
|
||||
"learning_rate": 4.9220694899697185e-06,
|
||||
"loss": 0.3383995361328125,
|
||||
"step": 19000
|
||||
},
|
||||
{
|
||||
"epoch": 2.918496898941992,
|
||||
"grad_norm": 1.8157318709036212,
|
||||
"learning_rate": 4.414045549219315e-06,
|
||||
"loss": 0.3316441650390625,
|
||||
"step": 20000
|
||||
},
|
||||
{
|
||||
"epoch": 3.064356074425392,
|
||||
"grad_norm": 3.0277622115117175,
|
||||
"learning_rate": 3.912097577588397e-06,
|
||||
"loss": 0.2421361541748047,
|
||||
"step": 21000
|
||||
},
|
||||
{
|
||||
"epoch": 3.2102882159795696,
|
||||
"grad_norm": 2.0816758739547914,
|
||||
"learning_rate": 3.4214304512770823e-06,
|
||||
"loss": 0.1313203887939453,
|
||||
"step": 22000
|
||||
},
|
||||
{
|
||||
"epoch": 3.356220357533747,
|
||||
"grad_norm": 1.739691217957409,
|
||||
"learning_rate": 2.9471320714071095e-06,
|
||||
"loss": 0.12995486450195312,
|
||||
"step": 23000
|
||||
},
|
||||
{
|
||||
"epoch": 3.502152499087924,
|
||||
"grad_norm": 3.1257187709887875,
|
||||
"learning_rate": 2.4941206057740675e-06,
|
||||
"loss": 0.1304095458984375,
|
||||
"step": 24000
|
||||
},
|
||||
{
|
||||
"epoch": 3.6480846406421015,
|
||||
"grad_norm": 2.2140995652592785,
|
||||
"learning_rate": 2.06709349062457e-06,
|
||||
"loss": 0.12645170593261718,
|
||||
"step": 25000
|
||||
},
|
||||
{
|
||||
"epoch": 3.7940167821962785,
|
||||
"grad_norm": 1.7680132762507759,
|
||||
"learning_rate": 1.6704787212769829e-06,
|
||||
"loss": 0.12362543487548829,
|
||||
"step": 26000
|
||||
},
|
||||
{
|
||||
"epoch": 3.939948923750456,
|
||||
"grad_norm": 3.186667247027872,
|
||||
"learning_rate": 1.3083889366705216e-06,
|
||||
"loss": 0.11934644317626954,
|
||||
"step": 27000
|
||||
},
|
||||
{
|
||||
"epoch": 4.085808099233856,
|
||||
"grad_norm": 0.9381402976600279,
|
||||
"learning_rate": 9.845787739562829e-07,
|
||||
"loss": 0.07250856018066407,
|
||||
"step": 28000
|
||||
},
|
||||
{
|
||||
"epoch": 4.231740240788033,
|
||||
"grad_norm": 1.5081719675375433,
|
||||
"learning_rate": 7.024059353355333e-07,
|
||||
"loss": 0.03657876205444336,
|
||||
"step": 29000
|
||||
},
|
||||
{
|
||||
"epoch": 4.377672382342211,
|
||||
"grad_norm": 1.3793894154463466,
|
||||
"learning_rate": 4.64796370857008e-07,
|
||||
"loss": 0.035053966522216796,
|
||||
"step": 30000
|
||||
},
|
||||
{
|
||||
"epoch": 4.523604523896388,
|
||||
"grad_norm": 1.9377667427717677,
|
||||
"learning_rate": 2.7421393820510846e-07,
|
||||
"loss": 0.0349309196472168,
|
||||
"step": 31000
|
||||
},
|
||||
{
|
||||
"epoch": 4.669536665450566,
|
||||
"grad_norm": 1.109997862535006,
|
||||
"learning_rate": 1.326348540874095e-07,
|
||||
"loss": 0.03447756195068359,
|
||||
"step": 32000
|
||||
},
|
||||
{
|
||||
"epoch": 4.815468807004743,
|
||||
"grad_norm": 1.152236730081828,
|
||||
"learning_rate": 4.152720214406214e-08,
|
||||
"loss": 0.03444968414306641,
|
||||
"step": 33000
|
||||
},
|
||||
{
|
||||
"epoch": 4.96140094855892,
|
||||
"grad_norm": 1.6457557752833996,
|
||||
"learning_rate": 1.8357098688476238e-09,
|
||||
"loss": 0.034835365295410155,
|
||||
"step": 34000
|
||||
}
|
||||
],
|
||||
"logging_steps": 1000,
|
||||
"max_steps": 34265,
|
||||
"num_input_tokens_seen": 0,
|
||||
"num_train_epochs": 5,
|
||||
"save_steps": 50000,
|
||||
"stateful_callbacks": {
|
||||
"TrainerControl": {
|
||||
"args": {
|
||||
"should_epoch_stop": false,
|
||||
"should_evaluate": false,
|
||||
"should_log": false,
|
||||
"should_save": true,
|
||||
"should_training_stop": true
|
||||
},
|
||||
"attributes": {}
|
||||
}
|
||||
},
|
||||
"total_flos": 481722301939712.0,
|
||||
"train_batch_size": 1,
|
||||
"trial_name": null,
|
||||
"trial_params": null
|
||||
}
|
||||
3
checkpoint-34265/training_args.bin
Normal file
3
checkpoint-34265/training_args.bin
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:aeba44e7611f40dbc5cb19262d1f7cf185351624bc850381dceb5317d44a57f4
|
||||
size 7377
|
||||
760
checkpoint-34265/zero_to_fp32.py
Normal file
760
checkpoint-34265/zero_to_fp32.py
Normal file
@@ -0,0 +1,760 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
# DeepSpeed Team
|
||||
|
||||
# This script extracts fp32 consolidated weights from a zero 1, 2 and 3 DeepSpeed checkpoints. It gets
|
||||
# copied into the top level checkpoint dir, so the user can easily do the conversion at any point in
|
||||
# the future. Once extracted, the weights don't require DeepSpeed and can be used in any
|
||||
# application.
|
||||
#
|
||||
# example:
|
||||
# python zero_to_fp32.py . output_dir/
|
||||
# or
|
||||
# python zero_to_fp32.py . output_dir/ --safe_serialization
|
||||
|
||||
import argparse
|
||||
import torch
|
||||
import glob
|
||||
import math
|
||||
import os
|
||||
import re
|
||||
import gc
|
||||
import json
|
||||
import numpy as np
|
||||
from tqdm import tqdm
|
||||
from collections import OrderedDict
|
||||
from dataclasses import dataclass
|
||||
|
||||
# while this script doesn't use deepspeed to recover data, since the checkpoints are pickled with
|
||||
# DeepSpeed data structures it has to be available in the current python environment.
|
||||
from deepspeed.utils import logger
|
||||
from deepspeed.checkpoint.constants import (DS_VERSION, OPTIMIZER_STATE_DICT, SINGLE_PARTITION_OF_FP32_GROUPS,
|
||||
FP32_FLAT_GROUPS, ZERO_STAGE, PARTITION_COUNT, PARAM_SHAPES, BUFFER_NAMES,
|
||||
FROZEN_PARAM_SHAPES, FROZEN_PARAM_FRAGMENTS)
|
||||
|
||||
|
||||
@dataclass
|
||||
class zero_model_state:
|
||||
buffers: dict()
|
||||
param_shapes: dict()
|
||||
shared_params: list
|
||||
ds_version: int
|
||||
frozen_param_shapes: dict()
|
||||
frozen_param_fragments: dict()
|
||||
|
||||
|
||||
debug = 0
|
||||
|
||||
# load to cpu
|
||||
device = torch.device('cpu')
|
||||
|
||||
|
||||
def atoi(text):
|
||||
return int(text) if text.isdigit() else text
|
||||
|
||||
|
||||
def natural_keys(text):
|
||||
'''
|
||||
alist.sort(key=natural_keys) sorts in human order
|
||||
http://nedbatchelder.com/blog/200712/human_sorting.html
|
||||
(See Toothy's implementation in the comments)
|
||||
'''
|
||||
return [atoi(c) for c in re.split(r'(\d+)', text)]
|
||||
|
||||
|
||||
def get_model_state_file(checkpoint_dir, zero_stage):
|
||||
if not os.path.isdir(checkpoint_dir):
|
||||
raise FileNotFoundError(f"Directory '{checkpoint_dir}' doesn't exist")
|
||||
|
||||
# there should be only one file
|
||||
if zero_stage <= 2:
|
||||
file = os.path.join(checkpoint_dir, "mp_rank_00_model_states.pt")
|
||||
elif zero_stage == 3:
|
||||
file = os.path.join(checkpoint_dir, "zero_pp_rank_0_mp_rank_00_model_states.pt")
|
||||
|
||||
if not os.path.exists(file):
|
||||
raise FileNotFoundError(f"can't find model states file at '{file}'")
|
||||
|
||||
return file
|
||||
|
||||
|
||||
def get_checkpoint_files(checkpoint_dir, glob_pattern):
|
||||
# XXX: need to test that this simple glob rule works for multi-node setup too
|
||||
ckpt_files = sorted(glob.glob(os.path.join(checkpoint_dir, glob_pattern)), key=natural_keys)
|
||||
|
||||
if len(ckpt_files) == 0:
|
||||
raise FileNotFoundError(f"can't find {glob_pattern} files in directory '{checkpoint_dir}'")
|
||||
|
||||
return ckpt_files
|
||||
|
||||
|
||||
def get_optim_files(checkpoint_dir):
|
||||
return get_checkpoint_files(checkpoint_dir, "*_optim_states.pt")
|
||||
|
||||
|
||||
def get_model_state_files(checkpoint_dir):
|
||||
return get_checkpoint_files(checkpoint_dir, "*_model_states.pt")
|
||||
|
||||
|
||||
def parse_model_states(files):
|
||||
zero_model_states = []
|
||||
for file in files:
|
||||
state_dict = torch.load(file, map_location=device, weights_only=False)
|
||||
|
||||
if BUFFER_NAMES not in state_dict:
|
||||
raise ValueError(f"{file} is not a model state checkpoint")
|
||||
buffer_names = state_dict[BUFFER_NAMES]
|
||||
if debug:
|
||||
print("Found buffers:", buffer_names)
|
||||
|
||||
# recover just the buffers while restoring them to fp32 if they were saved in fp16
|
||||
buffers = {k: v.float() for k, v in state_dict["module"].items() if k in buffer_names}
|
||||
param_shapes = state_dict[PARAM_SHAPES]
|
||||
|
||||
# collect parameters that are included in param_shapes
|
||||
param_names = []
|
||||
for s in param_shapes:
|
||||
for name in s.keys():
|
||||
param_names.append(name)
|
||||
|
||||
# update with frozen parameters
|
||||
frozen_param_shapes = state_dict.get(FROZEN_PARAM_SHAPES, None)
|
||||
if frozen_param_shapes is not None:
|
||||
if debug:
|
||||
print(f"Found frozen_param_shapes: {frozen_param_shapes}")
|
||||
param_names += list(frozen_param_shapes.keys())
|
||||
|
||||
# handle shared params
|
||||
shared_params = [[k, v] for k, v in state_dict["shared_params"].items()]
|
||||
|
||||
ds_version = state_dict.get(DS_VERSION, None)
|
||||
|
||||
frozen_param_fragments = state_dict.get(FROZEN_PARAM_FRAGMENTS, None)
|
||||
|
||||
z_model_state = zero_model_state(buffers=buffers,
|
||||
param_shapes=param_shapes,
|
||||
shared_params=shared_params,
|
||||
ds_version=ds_version,
|
||||
frozen_param_shapes=frozen_param_shapes,
|
||||
frozen_param_fragments=frozen_param_fragments)
|
||||
zero_model_states.append(z_model_state)
|
||||
|
||||
return zero_model_states
|
||||
|
||||
|
||||
def parse_optim_states(files, ds_checkpoint_dir):
|
||||
total_files = len(files)
|
||||
state_dicts = []
|
||||
for f in tqdm(files, desc='Loading checkpoint shards'):
|
||||
state_dict = torch.load(f, map_location=device, mmap=True, weights_only=False)
|
||||
# immediately discard the potentially huge 2 optimizer states as we only care for fp32 master weights
|
||||
# and also handle the case where it was already removed by another helper script
|
||||
state_dict["optimizer_state_dict"].pop("optimizer_state_dict", None)
|
||||
state_dicts.append(state_dict)
|
||||
|
||||
if ZERO_STAGE not in state_dicts[0][OPTIMIZER_STATE_DICT]:
|
||||
raise ValueError(f"{files[0]} is not a zero checkpoint")
|
||||
zero_stage = state_dicts[0][OPTIMIZER_STATE_DICT][ZERO_STAGE]
|
||||
world_size = state_dicts[0][OPTIMIZER_STATE_DICT][PARTITION_COUNT]
|
||||
|
||||
# For ZeRO-2 each param group can have different partition_count as data parallelism for expert
|
||||
# parameters can be different from data parallelism for non-expert parameters. So we can just
|
||||
# use the max of the partition_count to get the dp world_size.
|
||||
|
||||
if type(world_size) is list:
|
||||
world_size = max(world_size)
|
||||
|
||||
if world_size != total_files:
|
||||
raise ValueError(
|
||||
f"Expected {world_size} of '*_optim_states.pt' under '{ds_checkpoint_dir}' but found {total_files} files. "
|
||||
"Possibly due to an overwrite of an old checkpoint, or a checkpoint didn't get saved by one or more processes."
|
||||
)
|
||||
|
||||
# the groups are named differently in each stage
|
||||
if zero_stage <= 2:
|
||||
fp32_groups_key = SINGLE_PARTITION_OF_FP32_GROUPS
|
||||
elif zero_stage == 3:
|
||||
fp32_groups_key = FP32_FLAT_GROUPS
|
||||
else:
|
||||
raise ValueError(f"unknown zero stage {zero_stage}")
|
||||
|
||||
fp32_flat_groups = [state_dicts[i][OPTIMIZER_STATE_DICT][fp32_groups_key] for i in range(len(state_dicts))]
|
||||
return zero_stage, world_size, fp32_flat_groups
|
||||
|
||||
|
||||
def _get_fp32_state_dict_from_zero_checkpoint(ds_checkpoint_dir, exclude_frozen_parameters):
|
||||
"""
|
||||
Returns fp32 state_dict reconstructed from ds checkpoint
|
||||
|
||||
Args:
|
||||
- ``ds_checkpoint_dir``: path to the deepspeed checkpoint folder (where the optimizer files are)
|
||||
|
||||
"""
|
||||
print(f"Processing zero checkpoint '{ds_checkpoint_dir}'")
|
||||
|
||||
optim_files = get_optim_files(ds_checkpoint_dir)
|
||||
zero_stage, world_size, fp32_flat_groups = parse_optim_states(optim_files, ds_checkpoint_dir)
|
||||
print(f"Detected checkpoint of type zero stage {zero_stage}, world_size: {world_size}")
|
||||
|
||||
model_files = get_model_state_files(ds_checkpoint_dir)
|
||||
|
||||
zero_model_states = parse_model_states(model_files)
|
||||
print(f'Parsing checkpoint created by deepspeed=={zero_model_states[0].ds_version}')
|
||||
|
||||
if zero_stage <= 2:
|
||||
return _get_fp32_state_dict_from_zero2_checkpoint(world_size, fp32_flat_groups, zero_model_states,
|
||||
exclude_frozen_parameters)
|
||||
elif zero_stage == 3:
|
||||
return _get_fp32_state_dict_from_zero3_checkpoint(world_size, fp32_flat_groups, zero_model_states,
|
||||
exclude_frozen_parameters)
|
||||
|
||||
|
||||
def _zero2_merge_frozen_params(state_dict, zero_model_states):
|
||||
if zero_model_states[0].frozen_param_shapes is None or len(zero_model_states[0].frozen_param_shapes) == 0:
|
||||
return
|
||||
|
||||
frozen_param_shapes = zero_model_states[0].frozen_param_shapes
|
||||
frozen_param_fragments = zero_model_states[0].frozen_param_fragments
|
||||
|
||||
if debug:
|
||||
num_elem = sum(s.numel() for s in frozen_param_shapes.values())
|
||||
print(f'rank 0: {FROZEN_PARAM_SHAPES}.numel = {num_elem}')
|
||||
|
||||
wanted_params = len(frozen_param_shapes)
|
||||
wanted_numel = sum(s.numel() for s in frozen_param_shapes.values())
|
||||
avail_numel = sum([p.numel() for p in frozen_param_fragments.values()])
|
||||
print(f'Frozen params: Have {avail_numel} numels to process.')
|
||||
print(f'Frozen params: Need {wanted_numel} numels in {wanted_params} params')
|
||||
|
||||
total_params = 0
|
||||
total_numel = 0
|
||||
for name, shape in frozen_param_shapes.items():
|
||||
total_params += 1
|
||||
unpartitioned_numel = shape.numel()
|
||||
total_numel += unpartitioned_numel
|
||||
|
||||
state_dict[name] = frozen_param_fragments[name]
|
||||
|
||||
if debug:
|
||||
print(f"{name} full shape: {shape} unpartitioned numel {unpartitioned_numel} ")
|
||||
|
||||
print(f"Reconstructed Frozen fp32 state dict with {total_params} params {total_numel} elements")
|
||||
|
||||
|
||||
def _has_callable(obj, fn):
|
||||
attr = getattr(obj, fn, None)
|
||||
return callable(attr)
|
||||
|
||||
|
||||
def _zero2_merge_trainable_params(state_dict, world_size, fp32_flat_groups, zero_model_states):
|
||||
param_shapes = zero_model_states[0].param_shapes
|
||||
|
||||
# Reconstruction protocol:
|
||||
#
|
||||
# XXX: document this
|
||||
|
||||
if debug:
|
||||
for i in range(world_size):
|
||||
for j in range(len(fp32_flat_groups[0])):
|
||||
print(f"{FP32_FLAT_GROUPS}[{i}][{j}].shape={fp32_flat_groups[i][j].shape}")
|
||||
|
||||
# XXX: memory usage doubles here (zero2)
|
||||
num_param_groups = len(fp32_flat_groups[0])
|
||||
merged_single_partition_of_fp32_groups = []
|
||||
for i in range(num_param_groups):
|
||||
merged_partitions = [sd[i] for sd in fp32_flat_groups]
|
||||
full_single_fp32_vector = torch.cat(merged_partitions, 0)
|
||||
merged_single_partition_of_fp32_groups.append(full_single_fp32_vector)
|
||||
avail_numel = sum(
|
||||
[full_single_fp32_vector.numel() for full_single_fp32_vector in merged_single_partition_of_fp32_groups])
|
||||
|
||||
if debug:
|
||||
wanted_params = sum([len(shapes) for shapes in param_shapes])
|
||||
wanted_numel = sum([sum(shape.numel() for shape in shapes.values()) for shapes in param_shapes])
|
||||
# not asserting if there is a mismatch due to possible padding
|
||||
print(f"Have {avail_numel} numels to process.")
|
||||
print(f"Need {wanted_numel} numels in {wanted_params} params.")
|
||||
|
||||
# params
|
||||
# XXX: for huge models that can't fit into the host's RAM we will have to recode this to support
|
||||
# out-of-core computing solution
|
||||
total_numel = 0
|
||||
total_params = 0
|
||||
for shapes, full_single_fp32_vector in zip(param_shapes, merged_single_partition_of_fp32_groups):
|
||||
offset = 0
|
||||
avail_numel = full_single_fp32_vector.numel()
|
||||
for name, shape in shapes.items():
|
||||
|
||||
unpartitioned_numel = shape.numel() if _has_callable(shape, 'numel') else math.prod(shape)
|
||||
total_numel += unpartitioned_numel
|
||||
total_params += 1
|
||||
|
||||
if debug:
|
||||
print(f"{name} full shape: {shape} unpartitioned numel {unpartitioned_numel} ")
|
||||
state_dict[name] = full_single_fp32_vector.narrow(0, offset, unpartitioned_numel).view(shape)
|
||||
offset += unpartitioned_numel
|
||||
|
||||
# Z2 started to align to 2*world_size to improve nccl performance. Therefore both offset and
|
||||
# avail_numel can differ by anywhere between 0..2*world_size. Due to two unrelated complex
|
||||
# paddings performed in the code it's almost impossible to predict the exact numbers w/o the
|
||||
# live optimizer object, so we are checking that the numbers are within the right range
|
||||
align_to = 2 * world_size
|
||||
|
||||
def zero2_align(x):
|
||||
return align_to * math.ceil(x / align_to)
|
||||
|
||||
if debug:
|
||||
print(f"original offset={offset}, avail_numel={avail_numel}")
|
||||
|
||||
offset = zero2_align(offset)
|
||||
avail_numel = zero2_align(avail_numel)
|
||||
|
||||
if debug:
|
||||
print(f"aligned offset={offset}, avail_numel={avail_numel}")
|
||||
|
||||
# Sanity check
|
||||
if offset != avail_numel:
|
||||
raise ValueError(f"consumed {offset} numels out of {avail_numel} - something is wrong")
|
||||
|
||||
print(f"Reconstructed fp32 state dict with {total_params} params {total_numel} elements")
|
||||
|
||||
|
||||
def _get_fp32_state_dict_from_zero2_checkpoint(world_size, fp32_flat_groups, zero_model_states,
|
||||
exclude_frozen_parameters):
|
||||
state_dict = OrderedDict()
|
||||
|
||||
# buffers
|
||||
buffers = zero_model_states[0].buffers
|
||||
state_dict.update(buffers)
|
||||
if debug:
|
||||
print(f"added {len(buffers)} buffers")
|
||||
|
||||
if not exclude_frozen_parameters:
|
||||
_zero2_merge_frozen_params(state_dict, zero_model_states)
|
||||
|
||||
_zero2_merge_trainable_params(state_dict, world_size, fp32_flat_groups, zero_model_states)
|
||||
|
||||
# recover shared parameters
|
||||
for pair in zero_model_states[0].shared_params:
|
||||
if pair[1] in state_dict:
|
||||
state_dict[pair[0]] = state_dict[pair[1]]
|
||||
|
||||
return state_dict
|
||||
|
||||
|
||||
def zero3_partitioned_param_info(unpartitioned_numel, world_size):
|
||||
remainder = unpartitioned_numel % world_size
|
||||
padding_numel = (world_size - remainder) if remainder else 0
|
||||
partitioned_numel = math.ceil(unpartitioned_numel / world_size)
|
||||
return partitioned_numel, padding_numel
|
||||
|
||||
|
||||
def _zero3_merge_frozen_params(state_dict, world_size, zero_model_states):
|
||||
if zero_model_states[0].frozen_param_shapes is None or len(zero_model_states[0].frozen_param_shapes) == 0:
|
||||
return
|
||||
|
||||
if debug:
|
||||
for i in range(world_size):
|
||||
num_elem = sum(s.numel() for s in zero_model_states[i].frozen_param_fragments.values())
|
||||
print(f'rank {i}: {FROZEN_PARAM_SHAPES}.numel = {num_elem}')
|
||||
|
||||
frozen_param_shapes = zero_model_states[0].frozen_param_shapes
|
||||
wanted_params = len(frozen_param_shapes)
|
||||
wanted_numel = sum(s.numel() for s in frozen_param_shapes.values())
|
||||
avail_numel = sum([p.numel() for p in zero_model_states[0].frozen_param_fragments.values()]) * world_size
|
||||
print(f'Frozen params: Have {avail_numel} numels to process.')
|
||||
print(f'Frozen params: Need {wanted_numel} numels in {wanted_params} params')
|
||||
|
||||
total_params = 0
|
||||
total_numel = 0
|
||||
for name, shape in zero_model_states[0].frozen_param_shapes.items():
|
||||
total_params += 1
|
||||
unpartitioned_numel = shape.numel()
|
||||
total_numel += unpartitioned_numel
|
||||
|
||||
param_frags = tuple(model_state.frozen_param_fragments[name] for model_state in zero_model_states)
|
||||
state_dict[name] = torch.cat(param_frags, 0).narrow(0, 0, unpartitioned_numel).view(shape)
|
||||
|
||||
partitioned_numel, partitioned_padding_numel = zero3_partitioned_param_info(unpartitioned_numel, world_size)
|
||||
|
||||
if debug:
|
||||
print(
|
||||
f"Frozen params: {total_params} {name} full shape: {shape} partition0 numel={partitioned_numel} partitioned_padding_numel={partitioned_padding_numel}"
|
||||
)
|
||||
|
||||
print(f"Reconstructed Frozen fp32 state dict with {total_params} params {total_numel} elements")
|
||||
|
||||
|
||||
class GatheredTensor:
|
||||
"""
|
||||
A pseudo tensor that collects partitioned weights.
|
||||
It is more memory efficient when there are multiple groups.
|
||||
"""
|
||||
|
||||
def __init__(self, flat_groups, flat_groups_offset, offset, partitioned_numel, shape):
|
||||
self.flat_groups = flat_groups
|
||||
self.flat_groups_offset = flat_groups_offset
|
||||
self.offset = offset
|
||||
self.partitioned_numel = partitioned_numel
|
||||
self.shape = shape
|
||||
self.dtype = self.flat_groups[0][0].dtype
|
||||
|
||||
def contiguous(self):
|
||||
"""
|
||||
Merge partitioned weights from flat_groups into a single tensor.
|
||||
"""
|
||||
end_idx = self.offset + self.partitioned_numel
|
||||
world_size = len(self.flat_groups)
|
||||
pad_flat_param_chunks = []
|
||||
|
||||
for rank_i in range(world_size):
|
||||
# for each rank, we need to collect weights from related group/groups
|
||||
flat_groups_at_rank_i = self.flat_groups[rank_i]
|
||||
start_group_id = None
|
||||
end_group_id = None
|
||||
for group_id in range(len(self.flat_groups_offset)):
|
||||
if self.flat_groups_offset[group_id] <= self.offset < self.flat_groups_offset[group_id + 1]:
|
||||
start_group_id = group_id
|
||||
if self.flat_groups_offset[group_id] < end_idx <= self.flat_groups_offset[group_id + 1]:
|
||||
end_group_id = group_id
|
||||
break
|
||||
# collect weights from related group/groups
|
||||
for group_id in range(start_group_id, end_group_id + 1):
|
||||
flat_tensor = flat_groups_at_rank_i[group_id]
|
||||
start_offset = self.offset - self.flat_groups_offset[group_id]
|
||||
end_offset = min(end_idx, self.flat_groups_offset[group_id + 1]) - self.flat_groups_offset[group_id]
|
||||
pad_flat_param_chunks.append(flat_tensor[start_offset:end_offset])
|
||||
|
||||
# collect weights from all ranks
|
||||
pad_flat_param = torch.cat(pad_flat_param_chunks, dim=0)
|
||||
param = pad_flat_param[:self.shape.numel()].view(self.shape).contiguous()
|
||||
return param
|
||||
|
||||
|
||||
def _zero3_merge_trainable_params(state_dict, world_size, fp32_flat_groups, zero_model_states):
|
||||
param_shapes = zero_model_states[0].param_shapes
|
||||
avail_numel = sum([flat_group.numel() for flat_group in fp32_flat_groups[0]]) * world_size
|
||||
|
||||
# Reconstruction protocol: For zero3 we need to zip the partitions together at boundary of each
|
||||
# param, re-consolidating each param, while dealing with padding if any
|
||||
|
||||
# merge list of dicts, preserving order
|
||||
param_shapes = {k: v for d in param_shapes for k, v in d.items()}
|
||||
|
||||
if debug:
|
||||
for i in range(world_size):
|
||||
print(f"{FP32_FLAT_GROUPS}[{i}].shape={fp32_flat_groups[i].shape}")
|
||||
|
||||
wanted_params = len(param_shapes)
|
||||
wanted_numel = sum(shape.numel() for shape in param_shapes.values())
|
||||
# not asserting if there is a mismatch due to possible padding
|
||||
avail_numel = fp32_flat_groups[0].numel() * world_size
|
||||
print(f"Trainable params: Have {avail_numel} numels to process.")
|
||||
print(f"Trainable params: Need {wanted_numel} numels in {wanted_params} params.")
|
||||
|
||||
# params
|
||||
# XXX: for huge models that can't fit into the host's RAM we will have to recode this to support
|
||||
# out-of-core computing solution
|
||||
offset = 0
|
||||
total_numel = 0
|
||||
total_params = 0
|
||||
flat_groups_offset = [0] + list(np.cumsum([flat_tensor.numel() for flat_tensor in fp32_flat_groups[0]]))
|
||||
for name, shape in tqdm(param_shapes.items(), desc='Gathering sharded weights'):
|
||||
unpartitioned_numel = shape.numel()
|
||||
total_numel += unpartitioned_numel
|
||||
total_params += 1
|
||||
partitioned_numel, partitioned_padding_numel = zero3_partitioned_param_info(unpartitioned_numel, world_size)
|
||||
|
||||
if debug:
|
||||
print(
|
||||
f"Trainable params: {total_params} {name} full shape: {shape} partition0 numel={partitioned_numel} partitioned_padding_numel={partitioned_padding_numel}"
|
||||
)
|
||||
|
||||
# memory efficient tensor
|
||||
tensor = GatheredTensor(fp32_flat_groups, flat_groups_offset, offset, partitioned_numel, shape)
|
||||
state_dict[name] = tensor
|
||||
offset += partitioned_numel
|
||||
|
||||
offset *= world_size
|
||||
|
||||
# Sanity check
|
||||
if offset != avail_numel:
|
||||
raise ValueError(f"consumed {offset} numels out of {avail_numel} - something is wrong")
|
||||
|
||||
print(f"Reconstructed Trainable fp32 state dict with {total_params} params {total_numel} elements")
|
||||
|
||||
|
||||
def _get_fp32_state_dict_from_zero3_checkpoint(world_size, fp32_flat_groups, zero_model_states,
|
||||
exclude_frozen_parameters):
|
||||
state_dict = OrderedDict()
|
||||
|
||||
# buffers
|
||||
buffers = zero_model_states[0].buffers
|
||||
state_dict.update(buffers)
|
||||
if debug:
|
||||
print(f"added {len(buffers)} buffers")
|
||||
|
||||
if not exclude_frozen_parameters:
|
||||
_zero3_merge_frozen_params(state_dict, world_size, zero_model_states)
|
||||
|
||||
_zero3_merge_trainable_params(state_dict, world_size, fp32_flat_groups, zero_model_states)
|
||||
|
||||
# recover shared parameters
|
||||
for pair in zero_model_states[0].shared_params:
|
||||
if pair[1] in state_dict:
|
||||
state_dict[pair[0]] = state_dict[pair[1]]
|
||||
|
||||
return state_dict
|
||||
|
||||
|
||||
def to_torch_tensor(state_dict, return_empty_tensor=False):
|
||||
"""
|
||||
Convert state_dict of GatheredTensor to torch tensor
|
||||
"""
|
||||
torch_state_dict = {}
|
||||
converted_tensors = {}
|
||||
for name, tensor in state_dict.items():
|
||||
tensor_id = id(tensor)
|
||||
if tensor_id in converted_tensors: # shared tensors
|
||||
shared_tensor = torch_state_dict[converted_tensors[tensor_id]]
|
||||
torch_state_dict[name] = shared_tensor
|
||||
else:
|
||||
converted_tensors[tensor_id] = name
|
||||
if return_empty_tensor:
|
||||
torch_state_dict[name] = torch.empty(tensor.shape, dtype=tensor.dtype)
|
||||
else:
|
||||
torch_state_dict[name] = tensor.contiguous()
|
||||
return torch_state_dict
|
||||
|
||||
|
||||
def get_fp32_state_dict_from_zero_checkpoint(checkpoint_dir,
|
||||
tag=None,
|
||||
exclude_frozen_parameters=False,
|
||||
lazy_mode=False):
|
||||
"""
|
||||
Convert ZeRO 2 or 3 checkpoint into a single fp32 consolidated state_dict that can be loaded with
|
||||
``load_state_dict()`` and used for training without DeepSpeed or shared with others, for example
|
||||
via a model hub.
|
||||
|
||||
Args:
|
||||
- ``checkpoint_dir``: path to the desired checkpoint folder
|
||||
- ``tag``: checkpoint tag used as a unique identifier for checkpoint. If not provided will attempt to load tag in 'latest' file. e.g., ``global_step14``
|
||||
- ``exclude_frozen_parameters``: exclude frozen parameters
|
||||
- ``lazy_mode``: get state_dict in lazy mode. It returns a dict of pesduo tensor instead of torch tensor, which is more memory efficient.
|
||||
Convert the pesduo tensor to torch tensor by ``.contiguous()``
|
||||
|
||||
Returns:
|
||||
- pytorch ``state_dict``
|
||||
|
||||
A typical usage might be ::
|
||||
|
||||
from deepspeed.utils.zero_to_fp32 import get_fp32_state_dict_from_zero_checkpoint
|
||||
# do the training and checkpoint saving
|
||||
state_dict = get_fp32_state_dict_from_zero_checkpoint(checkpoint_dir) # already on cpu
|
||||
model = model.cpu() # move to cpu
|
||||
model.load_state_dict(state_dict)
|
||||
# submit to model hub or save the model to share with others
|
||||
|
||||
In this example the ``model`` will no longer be usable in the deepspeed context of the same
|
||||
application. i.e. you will need to re-initialize the deepspeed engine, since
|
||||
``model.load_state_dict(state_dict)`` will remove all the deepspeed magic from it.
|
||||
|
||||
If you want it all done for you, use ``load_state_dict_from_zero_checkpoint`` instead.
|
||||
|
||||
Note: the above usage may not work if your application doesn't have sufficient free CPU memory.
|
||||
You may need to use the offline approach using the ``zero_to_fp32.py`` script that is saved with
|
||||
the checkpoint. Or you can load state_dict in lazy mode ::
|
||||
|
||||
from deepspeed.utils.zero_to_fp32 import get_fp32_state_dict_from_zero_checkpoint
|
||||
state_dict = get_fp32_state_dict_from_zero_checkpoint(checkpoint_dir, lazy_mode=True) # not on cpu
|
||||
for name, lazy_tensor in state_dict.item():
|
||||
tensor = lazy_tensor.contiguous() # to cpu
|
||||
print(name, tensor)
|
||||
# del tensor to release memory if it no longer in use
|
||||
"""
|
||||
if tag is None:
|
||||
latest_path = os.path.join(checkpoint_dir, 'latest')
|
||||
if os.path.isfile(latest_path):
|
||||
with open(latest_path, 'r') as fd:
|
||||
tag = fd.read().strip()
|
||||
else:
|
||||
raise ValueError(f"Unable to find 'latest' file at {latest_path}")
|
||||
|
||||
ds_checkpoint_dir = os.path.join(checkpoint_dir, tag)
|
||||
|
||||
if not os.path.isdir(ds_checkpoint_dir):
|
||||
raise FileNotFoundError(f"Directory '{ds_checkpoint_dir}' doesn't exist")
|
||||
|
||||
state_dict = _get_fp32_state_dict_from_zero_checkpoint(ds_checkpoint_dir, exclude_frozen_parameters)
|
||||
if lazy_mode:
|
||||
return state_dict
|
||||
else:
|
||||
return to_torch_tensor(state_dict)
|
||||
|
||||
|
||||
def convert_zero_checkpoint_to_fp32_state_dict(checkpoint_dir,
|
||||
output_dir,
|
||||
max_shard_size="5GB",
|
||||
safe_serialization=False,
|
||||
tag=None,
|
||||
exclude_frozen_parameters=False):
|
||||
"""
|
||||
Convert ZeRO 2 or 3 checkpoint into a single fp32 consolidated ``state_dict`` file that can be
|
||||
loaded with ``torch.load(file)`` + ``load_state_dict()`` and used for training without DeepSpeed.
|
||||
|
||||
Args:
|
||||
- ``checkpoint_dir``: path to the desired checkpoint folder. (one that contains the tag-folder, like ``global_step14``)
|
||||
- ``output_dir``: directory to the pytorch fp32 state_dict output files
|
||||
- ``max_shard_size``: the maximum size for a checkpoint before being sharded, default value is 5GB
|
||||
- ``safe_serialization``: whether to save the model using `safetensors` or the traditional PyTorch way (that uses `pickle`).
|
||||
- ``tag``: checkpoint tag used as a unique identifier for checkpoint. If not provided will attempt to load tag in the file named ``latest`` in the checkpoint folder, e.g., ``global_step14``
|
||||
- ``exclude_frozen_parameters``: exclude frozen parameters
|
||||
"""
|
||||
|
||||
# Dependency pre-check
|
||||
if safe_serialization:
|
||||
try:
|
||||
from safetensors.torch import save_file
|
||||
except ImportError:
|
||||
print('If you want to use `safe_serialization`, please `pip install safetensors`')
|
||||
raise
|
||||
if max_shard_size is not None:
|
||||
try:
|
||||
from huggingface_hub import split_torch_state_dict_into_shards
|
||||
except ImportError:
|
||||
print('If you want to use `max_shard_size`, please `pip install huggingface_hub`')
|
||||
raise
|
||||
|
||||
# Convert zero checkpoint to state_dict
|
||||
state_dict = get_fp32_state_dict_from_zero_checkpoint(checkpoint_dir,
|
||||
tag,
|
||||
exclude_frozen_parameters,
|
||||
lazy_mode=True)
|
||||
|
||||
# Shard the model if it is too big.
|
||||
weights_name = "model.safetensors" if safe_serialization else "pytorch_model.bin"
|
||||
if max_shard_size is not None:
|
||||
filename_pattern = weights_name.replace(".bin", "{suffix}.bin").replace(".safetensors", "{suffix}.safetensors")
|
||||
# an memory-efficient approach for sharding
|
||||
empty_state_dict = to_torch_tensor(state_dict, return_empty_tensor=True)
|
||||
state_dict_split = split_torch_state_dict_into_shards(empty_state_dict,
|
||||
filename_pattern=filename_pattern,
|
||||
max_shard_size=max_shard_size)
|
||||
else:
|
||||
from collections import namedtuple
|
||||
StateDictSplit = namedtuple("StateDictSplit", ["is_sharded", "filename_to_tensors"])
|
||||
state_dict_split = StateDictSplit(is_sharded=False,
|
||||
filename_to_tensors={weights_name: list(state_dict.keys())})
|
||||
|
||||
# Save the model by shard
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
filename_to_tensors = state_dict_split.filename_to_tensors.items()
|
||||
for shard_file, tensors in tqdm(filename_to_tensors, desc="Saving checkpoint shards"):
|
||||
shard_state_dict = {tensor_name: state_dict[tensor_name] for tensor_name in tensors}
|
||||
shard_state_dict = to_torch_tensor(shard_state_dict)
|
||||
output_path = os.path.join(output_dir, shard_file)
|
||||
if safe_serialization:
|
||||
save_file(shard_state_dict, output_path, metadata={"format": "pt"})
|
||||
else:
|
||||
torch.save(shard_state_dict, output_path)
|
||||
# release the memory of current shard
|
||||
for tensor_name in list(shard_state_dict.keys()):
|
||||
del state_dict[tensor_name]
|
||||
del shard_state_dict[tensor_name]
|
||||
del shard_state_dict
|
||||
gc.collect()
|
||||
|
||||
# Save index if sharded
|
||||
if state_dict_split.is_sharded:
|
||||
index = {
|
||||
"metadata": state_dict_split.metadata,
|
||||
"weight_map": state_dict_split.tensor_to_filename,
|
||||
}
|
||||
save_index_file = "model.safetensors.index.json" if safe_serialization else "pytorch_model.bin.index.json"
|
||||
save_index_file = os.path.join(output_dir, save_index_file)
|
||||
with open(save_index_file, "w", encoding="utf-8") as f:
|
||||
content = json.dumps(index, indent=2, sort_keys=True) + "\n"
|
||||
f.write(content)
|
||||
|
||||
|
||||
def load_state_dict_from_zero_checkpoint(model, checkpoint_dir, tag=None):
|
||||
"""
|
||||
1. Put the provided model to cpu
|
||||
2. Convert ZeRO 2 or 3 checkpoint into a single fp32 consolidated ``state_dict``
|
||||
3. Load it into the provided model
|
||||
|
||||
Args:
|
||||
- ``model``: the model object to update
|
||||
- ``checkpoint_dir``: path to the desired checkpoint folder. (one that contains the tag-folder, like ``global_step14``)
|
||||
- ``tag``: checkpoint tag used as a unique identifier for checkpoint. If not provided will attempt to load tag in the file named ``latest`` in the checkpoint folder, e.g., ``global_step14``
|
||||
|
||||
Returns:
|
||||
- ``model`: modified model
|
||||
|
||||
Make sure you have plenty of CPU memory available before you call this function. If you don't
|
||||
have enough use the ``zero_to_fp32.py`` utility to do the conversion. You will find it
|
||||
conveniently placed for you in the checkpoint folder.
|
||||
|
||||
A typical usage might be ::
|
||||
|
||||
from deepspeed.utils.zero_to_fp32 import load_state_dict_from_zero_checkpoint
|
||||
model = load_state_dict_from_zero_checkpoint(trainer.model, checkpoint_dir)
|
||||
# submit to model hub or save the model to share with others
|
||||
|
||||
Note, that once this was run, the ``model`` will no longer be usable in the deepspeed context
|
||||
of the same application. i.e. you will need to re-initialize the deepspeed engine, since
|
||||
``model.load_state_dict(state_dict)`` will remove all the deepspeed magic from it.
|
||||
|
||||
"""
|
||||
logger.info("Extracting fp32 weights")
|
||||
state_dict = get_fp32_state_dict_from_zero_checkpoint(checkpoint_dir, tag)
|
||||
|
||||
logger.info("Overwriting model with fp32 weights")
|
||||
model = model.cpu()
|
||||
model.load_state_dict(state_dict, strict=False)
|
||||
|
||||
return model
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("checkpoint_dir",
|
||||
type=str,
|
||||
help="path to the desired checkpoint folder, e.g., path/checkpoint-12")
|
||||
parser.add_argument("output_dir",
|
||||
type=str,
|
||||
help="directory to the pytorch fp32 state_dict output files"
|
||||
"(e.g. path/checkpoint-12-output/)")
|
||||
parser.add_argument(
|
||||
"--max_shard_size",
|
||||
type=str,
|
||||
default="5GB",
|
||||
help="The maximum size for a checkpoint before being sharded. Checkpoints shard will then be each of size"
|
||||
"lower than this size. If expressed as a string, needs to be digits followed by a unit (like `5MB`"
|
||||
"We default it to 5GB in order for models to be able to run easily on free-tier google colab instances"
|
||||
"without CPU OOM issues.")
|
||||
parser.add_argument(
|
||||
"--safe_serialization",
|
||||
default=False,
|
||||
action='store_true',
|
||||
help="Whether to save the model using `safetensors` or the traditional PyTorch way (that uses `pickle`).")
|
||||
parser.add_argument("-t",
|
||||
"--tag",
|
||||
type=str,
|
||||
default=None,
|
||||
help="checkpoint tag used as a unique identifier for checkpoint. e.g., global_step1")
|
||||
parser.add_argument("--exclude_frozen_parameters", action='store_true', help="exclude frozen parameters")
|
||||
parser.add_argument("-d", "--debug", action='store_true', help="enable debug")
|
||||
args = parser.parse_args()
|
||||
|
||||
debug = args.debug
|
||||
|
||||
convert_zero_checkpoint_to_fp32_state_dict(args.checkpoint_dir,
|
||||
args.output_dir,
|
||||
max_shard_size=args.max_shard_size,
|
||||
safe_serialization=args.safe_serialization,
|
||||
tag=args.tag,
|
||||
exclude_frozen_parameters=args.exclude_frozen_parameters)
|
||||
75
config.json
Normal file
75
config.json
Normal file
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"architectures": [
|
||||
"Qwen3ForCausalLM"
|
||||
],
|
||||
"attention_bias": false,
|
||||
"attention_dropout": 0.0,
|
||||
"bos_token_id": null,
|
||||
"dtype": "bfloat16",
|
||||
"eos_token_id": 151645,
|
||||
"head_dim": 128,
|
||||
"hidden_act": "silu",
|
||||
"hidden_size": 5120,
|
||||
"initializer_range": 0.02,
|
||||
"intermediate_size": 17408,
|
||||
"layer_types": [
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention",
|
||||
"full_attention"
|
||||
],
|
||||
"max_position_embeddings": 32768,
|
||||
"max_window_layers": 40,
|
||||
"model_type": "qwen3",
|
||||
"num_attention_heads": 40,
|
||||
"num_hidden_layers": 40,
|
||||
"num_key_value_heads": 8,
|
||||
"pad_token_id": 151643,
|
||||
"rms_norm_eps": 1e-06,
|
||||
"rope_parameters": {
|
||||
"rope_theta": 1000000,
|
||||
"rope_type": "default"
|
||||
},
|
||||
"sliding_window": null,
|
||||
"tie_word_embeddings": false,
|
||||
"transformers_version": "5.2.0",
|
||||
"use_cache": false,
|
||||
"use_sliding_window": false,
|
||||
"vocab_size": 151936
|
||||
}
|
||||
9
generation_config.json
Normal file
9
generation_config.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"_from_model_config": true,
|
||||
"eos_token_id": [
|
||||
151645,
|
||||
151643
|
||||
],
|
||||
"pad_token_id": 151643,
|
||||
"transformers_version": "5.2.0"
|
||||
}
|
||||
3
model.safetensors
Normal file
3
model.safetensors
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1ca62e96fb25ec28dd201b6314f4ce7ee390c52f386feb103ec06cd666f0fc22
|
||||
size 29536666272
|
||||
3
tokenizer.json
Normal file
3
tokenizer.json
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:be75606093db2094d7cd20f3c2f385c212750648bd6ea4fb2bf507a6a4c55506
|
||||
size 11422650
|
||||
15
tokenizer_config.json
Normal file
15
tokenizer_config.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"add_prefix_space": false,
|
||||
"backend": "tokenizers",
|
||||
"bos_token": null,
|
||||
"clean_up_tokenization_spaces": false,
|
||||
"eos_token": "<|im_end|>",
|
||||
"errors": "replace",
|
||||
"is_local": false,
|
||||
"model_max_length": 131072,
|
||||
"pad_token": "<|endoftext|>",
|
||||
"padding_side": "right",
|
||||
"split_special_tokens": false,
|
||||
"tokenizer_class": "Qwen2Tokenizer",
|
||||
"unk_token": null
|
||||
}
|
||||
8
train_results.json
Normal file
8
train_results.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"epoch": 5.0,
|
||||
"total_flos": 481722301939712.0,
|
||||
"train_loss": 0.401988563902201,
|
||||
"train_runtime": 92209.7944,
|
||||
"train_samples_per_second": 2.973,
|
||||
"train_steps_per_second": 0.372
|
||||
}
|
||||
35
trainer_log.jsonl
Normal file
35
trainer_log.jsonl
Normal file
@@ -0,0 +1,35 @@
|
||||
{"current_steps": 1000, "total_steps": 34265, "loss": 1.154789306640625, "lr": 2.915086081120514e-06, "epoch": 0.1459321415541773, "percentage": 2.92, "elapsed_time": "0:44:56", "remaining_time": "1 day, 0:55:14"}
|
||||
{"current_steps": 2000, "total_steps": 34265, "loss": 0.9386199340820313, "lr": 5.833090166326233e-06, "epoch": 0.2918642831083546, "percentage": 5.84, "elapsed_time": "1:30:05", "remaining_time": "1 day, 0:13:21"}
|
||||
{"current_steps": 3000, "total_steps": 34265, "loss": 0.8885218505859375, "lr": 8.751094251531953e-06, "epoch": 0.43779642466253194, "percentage": 8.76, "elapsed_time": "2:14:43", "remaining_time": "23:24:07"}
|
||||
{"current_steps": 4000, "total_steps": 34265, "loss": 0.8694163208007812, "lr": 9.991513345767592e-06, "epoch": 0.5837285662167092, "percentage": 11.67, "elapsed_time": "2:59:17", "remaining_time": "22:36:31"}
|
||||
{"current_steps": 5000, "total_steps": 34265, "loss": 0.85284765625, "lr": 9.936020028278053e-06, "epoch": 0.7296607077708865, "percentage": 14.59, "elapsed_time": "3:44:00", "remaining_time": "21:51:05"}
|
||||
{"current_steps": 6000, "total_steps": 34265, "loss": 0.821312744140625, "lr": 9.829343371836088e-06, "epoch": 0.8755928493250639, "percentage": 17.51, "elapsed_time": "4:28:31", "remaining_time": "21:04:59"}
|
||||
{"current_steps": 7000, "total_steps": 34265, "loss": 0.7774617919921875, "lr": 9.672589544454328e-06, "epoch": 1.021452024808464, "percentage": 20.43, "elapsed_time": "5:13:07", "remaining_time": "20:19:38"}
|
||||
{"current_steps": 8000, "total_steps": 34265, "loss": 0.608907958984375, "lr": 9.46738398205746e-06, "epoch": 1.1673841663626414, "percentage": 23.35, "elapsed_time": "5:57:43", "remaining_time": "19:34:26"}
|
||||
{"current_steps": 9000, "total_steps": 34265, "loss": 0.6088528442382812, "lr": 9.215854533761766e-06, "epoch": 1.3133163079168186, "percentage": 26.27, "elapsed_time": "6:42:28", "remaining_time": "18:49:49"}
|
||||
{"current_steps": 10000, "total_steps": 34265, "loss": 0.6051533203125, "lr": 8.920609397454381e-06, "epoch": 1.459248449470996, "percentage": 29.18, "elapsed_time": "7:27:22", "remaining_time": "18:05:33"}
|
||||
{"current_steps": 11000, "total_steps": 34265, "loss": 0.6031138916015625, "lr": 8.584710074466158e-06, "epoch": 1.6051805910251733, "percentage": 32.1, "elapsed_time": "8:12:16", "remaining_time": "17:21:10"}
|
||||
{"current_steps": 12000, "total_steps": 34265, "loss": 0.6085886840820313, "lr": 8.211639623780629e-06, "epoch": 1.7511127325793505, "percentage": 35.02, "elapsed_time": "8:57:00", "remaining_time": "16:36:21"}
|
||||
{"current_steps": 13000, "total_steps": 34265, "loss": 0.6080531616210938, "lr": 7.805266544962458e-06, "epoch": 1.897044874133528, "percentage": 37.94, "elapsed_time": "9:41:39", "remaining_time": "15:51:27"}
|
||||
{"current_steps": 14000, "total_steps": 34265, "loss": 0.520530029296875, "lr": 7.3698046643160645e-06, "epoch": 2.042904049616928, "percentage": 40.86, "elapsed_time": "10:26:21", "remaining_time": "15:06:39"}
|
||||
{"current_steps": 15000, "total_steps": 34265, "loss": 0.33792144775390626, "lr": 6.909769440229038e-06, "epoch": 2.1888361911711054, "percentage": 43.78, "elapsed_time": "11:10:38", "remaining_time": "14:21:19"}
|
||||
{"current_steps": 16000, "total_steps": 34265, "loss": 0.3347291259765625, "lr": 6.4299311407857035e-06, "epoch": 2.334768332725283, "percentage": 46.69, "elapsed_time": "11:55:04", "remaining_time": "13:36:17"}
|
||||
{"current_steps": 17000, "total_steps": 34265, "loss": 0.3385657958984375, "lr": 5.935265379168761e-06, "epoch": 2.48070047427946, "percentage": 49.61, "elapsed_time": "12:39:52", "remaining_time": "12:51:43"}
|
||||
{"current_steps": 18000, "total_steps": 34265, "loss": 0.33349261474609376, "lr": 5.430901519764892e-06, "epoch": 2.6266326158336373, "percentage": 52.53, "elapsed_time": "13:24:42", "remaining_time": "12:07:08"}
|
||||
{"current_steps": 19000, "total_steps": 34265, "loss": 0.3383995361328125, "lr": 4.9220694899697185e-06, "epoch": 2.7725647573878147, "percentage": 55.45, "elapsed_time": "14:09:29", "remaining_time": "11:22:29"}
|
||||
{"current_steps": 20000, "total_steps": 34265, "loss": 0.3316441650390625, "lr": 4.414045549219315e-06, "epoch": 2.918496898941992, "percentage": 58.37, "elapsed_time": "14:53:49", "remaining_time": "10:37:31"}
|
||||
{"current_steps": 21000, "total_steps": 34265, "loss": 0.2421361541748047, "lr": 3.912097577588397e-06, "epoch": 3.064356074425392, "percentage": 61.29, "elapsed_time": "15:38:36", "remaining_time": "9:52:53"}
|
||||
{"current_steps": 22000, "total_steps": 34265, "loss": 0.1313203887939453, "lr": 3.4214304512770823e-06, "epoch": 3.2102882159795696, "percentage": 64.21, "elapsed_time": "16:23:17", "remaining_time": "9:08:11"}
|
||||
{"current_steps": 23000, "total_steps": 34265, "loss": 0.12995486450195312, "lr": 2.9471320714071095e-06, "epoch": 3.356220357533747, "percentage": 67.12, "elapsed_time": "17:08:01", "remaining_time": "8:23:30"}
|
||||
{"current_steps": 24000, "total_steps": 34265, "loss": 0.1304095458984375, "lr": 2.4941206057740675e-06, "epoch": 3.502152499087924, "percentage": 70.04, "elapsed_time": "17:52:36", "remaining_time": "7:38:45"}
|
||||
{"current_steps": 25000, "total_steps": 34265, "loss": 0.12645170593261718, "lr": 2.06709349062457e-06, "epoch": 3.6480846406421015, "percentage": 72.96, "elapsed_time": "18:37:12", "remaining_time": "6:54:02"}
|
||||
{"current_steps": 26000, "total_steps": 34265, "loss": 0.12362543487548829, "lr": 1.6704787212769829e-06, "epoch": 3.7940167821962785, "percentage": 75.88, "elapsed_time": "19:21:44", "remaining_time": "6:09:17"}
|
||||
{"current_steps": 27000, "total_steps": 34265, "loss": 0.11934644317626954, "lr": 1.3083889366705216e-06, "epoch": 3.939948923750456, "percentage": 78.8, "elapsed_time": "20:06:33", "remaining_time": "5:24:39"}
|
||||
{"current_steps": 28000, "total_steps": 34265, "loss": 0.07250856018066407, "lr": 9.845787739562829e-07, "epoch": 4.085808099233856, "percentage": 81.72, "elapsed_time": "20:51:17", "remaining_time": "4:39:58"}
|
||||
{"current_steps": 29000, "total_steps": 34265, "loss": 0.03657876205444336, "lr": 7.024059353355333e-07, "epoch": 4.231740240788033, "percentage": 84.63, "elapsed_time": "21:35:41", "remaining_time": "3:55:14"}
|
||||
{"current_steps": 30000, "total_steps": 34265, "loss": 0.035053966522216796, "lr": 4.64796370857008e-07, "epoch": 4.377672382342211, "percentage": 87.55, "elapsed_time": "22:20:07", "remaining_time": "3:10:31"}
|
||||
{"current_steps": 31000, "total_steps": 34265, "loss": 0.0349309196472168, "lr": 2.7421393820510846e-07, "epoch": 4.523604523896388, "percentage": 90.47, "elapsed_time": "23:04:46", "remaining_time": "2:25:50"}
|
||||
{"current_steps": 32000, "total_steps": 34265, "loss": 0.03447756195068359, "lr": 1.326348540874095e-07, "epoch": 4.669536665450566, "percentage": 93.39, "elapsed_time": "23:49:25", "remaining_time": "1:41:10"}
|
||||
{"current_steps": 33000, "total_steps": 34265, "loss": 0.03444968414306641, "lr": 4.152720214406214e-08, "epoch": 4.815468807004743, "percentage": 96.31, "elapsed_time": "1 day, 0:34:23", "remaining_time": "0:56:31"}
|
||||
{"current_steps": 34000, "total_steps": 34265, "loss": 0.034835365295410155, "lr": 1.8357098688476238e-09, "epoch": 4.96140094855892, "percentage": 99.23, "elapsed_time": "1 day, 1:19:16", "remaining_time": "0:11:50"}
|
||||
{"current_steps": 34265, "total_steps": 34265, "epoch": 5.0, "percentage": 100.0, "elapsed_time": "1 day, 1:36:49", "remaining_time": "0:00:00"}
|
||||
281
trainer_state.json
Normal file
281
trainer_state.json
Normal file
@@ -0,0 +1,281 @@
|
||||
{
|
||||
"best_global_step": null,
|
||||
"best_metric": null,
|
||||
"best_model_checkpoint": null,
|
||||
"epoch": 5.0,
|
||||
"eval_steps": 500,
|
||||
"global_step": 34265,
|
||||
"is_hyper_param_search": false,
|
||||
"is_local_process_zero": true,
|
||||
"is_world_process_zero": true,
|
||||
"log_history": [
|
||||
{
|
||||
"epoch": 0.1459321415541773,
|
||||
"grad_norm": 3.8735740724697223,
|
||||
"learning_rate": 2.915086081120514e-06,
|
||||
"loss": 1.154789306640625,
|
||||
"step": 1000
|
||||
},
|
||||
{
|
||||
"epoch": 0.2918642831083546,
|
||||
"grad_norm": 3.513073777315236,
|
||||
"learning_rate": 5.833090166326233e-06,
|
||||
"loss": 0.9386199340820313,
|
||||
"step": 2000
|
||||
},
|
||||
{
|
||||
"epoch": 0.43779642466253194,
|
||||
"grad_norm": 2.667804789171682,
|
||||
"learning_rate": 8.751094251531953e-06,
|
||||
"loss": 0.8885218505859375,
|
||||
"step": 3000
|
||||
},
|
||||
{
|
||||
"epoch": 0.5837285662167092,
|
||||
"grad_norm": 1.8311641416860456,
|
||||
"learning_rate": 9.991513345767592e-06,
|
||||
"loss": 0.8694163208007812,
|
||||
"step": 4000
|
||||
},
|
||||
{
|
||||
"epoch": 0.7296607077708865,
|
||||
"grad_norm": 2.250397237666049,
|
||||
"learning_rate": 9.936020028278053e-06,
|
||||
"loss": 0.85284765625,
|
||||
"step": 5000
|
||||
},
|
||||
{
|
||||
"epoch": 0.8755928493250639,
|
||||
"grad_norm": 2.6756387164181197,
|
||||
"learning_rate": 9.829343371836088e-06,
|
||||
"loss": 0.821312744140625,
|
||||
"step": 6000
|
||||
},
|
||||
{
|
||||
"epoch": 1.021452024808464,
|
||||
"grad_norm": 2.6729990910245593,
|
||||
"learning_rate": 9.672589544454328e-06,
|
||||
"loss": 0.7774617919921875,
|
||||
"step": 7000
|
||||
},
|
||||
{
|
||||
"epoch": 1.1673841663626414,
|
||||
"grad_norm": 2.642277321184833,
|
||||
"learning_rate": 9.46738398205746e-06,
|
||||
"loss": 0.608907958984375,
|
||||
"step": 8000
|
||||
},
|
||||
{
|
||||
"epoch": 1.3133163079168186,
|
||||
"grad_norm": 2.1544218289818913,
|
||||
"learning_rate": 9.215854533761766e-06,
|
||||
"loss": 0.6088528442382812,
|
||||
"step": 9000
|
||||
},
|
||||
{
|
||||
"epoch": 1.459248449470996,
|
||||
"grad_norm": 2.3990917619771497,
|
||||
"learning_rate": 8.920609397454381e-06,
|
||||
"loss": 0.6051533203125,
|
||||
"step": 10000
|
||||
},
|
||||
{
|
||||
"epoch": 1.6051805910251733,
|
||||
"grad_norm": 2.5614175915079387,
|
||||
"learning_rate": 8.584710074466158e-06,
|
||||
"loss": 0.6031138916015625,
|
||||
"step": 11000
|
||||
},
|
||||
{
|
||||
"epoch": 1.7511127325793505,
|
||||
"grad_norm": 1.5472599757402412,
|
||||
"learning_rate": 8.211639623780629e-06,
|
||||
"loss": 0.6085886840820313,
|
||||
"step": 12000
|
||||
},
|
||||
{
|
||||
"epoch": 1.897044874133528,
|
||||
"grad_norm": 2.384688518854998,
|
||||
"learning_rate": 7.805266544962458e-06,
|
||||
"loss": 0.6080531616210938,
|
||||
"step": 13000
|
||||
},
|
||||
{
|
||||
"epoch": 2.042904049616928,
|
||||
"grad_norm": 2.0076063347622974,
|
||||
"learning_rate": 7.3698046643160645e-06,
|
||||
"loss": 0.520530029296875,
|
||||
"step": 14000
|
||||
},
|
||||
{
|
||||
"epoch": 2.1888361911711054,
|
||||
"grad_norm": 1.529742164922155,
|
||||
"learning_rate": 6.909769440229038e-06,
|
||||
"loss": 0.33792144775390626,
|
||||
"step": 15000
|
||||
},
|
||||
{
|
||||
"epoch": 2.334768332725283,
|
||||
"grad_norm": 2.116689548920815,
|
||||
"learning_rate": 6.4299311407857035e-06,
|
||||
"loss": 0.3347291259765625,
|
||||
"step": 16000
|
||||
},
|
||||
{
|
||||
"epoch": 2.48070047427946,
|
||||
"grad_norm": 1.8084278631560584,
|
||||
"learning_rate": 5.935265379168761e-06,
|
||||
"loss": 0.3385657958984375,
|
||||
"step": 17000
|
||||
},
|
||||
{
|
||||
"epoch": 2.6266326158336373,
|
||||
"grad_norm": 3.29945063597593,
|
||||
"learning_rate": 5.430901519764892e-06,
|
||||
"loss": 0.33349261474609376,
|
||||
"step": 18000
|
||||
},
|
||||
{
|
||||
"epoch": 2.7725647573878147,
|
||||
"grad_norm": 1.9290178050582503,
|
||||
"learning_rate": 4.9220694899697185e-06,
|
||||
"loss": 0.3383995361328125,
|
||||
"step": 19000
|
||||
},
|
||||
{
|
||||
"epoch": 2.918496898941992,
|
||||
"grad_norm": 1.8157318709036212,
|
||||
"learning_rate": 4.414045549219315e-06,
|
||||
"loss": 0.3316441650390625,
|
||||
"step": 20000
|
||||
},
|
||||
{
|
||||
"epoch": 3.064356074425392,
|
||||
"grad_norm": 3.0277622115117175,
|
||||
"learning_rate": 3.912097577588397e-06,
|
||||
"loss": 0.2421361541748047,
|
||||
"step": 21000
|
||||
},
|
||||
{
|
||||
"epoch": 3.2102882159795696,
|
||||
"grad_norm": 2.0816758739547914,
|
||||
"learning_rate": 3.4214304512770823e-06,
|
||||
"loss": 0.1313203887939453,
|
||||
"step": 22000
|
||||
},
|
||||
{
|
||||
"epoch": 3.356220357533747,
|
||||
"grad_norm": 1.739691217957409,
|
||||
"learning_rate": 2.9471320714071095e-06,
|
||||
"loss": 0.12995486450195312,
|
||||
"step": 23000
|
||||
},
|
||||
{
|
||||
"epoch": 3.502152499087924,
|
||||
"grad_norm": 3.1257187709887875,
|
||||
"learning_rate": 2.4941206057740675e-06,
|
||||
"loss": 0.1304095458984375,
|
||||
"step": 24000
|
||||
},
|
||||
{
|
||||
"epoch": 3.6480846406421015,
|
||||
"grad_norm": 2.2140995652592785,
|
||||
"learning_rate": 2.06709349062457e-06,
|
||||
"loss": 0.12645170593261718,
|
||||
"step": 25000
|
||||
},
|
||||
{
|
||||
"epoch": 3.7940167821962785,
|
||||
"grad_norm": 1.7680132762507759,
|
||||
"learning_rate": 1.6704787212769829e-06,
|
||||
"loss": 0.12362543487548829,
|
||||
"step": 26000
|
||||
},
|
||||
{
|
||||
"epoch": 3.939948923750456,
|
||||
"grad_norm": 3.186667247027872,
|
||||
"learning_rate": 1.3083889366705216e-06,
|
||||
"loss": 0.11934644317626954,
|
||||
"step": 27000
|
||||
},
|
||||
{
|
||||
"epoch": 4.085808099233856,
|
||||
"grad_norm": 0.9381402976600279,
|
||||
"learning_rate": 9.845787739562829e-07,
|
||||
"loss": 0.07250856018066407,
|
||||
"step": 28000
|
||||
},
|
||||
{
|
||||
"epoch": 4.231740240788033,
|
||||
"grad_norm": 1.5081719675375433,
|
||||
"learning_rate": 7.024059353355333e-07,
|
||||
"loss": 0.03657876205444336,
|
||||
"step": 29000
|
||||
},
|
||||
{
|
||||
"epoch": 4.377672382342211,
|
||||
"grad_norm": 1.3793894154463466,
|
||||
"learning_rate": 4.64796370857008e-07,
|
||||
"loss": 0.035053966522216796,
|
||||
"step": 30000
|
||||
},
|
||||
{
|
||||
"epoch": 4.523604523896388,
|
||||
"grad_norm": 1.9377667427717677,
|
||||
"learning_rate": 2.7421393820510846e-07,
|
||||
"loss": 0.0349309196472168,
|
||||
"step": 31000
|
||||
},
|
||||
{
|
||||
"epoch": 4.669536665450566,
|
||||
"grad_norm": 1.109997862535006,
|
||||
"learning_rate": 1.326348540874095e-07,
|
||||
"loss": 0.03447756195068359,
|
||||
"step": 32000
|
||||
},
|
||||
{
|
||||
"epoch": 4.815468807004743,
|
||||
"grad_norm": 1.152236730081828,
|
||||
"learning_rate": 4.152720214406214e-08,
|
||||
"loss": 0.03444968414306641,
|
||||
"step": 33000
|
||||
},
|
||||
{
|
||||
"epoch": 4.96140094855892,
|
||||
"grad_norm": 1.6457557752833996,
|
||||
"learning_rate": 1.8357098688476238e-09,
|
||||
"loss": 0.034835365295410155,
|
||||
"step": 34000
|
||||
},
|
||||
{
|
||||
"epoch": 5.0,
|
||||
"step": 34265,
|
||||
"total_flos": 481722301939712.0,
|
||||
"train_loss": 0.401988563902201,
|
||||
"train_runtime": 92209.7944,
|
||||
"train_samples_per_second": 2.973,
|
||||
"train_steps_per_second": 0.372
|
||||
}
|
||||
],
|
||||
"logging_steps": 1000,
|
||||
"max_steps": 34265,
|
||||
"num_input_tokens_seen": 0,
|
||||
"num_train_epochs": 5,
|
||||
"save_steps": 50000,
|
||||
"stateful_callbacks": {
|
||||
"TrainerControl": {
|
||||
"args": {
|
||||
"should_epoch_stop": false,
|
||||
"should_evaluate": false,
|
||||
"should_log": false,
|
||||
"should_save": true,
|
||||
"should_training_stop": true
|
||||
},
|
||||
"attributes": {}
|
||||
}
|
||||
},
|
||||
"total_flos": 481722301939712.0,
|
||||
"train_batch_size": 1,
|
||||
"trial_name": null,
|
||||
"trial_params": null
|
||||
}
|
||||
3
training_args.bin
Normal file
3
training_args.bin
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:aeba44e7611f40dbc5cb19262d1f7cf185351624bc850381dceb5317d44a57f4
|
||||
size 7377
|
||||
BIN
training_loss.png
Normal file
BIN
training_loss.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 34 KiB |
Reference in New Issue
Block a user