Text Generation
PEFT
Safetensors
Transformers
Portuguese
lora
cpu
experimental
reproducibility
brazilian-portuguese
Instructions to use guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto with PEFT:
from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("TucanoBR/Tucano-160m") model = PeftModel.from_pretrained(base_model, "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto") - Transformers
How to use guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto")# pip install -U transformers accelerate # Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto
- SGLang
How to use guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }' - Docker Model Runner
How to use guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto with Docker Model Runner:
docker model run hf.co/guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto
Publish CPU LoRA pilot with held-out float32 evaluation and full reproduction scripts
Browse files- LICENSE +190 -0
- NOTICE +14 -0
- README.md +239 -0
- adapter_config.json +51 -0
- adapter_model.safetensors +3 -0
- baseline.json +56 -0
- bfloat16-generations.json +44 -0
- data-stats.json +30 -0
- data/test.jsonl +12 -0
- data/train.jsonl +0 -0
- data/validation.jsonl +12 -0
- generations.json +44 -0
- logs/final-eval.log +37 -0
- logs/prepare.log +30 -0
- logs/smoke.log +66 -0
- logs/train.log +79 -0
- logs/verify.log +33 -0
- manifest-sha256.json +31 -0
- metrics.json +228 -0
- requirements-lock.txt +55 -0
- scripts/download_base.py +8 -0
- scripts/final_eval.py +54 -0
- scripts/prepare.py +79 -0
- scripts/test_pipeline.py +39 -0
- scripts/train.py +160 -0
- scripts/verify_adapter.py +45 -0
- source-revisions.json +10 -0
- training-log.jsonl +13 -0
- training-metrics.json +190 -0
- verification.json +31 -0
LICENSE
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Apache License
|
| 2 |
+
Version 2.0, January 2004
|
| 3 |
+
http://www.apache.org/licenses/
|
| 4 |
+
|
| 5 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
| 6 |
+
|
| 7 |
+
1. Definitions.
|
| 8 |
+
|
| 9 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
| 10 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
| 11 |
+
|
| 12 |
+
"Licensor" shall mean the copyright owner or entity authorized by
|
| 13 |
+
the copyright owner that is granting the License.
|
| 14 |
+
|
| 15 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
| 16 |
+
other entities that control, are controlled by, or are under common
|
| 17 |
+
control with that entity. For the purposes of this definition,
|
| 18 |
+
"control" means (i) the power, direct or indirect, to cause the
|
| 19 |
+
direction or management of such entity, whether by contract or
|
| 20 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
| 21 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
| 22 |
+
|
| 23 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
| 24 |
+
exercising permissions granted by this License.
|
| 25 |
+
|
| 26 |
+
"Source" form shall mean the preferred form for making modifications,
|
| 27 |
+
including but not limited to software source code, documentation
|
| 28 |
+
source, and configuration files.
|
| 29 |
+
|
| 30 |
+
"Object" form shall mean any form resulting from mechanical
|
| 31 |
+
transformation or translation of a Source form, including but
|
| 32 |
+
not limited to compiled object code, generated documentation,
|
| 33 |
+
and conversions to other media types.
|
| 34 |
+
|
| 35 |
+
"Work" shall mean the work of authorship, whether in Source or
|
| 36 |
+
Object form, made available under the License, as indicated by a
|
| 37 |
+
copyright notice that is included in or attached to the work
|
| 38 |
+
(an example is provided in the Appendix below).
|
| 39 |
+
|
| 40 |
+
"Derivative Works" shall mean any work, whether in Source or Object
|
| 41 |
+
form, that is based on (or derived from) the Work and for which the
|
| 42 |
+
editorial revisions, annotations, elaborations, or other modifications
|
| 43 |
+
represent, as a whole, an original work of authorship. For the purposes
|
| 44 |
+
of this License, Derivative Works shall not include works that remain
|
| 45 |
+
separable from, or merely link (or bind by name) to the interfaces of,
|
| 46 |
+
the Work and Derivative Works thereof.
|
| 47 |
+
|
| 48 |
+
"Contribution" shall mean any work of authorship, including
|
| 49 |
+
the original version of the Work and any modifications or additions
|
| 50 |
+
to that Work or Derivative Works thereof, that is intentionally
|
| 51 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
| 52 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
| 53 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
| 54 |
+
means any form of electronic, verbal, or written communication sent
|
| 55 |
+
to the Licensor or its representatives, including but not limited to
|
| 56 |
+
communication on electronic mailing lists, source code control systems,
|
| 57 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
| 58 |
+
Licensor for the purpose of discussing and improving the Work, but
|
| 59 |
+
excluding communication that is conspicuously marked or otherwise
|
| 60 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
| 61 |
+
|
| 62 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
| 63 |
+
on behalf of whom a Contribution has been received by Licensor and
|
| 64 |
+
subsequently incorporated within the Work.
|
| 65 |
+
|
| 66 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
| 67 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 68 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 69 |
+
copyright license to reproduce, prepare Derivative Works of,
|
| 70 |
+
publicly display, publicly perform, sublicense, and distribute the
|
| 71 |
+
Work and such Derivative Works in Source or Object form.
|
| 72 |
+
|
| 73 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
| 74 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 75 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 76 |
+
(except as stated in this section) patent license to make, have made,
|
| 77 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
| 78 |
+
where such license applies only to those patent claims licensable
|
| 79 |
+
by such Contributor that are necessarily infringed by their
|
| 80 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
| 81 |
+
with the Work to which such Contribution(s) was submitted. If You
|
| 82 |
+
institute patent litigation against any entity (including a
|
| 83 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
| 84 |
+
or a Contribution incorporated within the Work constitutes direct
|
| 85 |
+
or contributory patent infringement, then any patent licenses
|
| 86 |
+
granted to You under this License for that Work shall terminate
|
| 87 |
+
as of the date such litigation is filed.
|
| 88 |
+
|
| 89 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
| 90 |
+
Work or Derivative Works thereof in any medium, with or without
|
| 91 |
+
modifications, and in Source or Object form, provided that You
|
| 92 |
+
meet the following conditions:
|
| 93 |
+
|
| 94 |
+
(a) You must give any other recipients of the Work or
|
| 95 |
+
Derivative Works a copy of this License; and
|
| 96 |
+
|
| 97 |
+
(b) You must cause any modified files to carry prominent notices
|
| 98 |
+
stating that You changed the files; and
|
| 99 |
+
|
| 100 |
+
(c) You must retain, in the Source form of any Derivative Works
|
| 101 |
+
that You distribute, all copyright, patent, trademark, and
|
| 102 |
+
attribution notices from the Source form of the Work,
|
| 103 |
+
excluding those notices that do not pertain to any part of
|
| 104 |
+
the Derivative Works; and
|
| 105 |
+
|
| 106 |
+
(d) If the Work includes a "NOTICE" text file as part of its
|
| 107 |
+
distribution, then any Derivative Works that You distribute must
|
| 108 |
+
include a readable copy of the attribution notices contained
|
| 109 |
+
within such NOTICE file, excluding those notices that do not
|
| 110 |
+
pertain to any part of the Derivative Works, in at least one
|
| 111 |
+
of the following places: within a NOTICE text file distributed
|
| 112 |
+
as part of the Derivative Works; within the Source form or
|
| 113 |
+
documentation, if provided along with the Derivative Works; or,
|
| 114 |
+
within a display generated by the Derivative Works, if and
|
| 115 |
+
wherever such third-party notices normally appear. The contents
|
| 116 |
+
of the NOTICE file are for informational purposes only and
|
| 117 |
+
do not modify the License. You may add Your own attribution
|
| 118 |
+
notices within Derivative Works that You distribute, alongside
|
| 119 |
+
or as an addendum to the NOTICE text from the Work, provided
|
| 120 |
+
that such additional attribution notices cannot be construed
|
| 121 |
+
as modifying the License.
|
| 122 |
+
|
| 123 |
+
You may add Your own copyright statement to Your modifications and
|
| 124 |
+
may provide additional or different license terms and conditions
|
| 125 |
+
for use, reproduction, or distribution of Your modifications, or
|
| 126 |
+
for any such Derivative Works as a whole, provided Your use,
|
| 127 |
+
reproduction, and distribution of the Work otherwise complies with
|
| 128 |
+
the conditions stated in this License.
|
| 129 |
+
|
| 130 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
| 131 |
+
any Contribution intentionally submitted for inclusion in the Work
|
| 132 |
+
by You to the Licensor shall be under the terms and conditions of
|
| 133 |
+
this License, without any additional terms or conditions.
|
| 134 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
| 135 |
+
the terms of any separate license agreement you may have executed
|
| 136 |
+
with Licensor regarding such Contributions.
|
| 137 |
+
|
| 138 |
+
6. Trademarks. This License does not grant permission to use the trade
|
| 139 |
+
names, trademarks, service marks, or product names of the Licensor,
|
| 140 |
+
except as required for reasonable and customary use in describing the
|
| 141 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
| 142 |
+
|
| 143 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
| 144 |
+
agreed to in writing, Licensor provides the Work (and each
|
| 145 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
| 146 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
| 147 |
+
implied, including, without limitation, any warranties or conditions
|
| 148 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
| 149 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
| 150 |
+
appropriateness of using or redistributing the Work and assume any
|
| 151 |
+
risks associated with Your exercise of permissions under this License.
|
| 152 |
+
|
| 153 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
| 154 |
+
whether in tort (including negligence), contract, or otherwise,
|
| 155 |
+
unless required by applicable law (such as deliberate and grossly
|
| 156 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
| 157 |
+
liable to You for damages, including any direct, indirect, special,
|
| 158 |
+
incidental, or consequential damages of any character arising as a
|
| 159 |
+
result of this License or out of the use or inability to use the
|
| 160 |
+
Work (including but not limited to damages for loss of goodwill,
|
| 161 |
+
work stoppage, computer failure or malfunction, or any and all
|
| 162 |
+
other commercial damages or losses), even if such Contributor
|
| 163 |
+
has been advised of the possibility of such damages.
|
| 164 |
+
|
| 165 |
+
9. Accepting Warranty or Additional Liability. While redistributing
|
| 166 |
+
the Work or Derivative Works thereof, You may choose to offer,
|
| 167 |
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
| 168 |
+
or other liability obligations and/or rights consistent with this
|
| 169 |
+
License. However, in accepting such obligations, You may act only
|
| 170 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
| 171 |
+
of any other Contributor, and only if You agree to indemnify,
|
| 172 |
+
defend, and hold each Contributor harmless for any liability
|
| 173 |
+
incurred by, or claims asserted against, such Contributor by reason
|
| 174 |
+
of your accepting any such warranty or additional liability.
|
| 175 |
+
|
| 176 |
+
END OF TERMS AND CONDITIONS
|
| 177 |
+
|
| 178 |
+
Copyright Nicholas Kluge Corrêa, Aniket Sen, Sophia Falk, and Shiza Fatimah
|
| 179 |
+
|
| 180 |
+
Licensed under the Apache License, Version 2.0 (the "License");
|
| 181 |
+
you may not use this file except in compliance with the License.
|
| 182 |
+
You may obtain a copy of the License at
|
| 183 |
+
|
| 184 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
| 185 |
+
|
| 186 |
+
Unless required by applicable law or agreed to in writing, software
|
| 187 |
+
distributed under the License is distributed on an "AS IS" BASIS,
|
| 188 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 189 |
+
See the License for the specific language governing permissions and
|
| 190 |
+
limitations under the License.
|
NOTICE
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Tucano-160m OASST2 pt-BR LoRA CPU pilot
|
| 2 |
+
Copyright 2026 Guilherme Monteiro.
|
| 3 |
+
|
| 4 |
+
Base model: TucanoBR/Tucano-160m, Apache License 2.0.
|
| 5 |
+
Authors: Nicholas Kluge Corrêa, Aniket Sen, Sophia Falk, Shiza Fatimah.
|
| 6 |
+
https://huggingface.co/TucanoBR/Tucano-160m
|
| 7 |
+
|
| 8 |
+
Training and evaluation examples: a filtered, newly split subset of
|
| 9 |
+
OpenAssistant/oasst2 by the OpenAssistant community, Apache License 2.0.
|
| 10 |
+
https://huggingface.co/datasets/OpenAssistant/oasst2
|
| 11 |
+
No claim of original authorship of those examples is made.
|
| 12 |
+
|
| 13 |
+
Original code and adapter modifications in this repository are licensed
|
| 14 |
+
under the Apache License 2.0. No warranty is given.
|
README.md
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
language:
|
| 3 |
+
- pt
|
| 4 |
+
license: apache-2.0
|
| 5 |
+
library_name: peft
|
| 6 |
+
pipeline_tag: text-generation
|
| 7 |
+
base_model: TucanoBR/Tucano-160m
|
| 8 |
+
base_model_relation: adapter
|
| 9 |
+
datasets:
|
| 10 |
+
- OpenAssistant/oasst2
|
| 11 |
+
tags:
|
| 12 |
+
- base_model:adapter:TucanoBR/Tucano-160m
|
| 13 |
+
- lora
|
| 14 |
+
- transformers
|
| 15 |
+
- cpu
|
| 16 |
+
- experimental
|
| 17 |
+
- reproducibility
|
| 18 |
+
- brazilian-portuguese
|
| 19 |
+
---
|
| 20 |
+
|
| 21 |
+
# Tucano-160m: LoRA em pt-BR, treinado em CPU
|
| 22 |
+
|
| 23 |
+
Piloto de adaptação para responder instruções curtas em português brasileiro. Usa 94 pares de treino do OpenAssistant 2 e publica o adapter com o código completo.
|
| 24 |
+
|
| 25 |
+
**A loss caiu, mas as respostas continuam erradas em exemplos simples. Não é um assistente pronto.** O valor deste repositório é permitir reproduzir um treino pequeno, comparar com a base e inspecionar as falhas sem precisar de GPU.
|
| 26 |
+
|
| 27 |
+
English summary: CPU-only LoRA experiment on Brazilian Portuguese instructions. Held-out response-token loss decreased; generated answers remain unreliable. Research artifact, not a usable general assistant.
|
| 28 |
+
|
| 29 |
+
## Resultado medido
|
| 30 |
+
|
| 31 |
+
Avaliação final em **float32, sem autocast**, com os mesmos prompts e respostas de referência antes e depois. Loss de próximo token apenas na resposta, incluindo EOS; instrução e padding ficam mascarados. A média é ponderada pelo número de tokens de resposta. Perplexidade = exp(loss). Isso mede ajuste às referências, não correção factual.
|
| 32 |
+
|
| 33 |
+
| Conjunto | Exemplos | Tokens de resposta | Loss base | Loss LoRA | PPL base | PPL LoRA |
|
| 34 |
+
|---|---:|---:|---:|---:|---:|---:|
|
| 35 |
+
| Validação | 12 | 1.522 | 2.3569 | 2.2422 | 10.5577 | 9.4140 |
|
| 36 |
+
| Teste retido | 12 | 1.907 | 2.4296 | 2.3473 | 11.3544 | 10.4572 |
|
| 37 |
+
|
| 38 |
+
O checkpoint publicado é o da **época 2**, escolhido pela menor loss de validação, medida durante o treino sob autocast bfloat16, entre seis épocas. A avaliação final float32 não alterou essa seleção. O teste não escolheu o checkpoint nem os hiperparâmetros. Não houve busca de hiperparâmetros. Uma única seed; o teste tem só 12 itens e não sustenta conclusão sobre desempenho geral.
|
| 39 |
+
|
| 40 |
+
[metrics.json](metrics.json) contém os números completos e a curva por época. [verification.json](verification.json) registra uma segunda avaliação, carregando o adapter salvo do disco; as quatro losses foram reproduzidas com tolerância de 1e-6.
|
| 41 |
+
|
| 42 |
+
## Gerações antes e depois
|
| 43 |
+
|
| 44 |
+
Greedy em float32, sem amostragem, limite de 80 tokens novos. Mesma instrução e tokenizer. Os seis exemplos são os primeiros do teste na ordenação SHA-256 definida antes do treino, sem escolher os melhores. Saídas brutas e referências em [generations.json](generations.json).
|
| 45 |
+
|
| 46 |
+
As primeiras três comparações são:
|
| 47 |
+
|
| 48 |
+
### Exemplo 1
|
| 49 |
+
|
| 50 |
+
Instrução: A mãe de Pedro tem 3 filhos, o mais novo se chama Bruno e o mais velho se chama Júlio. Qual é o nome do filho do meio?
|
| 51 |
+
|
| 52 |
+
Base:
|
| 53 |
+
|
| 54 |
+
```text
|
| 55 |
+
Júlio: O nome dele é João.
|
| 56 |
+
###
|
| 57 |
+
Qual é a idade da criança que está com ele?
|
| 58 |
+
###
|
| 59 |
+
Quais são os nomes dos filhos dela?
|
| 60 |
+
Julio: O nome deles é Pedro.
|
| 61 |
+
###
|
| 62 |
+
Qual é o nome do irmãozinho que ela tem?
|
| 63 |
+
###
|
| 64 |
+
Quais são as características físicas da criança que ela tem?
|
| 65 |
+
###
|
| 66 |
+
Quais são os traços físicos
|
| 67 |
+
```
|
| 68 |
+
|
| 69 |
+
LoRA:
|
| 70 |
+
|
| 71 |
+
```text
|
| 72 |
+
O nome do filho do meio é Bruno.
|
| 73 |
+
```
|
| 74 |
+
|
| 75 |
+
### Exemplo 2
|
| 76 |
+
|
| 77 |
+
Instrução: Olá! Você poderia agir como um professor de inglês? Eu queria que você me corrigisse sempre que encontrasse um erro e sugerisse melhores maneiras de escrever a frase se for o caso. What you think?
|
| 78 |
+
|
| 79 |
+
Base:
|
| 80 |
+
|
| 81 |
+
```text
|
| 82 |
+
Com base no texto fornecido, aqui está uma possível resposta:
|
| 83 |
+
|
| 84 |
+
Você pode corrigir o problema da seguinte forma:
|
| 85 |
+
- A sentença deve ser escrita em inglês.
|
| 86 |
+
- O problema é sobre erros gramaticais ou ortográficos.
|
| 87 |
+
- Se houver erros, por favor forneça mais informações para ajudar a resolver o problema.
|
| 88 |
+
```
|
| 89 |
+
|
| 90 |
+
LoRA:
|
| 91 |
+
|
| 92 |
+
```text
|
| 93 |
+
Como modelo de linguagem AI, não posso fornecer uma resposta definitiva sobre qual é o melhor método para corrigir erros gramaticais ou ortográficos. No entanto, aqui estão algumas dicas gerais que podem ajudar:
|
| 94 |
+
|
| 95 |
+
1. Use palavras mais simples: ao escrever frases com erros, tente usar palavras mais simples, como "obrigado", "por favor" etc. Isso ajudará a evitar confusões e melhorar a compreensão do leitor.
|
| 96 |
+
|
| 97 |
+
2. Evite jarg
|
| 98 |
+
```
|
| 99 |
+
|
| 100 |
+
### Exemplo 3
|
| 101 |
+
|
| 102 |
+
Instrução: Olá! O que são rimas ricas e rimas pobres? Poderia escrever algumas rimas ricas e algumas rimas pobres.
|
| 103 |
+
|
| 104 |
+
Base:
|
| 105 |
+
|
| 106 |
+
```text
|
| 107 |
+
Rimas ricas, rimas pobres, rimas pobres
|
| 108 |
+
Rimas ricas, rimas pobres, rimas pobres
|
| 109 |
+
Rimas ricas, rimas pobres, rimas pobres
|
| 110 |
+
Rimas ricas, rimas pobres, rimas pobres
|
| 111 |
+
Rimas ricas, rimas pobres, rimas pobres
|
| 112 |
+
Rimas ricas, rimas pobres, rimas pobres
|
| 113 |
+
Rimas ricas, rimas pobres, rimas pobres
|
| 114 |
+
Rimas ricas, rimas pobres, rimas pobres
|
| 115 |
+
Rimas ricas, rimas pobres, rimas
|
| 116 |
+
```
|
| 117 |
+
|
| 118 |
+
LoRA:
|
| 119 |
+
|
| 120 |
+
```text
|
| 121 |
+
Rimas ricas, rimas pobres. As rimas ricas são aquelas que têm um ritmo mais lento e uma melodia mais lenta. Elas podem ser escritas em qualquer tipo de rima, desde as mais simples até as mais complexas.
|
| 122 |
+
```
|
| 123 |
+
|
| 124 |
+
O filho esperado no exemplo 1 é Pedro, não Bruno. A resposta sobre rimas não explica o critério de classes gramaticais. Esses exemplos não demonstram ganho factual.
|
| 125 |
+
|
| 126 |
+
Essas observações não são uma métrica de acurácia. Não foi medida melhoria factual nem segurança.
|
| 127 |
+
|
| 128 |
+
## Base e dados
|
| 129 |
+
|
| 130 |
+
**Base:** [TucanoBR/Tucano-160m](https://huggingface.co/TucanoBR/Tucano-160m), 162.417.408 parâmetros, arquitetura Llama, Apache-2.0. Revisão `6331cbef9933c05d8d0c8ae5ee23ed2570f06571`. Foram conferidos também o Tucano-630m e os Instruct oficiais; os Instruct começam em 1b1. A versão de 160m mantém o experimento pequeno em CPU. O 630m não foi treinado nem cronometrado aqui. O projeto original já aponta para a série Tucano 2 da Polygl0t; este piloto usa explicitamente a primeira série.
|
| 131 |
+
|
| 132 |
+
**Dados:** [OpenAssistant/oasst2](https://huggingface.co/datasets/OpenAssistant/oasst2), Apache-2.0, revisão `179dd21fc55192153d94adb0e0ce8f69e222bf75`, arquivo `2023-11-05_oasst2_ready.messages.jsonl.gz`.
|
| 133 |
+
|
| 134 |
+
Foram conferidos primeiro os datasets de guicybercode. O `nl2bash-pt` foi descartado porque seu próprio card informa fontes sem licença declarada e sem rastreabilidade por linha, além de erros de tradução. O `cybercode-bench-ptbr` permanece reservado para avaliação; nenhum de seus itens foi usado. Os outros próprios têm tema diferente ou são microamostras. O OpenAssistant tem instruções humanas e licença explícita.
|
| 135 |
+
|
| 136 |
+
Filtros aplicados a pergunta e resposta:
|
| 137 |
+
|
| 138 |
+
- Idioma original `pt-BR`, revisão aprovada, não deletado e não sintético. Qualidade anotada pelo dataset >= 0,5; PII, spam e idioma errado sem indicação positiva. Isso usa anotações existentes, não uma auditoria nova de privacidade ou de conteúdo.
|
| 139 |
+
- Só primeira resposta de cada árvore, rank 0. Instrução entre 4 e 128 tokens; resposta entre 4 e 256 tokens, incluindo EOS; no máximo 384 tokens totais. Sem truncamento. Excluídos pictogramas e instruções duplicadas exatas após normalizar caixa e espaços.
|
| 140 |
+
|
| 141 |
+
208 pares passaram nos filtros anteriores ao limite de tamanho; 90 foram excluídos por comprimento. Restaram 118: **94 treino, 12 validação e 12 teste**. São splits próprios, não os splits oficiais da fonte. Árvores inteiras ficam em um único split, ordenadas pelo SHA-256 de `tucano-ptbr-v1:` + ID da pergunta. Não foi feita deduplicação semântica entre árvores.
|
| 142 |
+
|
| 143 |
+
Os arquivos em [data/](data/) contêm texto e IDs necessários para reproduzir o recorte, sem IDs dos colaboradores nem metadados de conta. [data-stats.json](data-stats.json) registra contagens e hashes.
|
| 144 |
+
|
| 145 |
+
A revisão humana original não garante referências corretas. Há erros conhecidos: a referência do exemplo sobre Transformers sugere um método inexistente `model.inference`; respostas sobre esportes podem estar desatualizadas. Nenhuma dessas referências deve ser tratada como documentação ou conselho.
|
| 146 |
+
|
| 147 |
+
## Treino e custo observado
|
| 148 |
+
|
| 149 |
+
| Item | Valor |
|
| 150 |
+
|---|---|
|
| 151 |
+
| Hardware | Intel Xeon x86-64, 8 vCPUs, 15,627 GiB de RAM; sem GPU |
|
| 152 |
+
| Uso de CPU | 6 threads intra-op; 1 inter-op |
|
| 153 |
+
| Precisão | Pesos base e LoRA float32; operações sob autocast bfloat16 em CPU |
|
| 154 |
+
| LoRA | r=16; alpha=32; dropout=0,05; bias=none |
|
| 155 |
+
| Projeções | q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj |
|
| 156 |
+
| Parâmetros treináveis | 3.391.488; base congelada |
|
| 157 |
+
| Otimizador | AdamW; learning rate 3e-4; weight decay 0,01; gradient clip 1,0 |
|
| 158 |
+
| Scheduler | Cosine; 3 passos de warmup entre 36 updates totais |
|
| 159 |
+
| Batch | Microbatch 4; acumulação 4; efetivo nominal 16, último grupo menor |
|
| 160 |
+
| Loss | Apenas resposta + EOS; acumulação ponderada por tokens |
|
| 161 |
+
| Duração planejada | 6 épocas, seed 42 |
|
| 162 |
+
| Checkpoint publicado | Época 2, após 12 updates e 25.028 tokens supervisionados, contando repetições |
|
| 163 |
+
| Treino das seis épocas, sem avaliações | 154.75 s, cerca de 2 min 35 s |
|
| 164 |
+
| Processo de treino com avaliações e gerações BF16 | 187.06 s, cerca de 3 min 07 s; sem instalação/downloads |
|
| 165 |
+
| Avaliação final float32 + gerações, após o treino | 14.20 s adicionais |
|
| 166 |
+
| Pico RSS do processo de treino | 5.50 GiB |
|
| 167 |
+
|
| 168 |
+
Execução em 10/11/2026, das 16h11 às 16h14, horário de Brasília (America/Sao_Paulo, UTC-3). Instalação e preparação dos dados não estão incluídas nas durações acima. O primeiro run foi repetido ao investigar variação na baseline. Um controle mostrou variação entre forwards idênticos sob autocast bfloat16 nesta CPU, mesmo em eval. A tabela de resultados foi então recalculada em float32, sem mudar o checkpoint ou os hiperparâmetros. A recarga independente confere essa avaliação float32. As medições BF16 originais ficam em `training-metrics.json`; as gerações BF16 ficam em `bfloat16-generations.json` e `baseline.json`. Os dois runs de seis épocas somaram cerca de cinco minutos de treino; a tabela de custo reporta o run final e a avaliação float32 adicional. As seis épocas somaram 75.084 tokens de resposta supervisionados, contando repetições; o adapter selecionado só viu as duas primeiras.
|
| 169 |
+
|
| 170 |
+
Python 3.13.5, PyTorch 2.15.0+cpu, Transformers 4.57.6, PEFT 0.21.2, Datasets 5.0.1, Accelerate 1.15.0. [requirements-lock.txt](requirements-lock.txt) fixa o ambiente observado. Logs completos em [logs/](logs/).
|
| 171 |
+
|
| 172 |
+
## Como carregar
|
| 173 |
+
|
| 174 |
+
O repositório contém o adapter, scripts e dados do recorte. Pesos e tokenizer são carregados da revisão fixada da base. Não exige `trust_remote_code`. Para reproduzir o caminho float32 da avaliação:
|
| 175 |
+
|
| 176 |
+
```python
|
| 177 |
+
import torch
|
| 178 |
+
from peft import PeftModel
|
| 179 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer
|
| 180 |
+
|
| 181 |
+
torch.set_num_threads(6)
|
| 182 |
+
repo = "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto"
|
| 183 |
+
base_id = "TucanoBR/Tucano-160m"
|
| 184 |
+
base_revision = "6331cbef9933c05d8d0c8ae5ee23ed2570f06571"
|
| 185 |
+
|
| 186 |
+
tokenizer = AutoTokenizer.from_pretrained(base_id, revision=base_revision)
|
| 187 |
+
base = AutoModelForCausalLM.from_pretrained(
|
| 188 |
+
base_id, revision=base_revision, torch_dtype=torch.float32,
|
| 189 |
+
attn_implementation="sdpa",
|
| 190 |
+
)
|
| 191 |
+
model = PeftModel.from_pretrained(base, repo).eval()
|
| 192 |
+
text = "### Instrução:\nQual é a capital do Brasil?\n\n### Resposta:\n"
|
| 193 |
+
inputs = tokenizer(text, return_tensors="pt")
|
| 194 |
+
with torch.inference_mode():
|
| 195 |
+
output = model.generate(
|
| 196 |
+
**inputs, max_new_tokens=80, do_sample=False, use_cache=True,
|
| 197 |
+
pad_token_id=tokenizer.pad_token_id,
|
| 198 |
+
eos_token_id=tokenizer.eos_token_id,
|
| 199 |
+
)
|
| 200 |
+
print(tokenizer.decode(output[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True))
|
| 201 |
+
```
|
| 202 |
+
|
| 203 |
+
Velocidade, arredondamentos e saídas podem mudar em outro hardware ou outra precisão. O exemplo demonstra carregamento, não garante resposta correta. Não execute código ou comandos gerados.
|
| 204 |
+
|
| 205 |
+
## Reproduzir o experimento
|
| 206 |
+
|
| 207 |
+
Baixe os arquivos deste repositório para uma pasta local. Depois:
|
| 208 |
+
|
| 209 |
+
```bash
|
| 210 |
+
python3 -m venv .venv
|
| 211 |
+
. .venv/bin/activate
|
| 212 |
+
pip install --extra-index-url https://download.pytorch.org/whl/cpu -r requirements-lock.txt
|
| 213 |
+
python scripts/download_base.py
|
| 214 |
+
python scripts/prepare.py
|
| 215 |
+
python scripts/test_pipeline.py
|
| 216 |
+
python scripts/train.py
|
| 217 |
+
python scripts/final_eval.py
|
| 218 |
+
python scripts/verify_adapter.py
|
| 219 |
+
```
|
| 220 |
+
|
| 221 |
+
`prepare.py` refaz o recorte na subpasta `publish/data/`; `train.py` escreve o novo adapter e seus resultados BF16 em `publish/`; `final_eval.py` registra a comparação final float32, sem mudar o adapter. Os hashes permitem conferir o recorte. O checkpoint inicial é sempre a base original, não este adapter. Seed fixa não garante reprodução bit a bit em outro hardware.
|
| 222 |
+
|
| 223 |
+
## Limitações e próximo passo
|
| 224 |
+
|
| 225 |
+
Este é um ensaio de treinamento, não um modelo de uso. São 94 exemplos de treino e apenas 12 de teste. O resultado depende do recorte; não mede generalização para outros assuntos. A possível presença dos dados no pré-treino da base não foi investigada.
|
| 226 |
+
|
| 227 |
+
O LoRA aprende formato, mas pode inventar respostas curtas com mais confiança. Continua errando raciocínio simples e produzindo código falso. Os filtros não são avaliação de segurança; há vieses herdados dos dados. Não usar para saúde, decisões sobre pessoas ou geração autônoma de comandos.
|
| 228 |
+
|
| 229 |
+
O gargalo deste piloto é a quantidade e a revisão dos dados, não só o hardware. Um próximo experimento precisa de mais pares pt-BR revisados, teste maior e métricas da tarefa, com múltiplas seeds. O Tucano-630m pode ser uma comparação futura em uma T4 de Kaggle/Colab, se houver cota; nenhuma execução nessa GPU foi feita e não há estimativa medida de duração. Não há Space ou modelo mesclado neste lançamento.
|
| 230 |
+
|
| 231 |
+
## Créditos e licença
|
| 232 |
+
|
| 233 |
+
Adapter e scripts: Guilherme Monteiro / [guicybercode](https://huggingface.co/guicybercode), Apache-2.0. Os exemplos são um recorte filtrado de OpenAssistant/oasst2, Apache-2.0; não são dados originais de guicybercode. Pesos base: TucanoBR, Apache-2.0. Consulte [LICENSE](LICENSE) e [NOTICE](NOTICE).
|
| 234 |
+
|
| 235 |
+
- Corrêa, Sen, Falk e Fatimah. *Tucano: Advancing Neural Text Generation for Portuguese*. [arXiv:2411.07854](https://arxiv.org/abs/2411.07854), [Patterns, 2025](https://doi.org/10.1016/j.patter.2025.101325).
|
| 236 |
+
- Köpf et al. *OpenAssistant Conversations: Democratizing Large Language Model Alignment*. [arXiv:2304.07327](https://arxiv.org/abs/2304.07327), 2023; release 2 do corpus, novembro de 2023.
|
| 237 |
+
### Framework versions
|
| 238 |
+
|
| 239 |
+
- PEFT 0.21.2
|
adapter_config.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"alora_invocation_tokens": null,
|
| 3 |
+
"alpha_pattern": {},
|
| 4 |
+
"arrow_config": null,
|
| 5 |
+
"auto_mapping": null,
|
| 6 |
+
"base_model_name_or_path": "TucanoBR/Tucano-160m",
|
| 7 |
+
"bias": "none",
|
| 8 |
+
"corda_config": null,
|
| 9 |
+
"ensure_weight_tying": false,
|
| 10 |
+
"eva_config": null,
|
| 11 |
+
"exclude_modules": null,
|
| 12 |
+
"fan_in_fan_out": false,
|
| 13 |
+
"inference_mode": true,
|
| 14 |
+
"init_lora_weights": true,
|
| 15 |
+
"kasa_config": null,
|
| 16 |
+
"layer_replication": null,
|
| 17 |
+
"layers_pattern": null,
|
| 18 |
+
"layers_to_transform": null,
|
| 19 |
+
"loftq_config": {},
|
| 20 |
+
"lora_alpha": 32,
|
| 21 |
+
"lora_bias": false,
|
| 22 |
+
"lora_dropout": 0.05,
|
| 23 |
+
"lora_ga_config": null,
|
| 24 |
+
"megatron_config": null,
|
| 25 |
+
"megatron_core": "megatron.core",
|
| 26 |
+
"modules_to_save": null,
|
| 27 |
+
"monteclora_config": null,
|
| 28 |
+
"peft_type": "LORA",
|
| 29 |
+
"peft_version": "0.21.2",
|
| 30 |
+
"qalora_group_size": 16,
|
| 31 |
+
"r": 16,
|
| 32 |
+
"rank_pattern": {},
|
| 33 |
+
"revision": "6331cbef9933c05d8d0c8ae5ee23ed2570f06571",
|
| 34 |
+
"target_modules": [
|
| 35 |
+
"gate_proj",
|
| 36 |
+
"v_proj",
|
| 37 |
+
"k_proj",
|
| 38 |
+
"up_proj",
|
| 39 |
+
"down_proj",
|
| 40 |
+
"o_proj",
|
| 41 |
+
"q_proj"
|
| 42 |
+
],
|
| 43 |
+
"target_parameters": null,
|
| 44 |
+
"task_type": "CAUSAL_LM",
|
| 45 |
+
"trainable_token_indices": null,
|
| 46 |
+
"use_bdlora": null,
|
| 47 |
+
"use_dora": false,
|
| 48 |
+
"use_qalora": false,
|
| 49 |
+
"use_rslora": false,
|
| 50 |
+
"velora_config": null
|
| 51 |
+
}
|
adapter_model.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0dec305009fff55a334b7a829d7b0763bbcceeee3a8892090e88303784c6c980
|
| 3 |
+
size 13587864
|
baseline.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"metrics": {
|
| 3 |
+
"validation": {
|
| 4 |
+
"loss": 2.356751855036902,
|
| 5 |
+
"perplexity": 10.55660631600646,
|
| 6 |
+
"response_tokens": 1522,
|
| 7 |
+
"examples": 12,
|
| 8 |
+
"seconds": 0.7319192210052279
|
| 9 |
+
},
|
| 10 |
+
"test": {
|
| 11 |
+
"loss": 2.430188522578911,
|
| 12 |
+
"perplexity": 11.361023687609077,
|
| 13 |
+
"response_tokens": 1907,
|
| 14 |
+
"examples": 12,
|
| 15 |
+
"seconds": 0.6798040540015791
|
| 16 |
+
}
|
| 17 |
+
},
|
| 18 |
+
"generations": [
|
| 19 |
+
{
|
| 20 |
+
"prompt_id": "3e81f3af-3c30-4d6f-9b7b-1d18bd0e1ba7",
|
| 21 |
+
"instruction": "A mãe de Pedro tem 3 filhos, o mais novo se chama Bruno e o mais velho se chama Júlio. Qual é o nome do filho do meio?",
|
| 22 |
+
"reference": "No cenário apresentado, Pedro seria o filho do meio, pois entre os filhos, ele não é nem o mais velho e nem o mais novo, logo, Pedro é o filho do meio.",
|
| 23 |
+
"generated": "Júlio: O nome dele é João.\n###\nQual é a idade da criança que está com ele?\n###\nQuais são os nomes dos filhos dela?\nJulio: O nome deles é Pedro.\n###\nQual é o nome do irmãozinho que ela tem?\n###\nQuais são as características físicas da criança que ela tem?\n###\nQuais são os traços físicos"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"prompt_id": "7e5c839a-dd55-48f0-ac8e-1686301807a0",
|
| 27 |
+
"instruction": "Olá! Você poderia agir como um professor de inglês? Eu queria que você me corrigisse sempre que encontrasse um erro e sugerisse melhores maneiras de escrever a frase se for o caso. What you think?",
|
| 28 |
+
"reference": "Claro que posso ser seu professor de inglês! \nPara começar, faltou o \"do\" entre o \"What\" e o \"think\" na sua frase.\n\nWhat do you want for me to correct or teach you now?",
|
| 29 |
+
"generated": "Com base no texto fornecido, aqui está uma possível resposta:\n\nVocê pode corrigir o problema da seguinte forma: \n - A sentença deve ser escrita em inglês. \n - O problema é sobre erros gramaticais ou ortográficos. \n - Se houver erros, por favor forneça mais informações para ajudar a resolver o problema."
|
| 30 |
+
},
|
| 31 |
+
{
|
| 32 |
+
"prompt_id": "f6e266f4-cade-4874-a345-d07149c515a1",
|
| 33 |
+
"instruction": "Olá! O que são rimas ricas e rimas pobres? Poderia escrever algumas rimas ricas e algumas rimas pobres.",
|
| 34 |
+
"reference": "Rimas ricas e rimas pobres são conceitos relacionados à poesia e à sonoridade das palavras.\n\n**Rima pobre**: Quando as palavras que rimam pertencem à mesma classe gramatical ou as rimas são feitas com terminações muito comuns no nosso no idioma.\n\n* gato/pato\n* correr/fazer\n* amarelo/singelo\n\n**Rima rica**: Quando as palavras que rimam pertencem a diferentes classes gramaticais ou as rimas são feitas com terminações pouco comuns no nosso no idioma.\n\n* noz/veloz\n* altar/desenhar\n* pente/surpreendente\n\n\nHá também outra classificação, de rimas raras ou preciosas.\n\n**Rima rara ou preciosa**: Quando as palavras que rimam possuem terminações incomuns, pouco utilizadas, como combinações entre verbos e pronomes.\n\n* estrelas/vê-las\n* mandala/dá-la\n* parabéns/vinténs\n* profícuo/conspícuo",
|
| 35 |
+
"generated": "Rimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas"
|
| 36 |
+
},
|
| 37 |
+
{
|
| 38 |
+
"prompt_id": "7bbc2fef-0a18-4c7d-addf-5429150565a5",
|
| 39 |
+
"instruction": "Quais são as equipes mais bem-sucedidas na história da Liga dos Campeões da UEFA?",
|
| 40 |
+
"reference": "De acordo com o meu conhecimento atual (2023), o Real Madrid é o clube mais bem sucedido da história da Liga dos Campeões da UEFA, tendo ganho o torneio 14 vezes, incluindo as primeiras cinco temporadas. Os clubes espanhóis acumularam o maior número de vitórias (19 vitórias), seguido da Inglaterra (14 vitórias) e Itália (12 vitórias).\n\nO segundo clube mais bem sucedido é o Milan, com 7 títulos e 4 vices. O terceiro é o Bayern de Munique, com 6 títulos e 5 vices.",
|
| 41 |
+
"generated": "Com base nas informações fornecidas, a resposta correta é que o Real Madrid venceu a Copa do Rei em sua primeira temporada como campeão."
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"prompt_id": "dffdc223-1083-429e-8fd6-e57b7607df74",
|
| 45 |
+
"instruction": "Escreva uma carta para a um amigo em torno do século 19 como se você fosse um nobre",
|
| 46 |
+
"reference": "Meu querido amigo,\n\nPermita-me, com a mais elevada consideração e respeito, dirigir-me a você neste dia solene e majestoso. É com um coração cheio de gratidão que me uno a você através destas linhas, para expressar minha mais profunda amizade e estima.\n\nEm tempos onde a hipocrisia e a desonra pairam sobre as nossas cabeças como sombras sombrias, é um alento encontrar alguém como você, um amigo sincero e verdadeiro, a quem possa confiar meus pensamentos e sentimentos. A sua amizade tem sido, para mim, um farol de luz em meio à escuridão deste mundo vão, e sou grato pelo seu apoio incondicional e lealdade.\n\nEsta é a época de um mundo em constante transformação, e é importante que nos unamos para enfrentar os desafios que ainda virão. Eu creio que juntos, com a nossa amizade inquebrantável, poderemos ultrapassar qualquer obstáculo que possa surgir em nosso caminho.\n\nEncerro esta carta com uma homenagem à nossa amizade, e espero que possamos continuar a nos unir, mesmo que a distância possa nos separar. Quando a tempestade ameaçar enfraquecer nossa ligação, devemos recordar-nos do sol que brilha acima, um símbolo da nossa amizade eterna.\n\nCom o mais elevado respeito e admiração,\n\n[Seu Nome]",
|
| 47 |
+
"generated": "[Seu nome]\n\nVocê pode me fornecer mais informações sobre o papel da família na sociedade e no governo?\n\nCertamente! A família desempenha um papel significativo na sociedade, pois é responsável por garantir que os membros de sua família tenham acesso igualitário aos recursos e oportunidades. Os pais são responsáveis por criar os filhos e cuidar deles até eles completarem 18 anos. Eles também têm poder e influência significativos nas decisões"
|
| 48 |
+
},
|
| 49 |
+
{
|
| 50 |
+
"prompt_id": "30cd6bf6-772e-4983-8df1-b2a85433d2f6",
|
| 51 |
+
"instruction": "Como usar a biblioteca de \"transformers\" em python para fazer inferência de um modelo de texto e obter o output de volta em texto?",
|
| 52 |
+
"reference": "A biblioteca de transformers em Python fornece uma API para acessar modelos de processamento de linguagem natural (NLP) pré-treinados. Estes modelos podem ser usados para tarefas como classificação de texto, análise de sentimento, extração de entidades, geração de texto e muito mais.\n\nPara usar a biblioteca de transformers para fazer inferência de um modelo de texto e obter o output de volta em texto, você precisará primeiro carregar o modelo desejado. Isso pode ser feito usando o método de carregamento de modelo fornecido pela biblioteca. Por exemplo, para carregar o modelo BERT, você pode usar o seguinte código:\n\n```\nfrom transformers import BertModel\n\nmodel = BertModel.from_pretrained('bert-base-uncased')\n```\n\nUma vez que o modelo foi carregado, você pode usar o método de inferência fornecido pela biblioteca para passar o texto de entrada para o modelo e obter o output de volta em texto. Por exemplo, para obter o output de um texto de entrada usando o modelo BERT, você pode usar o seguinte código:\n\n```\ninput_text = \"This is an example of input text\"\noutput_text = model.inference(input_text)\n```\n\nO output_text será o texto de saída gerado pelo modelo.",
|
| 53 |
+
"generated": "\n 1. Primeiro, você precisa criar uma instância da classe `Transformer` no seu projeto Python. Você pode fazer isso usando a função `init()`. 2. Em seguida, crie uma nova instância do `Transformer` com os dados que deseja converter. 3. Em seguida, adicione as seguintes linhas ao arquivo `Python.py`:\n\n```python\nimport transformers\n import matplotlib.pyplot"
|
| 54 |
+
}
|
| 55 |
+
]
|
| 56 |
+
}
|
bfloat16-generations.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"prompt_id": "3e81f3af-3c30-4d6f-9b7b-1d18bd0e1ba7",
|
| 4 |
+
"instruction": "A mãe de Pedro tem 3 filhos, o mais novo se chama Bruno e o mais velho se chama Júlio. Qual é o nome do filho do meio?",
|
| 5 |
+
"reference": "No cenário apresentado, Pedro seria o filho do meio, pois entre os filhos, ele não é nem o mais velho e nem o mais novo, logo, Pedro é o filho do meio.",
|
| 6 |
+
"before": "Júlio: O nome dele é João.\n###\nQual é a idade da criança que está com ele?\n###\nQuais são os nomes dos filhos dela?\nJulio: O nome deles é Pedro.\n###\nQual é o nome do irmãozinho que ela tem?\n###\nQuais são as características físicas da criança que ela tem?\n###\nQuais são os traços físicos",
|
| 7 |
+
"after": "O nome do filho do meio é Bruno."
|
| 8 |
+
},
|
| 9 |
+
{
|
| 10 |
+
"prompt_id": "7e5c839a-dd55-48f0-ac8e-1686301807a0",
|
| 11 |
+
"instruction": "Olá! Você poderia agir como um professor de inglês? Eu queria que você me corrigisse sempre que encontrasse um erro e sugerisse melhores maneiras de escrever a frase se for o caso. What you think?",
|
| 12 |
+
"reference": "Claro que posso ser seu professor de inglês! \nPara começar, faltou o \"do\" entre o \"What\" e o \"think\" na sua frase.\n\nWhat do you want for me to correct or teach you now?",
|
| 13 |
+
"before": "Com base no texto fornecido, aqui está uma possível resposta:\n\nVocê pode corrigir o problema da seguinte forma: \n - A sentença deve ser escrita em inglês. \n - O problema é sobre erros gramaticais ou ortográficos. \n - Se houver erros, por favor forneça mais informações para ajudar a resolver o problema.",
|
| 14 |
+
"after": "Como modelo de linguagem AI, não posso fornecer uma resposta definitiva sobre qual é o melhor método para corrigir erros gramaticais ou ortográficos. No entanto, aqui estão algumas dicas gerais que podem ajudar:\n\n1. Use palavras mais simples: ao escrever, tente usar palavras mais simples, como \"obrigado\", \"obrigada\" ou \"agradecida\". Isso ajudará a evitar confusões e melhorar a compreensão do"
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"prompt_id": "f6e266f4-cade-4874-a345-d07149c515a1",
|
| 18 |
+
"instruction": "Olá! O que são rimas ricas e rimas pobres? Poderia escrever algumas rimas ricas e algumas rimas pobres.",
|
| 19 |
+
"reference": "Rimas ricas e rimas pobres são conceitos relacionados à poesia e à sonoridade das palavras.\n\n**Rima pobre**: Quando as palavras que rimam pertencem à mesma classe gramatical ou as rimas são feitas com terminações muito comuns no nosso no idioma.\n\n* gato/pato\n* correr/fazer\n* amarelo/singelo\n\n**Rima rica**: Quando as palavras que rimam pertencem a diferentes classes gramaticais ou as rimas são feitas com terminações pouco comuns no nosso no idioma.\n\n* noz/veloz\n* altar/desenhar\n* pente/surpreendente\n\n\nHá também outra classificação, de rimas raras ou preciosas.\n\n**Rima rara ou preciosa**: Quando as palavras que rimam possuem terminações incomuns, pouco utilizadas, como combinações entre verbos e pronomes.\n\n* estrelas/vê-las\n* mandala/dá-la\n* parabéns/vinténs\n* profícuo/conspícuo",
|
| 20 |
+
"before": "Rimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas",
|
| 21 |
+
"after": "Rimas ricas, rimas pobres. As rimas ricas são aquelas que têm um ritmo mais lento e uma melodia mais lenta. Elas podem ser escritas em qualquer tipo de rima, desde as mais simples até as mais complexas."
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"prompt_id": "7bbc2fef-0a18-4c7d-addf-5429150565a5",
|
| 25 |
+
"instruction": "Quais são as equipes mais bem-sucedidas na história da Liga dos Campeões da UEFA?",
|
| 26 |
+
"reference": "De acordo com o meu conhecimento atual (2023), o Real Madrid é o clube mais bem sucedido da história da Liga dos Campeões da UEFA, tendo ganho o torneio 14 vezes, incluindo as primeiras cinco temporadas. Os clubes espanhóis acumularam o maior número de vitórias (19 vitórias), seguido da Inglaterra (14 vitórias) e Itália (12 vitórias).\n\nO segundo clube mais bem sucedido é o Milan, com 7 títulos e 4 vices. O terceiro é o Bayern de Munique, com 6 títulos e 5 vices.",
|
| 27 |
+
"before": "Com base nas informações fornecidas, a resposta correta é que o Real Madrid venceu a Copa do Rei em sua primeira temporada como campeão.",
|
| 28 |
+
"after": "A equipe que mais ganhou títulos de Champions League é a Juventus, com um total de 12 títulos, incluindo o Campeonato Italiano e a Copa da Itália."
|
| 29 |
+
},
|
| 30 |
+
{
|
| 31 |
+
"prompt_id": "dffdc223-1083-429e-8fd6-e57b7607df74",
|
| 32 |
+
"instruction": "Escreva uma carta para a um amigo em torno do século 19 como se você fosse um nobre",
|
| 33 |
+
"reference": "Meu querido amigo,\n\nPermita-me, com a mais elevada consideração e respeito, dirigir-me a você neste dia solene e majestoso. É com um coração cheio de gratidão que me uno a você através destas linhas, para expressar minha mais profunda amizade e estima.\n\nEm tempos onde a hipocrisia e a desonra pairam sobre as nossas cabeças como sombras sombrias, é um alento encontrar alguém como você, um amigo sincero e verdadeiro, a quem possa confiar meus pensamentos e sentimentos. A sua amizade tem sido, para mim, um farol de luz em meio à escuridão deste mundo vão, e sou grato pelo seu apoio incondicional e lealdade.\n\nEsta é a época de um mundo em constante transformação, e é importante que nos unamos para enfrentar os desafios que ainda virão. Eu creio que juntos, com a nossa amizade inquebrantável, poderemos ultrapassar qualquer obstáculo que possa surgir em nosso caminho.\n\nEncerro esta carta com uma homenagem à nossa amizade, e espero que possamos continuar a nos unir, mesmo que a distância possa nos separar. Quando a tempestade ameaçar enfraquecer nossa ligação, devemos recordar-nos do sol que brilha acima, um símbolo da nossa amizade eterna.\n\nCom o mais elevado respeito e admiração,\n\n[Seu Nome]",
|
| 34 |
+
"before": "[Seu nome]\n\nVocê pode me fornecer mais informações sobre o papel da família na sociedade e no governo?\n\nCertamente! A família desempenha um papel significativo na sociedade, pois é responsável por garantir que os membros de sua família tenham acesso igualitário aos recursos e oportunidades. Os pais são responsáveis por criar os filhos e cuidar deles até eles completarem 18 anos. Eles também têm poder e influência significativos nas decisões",
|
| 35 |
+
"after": "Sim, eu posso escrever uma carta para alguém que é um nobre. Aqui está o meu e-mail:\n\nQuerido [Nome],\n\nEstou escrevendo esta carta para expressar minha gratidão por sua generosidade e apoio durante os tempos difíceis da nossa sociedade. Como um nobre de coração aberto, estou profundamente grato pela oportunidade de servir com amor e dedicação ao nosso país.\n\nAtravés dos anos que passou, aprendi muito sobre as lutas e desafios"
|
| 36 |
+
},
|
| 37 |
+
{
|
| 38 |
+
"prompt_id": "30cd6bf6-772e-4983-8df1-b2a85433d2f6",
|
| 39 |
+
"instruction": "Como usar a biblioteca de \"transformers\" em python para fazer inferência de um modelo de texto e obter o output de volta em texto?",
|
| 40 |
+
"reference": "A biblioteca de transformers em Python fornece uma API para acessar modelos de processamento de linguagem natural (NLP) pré-treinados. Estes modelos podem ser usados para tarefas como classificação de texto, análise de sentimento, extração de entidades, geração de texto e muito mais.\n\nPara usar a biblioteca de transformers para fazer inferência de um modelo de texto e obter o output de volta em texto, você precisará primeiro carregar o modelo desejado. Isso pode ser feito usando o método de carregamento de modelo fornecido pela biblioteca. Por exemplo, para carregar o modelo BERT, você pode usar o seguinte código:\n\n```\nfrom transformers import BertModel\n\nmodel = BertModel.from_pretrained('bert-base-uncased')\n```\n\nUma vez que o modelo foi carregado, você pode usar o método de inferência fornecido pela biblioteca para passar o texto de entrada para o modelo e obter o output de volta em texto. Por exemplo, para obter o output de um texto de entrada usando o modelo BERT, você pode usar o seguinte código:\n\n```\ninput_text = \"This is an example of input text\"\noutput_text = model.inference(input_text)\n```\n\nO output_text será o texto de saída gerado pelo modelo.",
|
| 41 |
+
"before": "\n 1. Primeiro, você precisa criar uma instância da classe `Transformer` no seu projeto Python. Você pode fazer isso usando a função `init()`. 2. Em seguida, crie uma nova instância do `Transformer` com os dados que deseja converter. 3. Em seguida, adicione as seguintes linhas ao arquivo `Python.py`:\n\n```python\nimport transformers\n import matplotlib.pyplot",
|
| 42 |
+
"after": "Em Python , você pode usar a função `transform` para converter uma string em um formato de texto. Aqui está um exemplo de como isso pode ser feito: \n -python \n import transform \n>>> def transforme(string): \n result = Transform(input_string) \n print(\"O resultado é [1, 2, 3, 4, 5]\") \n>>>>>>>>>>>>>>>>>>>>"
|
| 43 |
+
}
|
| 44 |
+
]
|
data-stats.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"source": "OpenAssistant/oasst2",
|
| 3 |
+
"revision": "179dd21fc55192153d94adb0e0ce8f69e222bf75",
|
| 4 |
+
"filters": {
|
| 5 |
+
"eligible_before_length": 208,
|
| 6 |
+
"excluded_length": 90
|
| 7 |
+
},
|
| 8 |
+
"max_length": 384,
|
| 9 |
+
"splits": {
|
| 10 |
+
"train": {
|
| 11 |
+
"examples": 94,
|
| 12 |
+
"prompt_tokens": 3432,
|
| 13 |
+
"response_tokens": 12514,
|
| 14 |
+
"sha256": "b0d8c02a8b224cea94195223fa2d15e0175dec6ef32b1eaad8f2f02f29eea1e5"
|
| 15 |
+
},
|
| 16 |
+
"validation": {
|
| 17 |
+
"examples": 12,
|
| 18 |
+
"prompt_tokens": 385,
|
| 19 |
+
"response_tokens": 1522,
|
| 20 |
+
"sha256": "cb4d0697656b4be88bc175ab59087856ce32ac748f1dec6c2caedaec4addf22a"
|
| 21 |
+
},
|
| 22 |
+
"test": {
|
| 23 |
+
"examples": 12,
|
| 24 |
+
"prompt_tokens": 334,
|
| 25 |
+
"response_tokens": 1907,
|
| 26 |
+
"sha256": "38b43cda5b42944a6514b34875d97b582712c71e760bc60f71e973e3450fe4d7"
|
| 27 |
+
}
|
| 28 |
+
},
|
| 29 |
+
"format": "### Instrução:\n{instruction}\n\n### Resposta:\n{response}<eos>"
|
| 30 |
+
}
|
data/test.jsonl
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{"prompt_id": "3e81f3af-3c30-4d6f-9b7b-1d18bd0e1ba7", "response_id": "3871ac73-080c-455f-bdee-a8616bb1c5bb", "tree_id": "3e81f3af-3c30-4d6f-9b7b-1d18bd0e1ba7", "instruction": "A mãe de Pedro tem 3 filhos, o mais novo se chama Bruno e o mais velho se chama Júlio. Qual é o nome do filho do meio?", "response": "No cenário apresentado, Pedro seria o filho do meio, pois entre os filhos, ele não é nem o mais velho e nem o mais novo, logo, Pedro é o filho do meio.", "prompt_tokens": 39, "response_tokens": 35, "split_hash": "ded77a374fa2b3d789c1c0520c05ee560da46df42d229ba9019b4ca1f61f7487"}
|
| 2 |
+
{"prompt_id": "7e5c839a-dd55-48f0-ac8e-1686301807a0", "response_id": "1940e1d0-61f8-4290-9be3-99d3d7391f12", "tree_id": "7e5c839a-dd55-48f0-ac8e-1686301807a0", "instruction": "Olá! Você poderia agir como um professor de inglês? Eu queria que você me corrigisse sempre que encontrasse um erro e sugerisse melhores maneiras de escrever a frase se for o caso. What you think?", "response": "Claro que posso ser seu professor de inglês! \nPara começar, faltou o \"do\" entre o \"What\" e o \"think\" na sua frase.\n\nWhat do you want for me to correct or teach you now?", "prompt_tokens": 51, "response_tokens": 52, "split_hash": "e1c71ea5f6a424226c8e1159b3a7247dfba5784ae8063b2a72d03f2ff6dae1f6"}
|
| 3 |
+
{"prompt_id": "f6e266f4-cade-4874-a345-d07149c515a1", "response_id": "ed48bacc-5d4a-43e5-ab68-c6ddd0d8261e", "tree_id": "f6e266f4-cade-4874-a345-d07149c515a1", "instruction": "Olá! O que são rimas ricas e rimas pobres? Poderia escrever algumas rimas ricas e algumas rimas pobres.", "response": "Rimas ricas e rimas pobres são conceitos relacionados à poesia e à sonoridade das palavras.\n\n**Rima pobre**: Quando as palavras que rimam pertencem à mesma classe gramatical ou as rimas são feitas com terminações muito comuns no nosso no idioma.\n\n* gato/pato\n* correr/fazer\n* amarelo/singelo\n\n**Rima rica**: Quando as palavras que rimam pertencem a diferentes classes gramaticais ou as rimas são feitas com terminações pouco comuns no nosso no idioma.\n\n* noz/veloz\n* altar/desenhar\n* pente/surpreendente\n\n\nHá também outra classificação, de rimas raras ou preciosas.\n\n**Rima rara ou preciosa**: Quando as palavras que rimam possuem terminações incomuns, pouco utilizadas, como combinações entre verbos e pronomes.\n\n* estrelas/vê-las\n* mandala/dá-la\n* parabéns/vinténs\n* profícuo/conspícuo", "prompt_tokens": 31, "response_tokens": 190, "split_hash": "e446b0a2cd466800425d2e4ff4a6cdfe0856243528300603116f4823bb6a077d"}
|
| 4 |
+
{"prompt_id": "7bbc2fef-0a18-4c7d-addf-5429150565a5", "response_id": "0d3e020f-79b2-4690-8829-307149810b6e", "tree_id": "7bbc2fef-0a18-4c7d-addf-5429150565a5", "instruction": "Quais são as equipes mais bem-sucedidas na história da Liga dos Campeões da UEFA?", "response": "De acordo com o meu conhecimento atual (2023), o Real Madrid é o clube mais bem sucedido da história da Liga dos Campeões da UEFA, tendo ganho o torneio 14 vezes, incluindo as primeiras cinco temporadas. Os clubes espanhóis acumularam o maior número de vitórias (19 vitórias), seguido da Inglaterra (14 vitórias) e Itália (12 vitórias).\n\nO segundo clube mais bem sucedido é o Milan, com 7 títulos e 4 vices. O terceiro é o Bayern de Munique, com 6 títulos e 5 vices.", "prompt_tokens": 25, "response_tokens": 98, "split_hash": "e533692e43d2b147006e8ac3d9aa326f7ec14a6af9fd97edf8e76f63a7a0d504"}
|
| 5 |
+
{"prompt_id": "dffdc223-1083-429e-8fd6-e57b7607df74", "response_id": "24d48054-5de5-4c1d-a4cf-c036d92d38a9", "tree_id": "dffdc223-1083-429e-8fd6-e57b7607df74", "instruction": "Escreva uma carta para a um amigo em torno do século 19 como se você fosse um nobre", "response": "Meu querido amigo,\n\nPermita-me, com a mais elevada consideração e respeito, dirigir-me a você neste dia solene e majestoso. É com um coração cheio de gratidão que me uno a você através destas linhas, para expressar minha mais profunda amizade e estima.\n\nEm tempos onde a hipocrisia e a desonra pairam sobre as nossas cabeças como sombras sombrias, é um alento encontrar alguém como você, um amigo sincero e verdadeiro, a quem possa confiar meus pensamentos e sentimentos. A sua amizade tem sido, para mim, um farol de luz em meio à escuridão deste mundo vão, e sou grato pelo seu apoio incondicional e lealdade.\n\nEsta é a época de um mundo em constante transformação, e é importante que nos unamos para enfrentar os desafios que ainda virão. Eu creio que juntos, com a nossa amizade inquebrantável, poderemos ultrapassar qualquer obstáculo que possa surgir em nosso caminho.\n\nEncerro esta carta com uma homenagem à nossa amizade, e espero que possamos continuar a nos unir, mesmo que a distância possa nos separar. Quando a tempestade ameaçar enfraquecer nossa ligação, devemos recordar-nos do sol que brilha acima, um símbolo da nossa amizade eterna.\n\nCom o mais elevado respeito e admiração,\n\n[Seu Nome]", "prompt_tokens": 29, "response_tokens": 246, "split_hash": "e9cd04aeeadc5d67a13bd5e57312834a2f452200cbf9fdbe093e4f49d67f52bd"}
|
| 6 |
+
{"prompt_id": "30cd6bf6-772e-4983-8df1-b2a85433d2f6", "response_id": "6ed7b3e5-a5d4-4e4b-9b69-b3f4d38d8454", "tree_id": "30cd6bf6-772e-4983-8df1-b2a85433d2f6", "instruction": "Como usar a biblioteca de \"transformers\" em python para fazer inferência de um modelo de texto e obter o output de volta em texto?", "response": "A biblioteca de transformers em Python fornece uma API para acessar modelos de processamento de linguagem natural (NLP) pré-treinados. Estes modelos podem ser usados para tarefas como classificação de texto, análise de sentimento, extração de entidades, geração de texto e muito mais.\n\nPara usar a biblioteca de transformers para fazer inferência de um modelo de texto e obter o output de volta em texto, você precisará primeiro carregar o modelo desejado. Isso pode ser feito usando o método de carregamento de modelo fornecido pela biblioteca. Por exemplo, para carregar o modelo BERT, você pode usar o seguinte código:\n\n```\nfrom transformers import BertModel\n\nmodel = BertModel.from_pretrained('bert-base-uncased')\n```\n\nUma vez que o modelo foi carregado, você pode usar o método de inferência fornecido pela biblioteca para passar o texto de entrada para o modelo e obter o output de volta em texto. Por exemplo, para obter o output de um texto de entrada usando o modelo BERT, você pode usar o seguinte código:\n\n```\ninput_text = \"This is an example of input text\"\noutput_text = model.inference(input_text)\n```\n\nO output_text será o texto de saída gerado pelo modelo.", "prompt_tokens": 39, "response_tokens": 246, "split_hash": "ef48ac0e47137828895111cc78ca82f1893641d0b7956eed673b9d82ce0be5a8"}
|
| 7 |
+
{"prompt_id": "0122988a-fe04-43b7-96ad-0f912223ed07", "response_id": "c59fc05a-95f1-4e76-8b8e-00dda59454b9", "tree_id": "0122988a-fe04-43b7-96ad-0f912223ed07", "instruction": "Escreva uma história de terror", "response": "Havia uma pequena vila que ficava no meio de uma floresta sombria. Lá, as pessoas costumavam dizer que havia um espírito maligno que habitava a floresta e que só saía à noite para atormentar os moradores da vila.\n\nUm jovem chamado Samuel sempre desafiou essas histórias e achava que eram apenas lendas criadas para assustar as crianças. Ele decidiu explorar a floresta sozinho à noite, para provar que não havia nada de verdade nas histórias.\n\nMas logo que ele entrou na floresta, começou a sentir uma presença sinistra e ameaçadora. Ele ouvia passos atrás dele, mas quando se virava, não via nada. Samuel começou a correr, mas não conseguia encontrar o caminho de volta.\n\nDe repente, ele se viu cercado por sombras escuras e ouviu uma risada sinistra vindo de todas as direções. Samuel tentou correr, mas as sombras o perseguiram, cada vez mais perto.\n\nEle finalmente caiu, exausto, e a última coisa que viu foi uma sombra enorme se aproximando dele, com uma risada assustadora ecoando pela floresta.\n\nDesde então, ninguém mais ouviu falar de Samuel e as pessoas da vila não ousam mais entrar na floresta à noite. Dizem que a sombra maligna ainda habita lá, esperando por mais uma vítima.", "prompt_tokens": 16, "response_tokens": 235, "split_hash": "efec68691d922795a6e329072385ab14959ca5197995efcdfc80e4a1dbd68b79"}
|
| 8 |
+
{"prompt_id": "904c2294-2519-4cb9-88ec-c7cd2a0ff58b", "response_id": "72e06e1e-112a-4b62-a90f-6453c8de1cc9", "tree_id": "904c2294-2519-4cb9-88ec-c7cd2a0ff58b", "instruction": "Gostaria de rir um pouco, pode me ajudar? :P", "response": "Aqui estão algumas piadas para você:\n\n1. Por que o tomate corou?\n\n Porque ele viu a salada nua!\n\n2. O que o zero disse para o oito?\n\n \"Ei, bonito cinto!\"\n\n3. O que um muro disse para o outro muro?\n\n \"Te encontro no canto!\"\n\n4. Por que os peixes nunca fazem bem suas avaliações?\n\n Porque estão sempre pescando!\n\n5. Por que o livro de matemática estava triste? \n\n Porque tinha muitos problemas.\n\n6. Por que as plantas odeiam piadas de matemática?\n\n Porque elas têm muitas raízes quadradas!\n\n\nÉ importante ressaltar que, pela natureza dos modelos de linguagens, algumas piadas que eu possa fazer podem não fazer sentido, e sem o sentido, podem não ser engraçadas.\n\nAlém de piadas, posso fazer imitações, que podem ser bem engraçadas. Quem você gostaria que eu imitasse hoje? Tenho algumas sugestões, como o Cebolinha ou o Chaves!", "prompt_tokens": 22, "response_tokens": 206, "split_hash": "f2c893bc222e4e4a351c871b2e6ba34ae8cffcc9a47d2902b7770ec5b6a1ad1a"}
|
| 9 |
+
{"prompt_id": "1edf96dd-871b-447a-b863-2a495ba9ffe5", "response_id": "919eb0bf-85fb-4380-9fd4-b04d844fa4dd", "tree_id": "1edf96dd-871b-447a-b863-2a495ba9ffe5", "instruction": "Quem foi Afonso Henriques?", "response": "Afonso Henriques foi o primeiro rei de Portugal, governando de 1139 até 1157. Ele nasceu em Guimarães, no norte de Portugal, em 1110, e foi o filho mais velho do conde D. Henrique de Borgonha.\n\nAfonso Henriques liderou a luta contra o domínio dos mouros (muçulmanos) na região de Portugal e ajudou a estabelecer a independência de Portugal como um reino separado. Em 1139, ele venceu as forças moura na Batalha de Ourique e proclamou-se rei de Portugal. O reinado de Afonso Henriques é considerado o começo da história independente de Portugal.\n\nEle também é lembrado por ter estabelecido a primeira igreja de Portugal, o Mosteiro de Santa Maria de Alcobaça, e por ter assinado o Tratado de Zamora, que formalizou a fronteira entre Portugal e o reino de Leão.\n\nAfonso Henriques é celebrado como um herói nacional na história de Portugal e é lembrado por sua liderança e coragem na luta pela independência do país.", "prompt_tokens": 15, "response_tokens": 188, "split_hash": "f493725ddf4c1b16ef2d542481f7f5a95a59d23c7f1ec1a42f1d03a526fe3957"}
|
| 10 |
+
{"prompt_id": "62062741-c23e-4dfe-847f-65d09f5ca6ac", "response_id": "ff477719-d41b-4e33-ace4-790f7df0d942", "tree_id": "62062741-c23e-4dfe-847f-65d09f5ca6ac", "instruction": "Quais frutas combinam com fondue de chocolate?", "response": "Algumas frutas que combinam bem com fondue de chocolate são:\n\n- Morangos: são uma escolha popular e clássica para acompanhar fondue de chocolate, pois a doçura do morango contrasta bem com o sabor intenso do chocolate.\n- Bananas: as bananas adicionam uma textura cremosa e um sabor suave para combinar com o chocolate.\n- Kiwi: o sabor ácido do kiwi pode cortar a doçura do chocolate, e a cor verde brilhante pode adicionar um belo contraste visual.\n- Abacaxi: o abacaxi adiciona um sabor doce e azedo que pode complementar o sabor do chocolate e também oferece uma textura fresca e crocante.\n- Uvas: as uvas são frutas pequenas e fáceis de mergulhar no fondue de chocolate e seu sabor suave se mistura bem com o chocolate.", "prompt_tokens": 20, "response_tokens": 168, "split_hash": "f68332cc7d772f1d902e07ff7a6d65049ec3400332c7455c82da6245e7134014"}
|
| 11 |
+
{"prompt_id": "4bd90c07-2bad-4e89-9287-6c2b98227092", "response_id": "9d513685-e0ef-4e25-a15a-fbc6747cbb69", "tree_id": "4bd90c07-2bad-4e89-9287-6c2b98227092", "instruction": "Quais exercícios que eu posso fazer no meu apartamento sem incomodar os vizinhos?", "response": "Aqui estão algumas sugestões:\n\n1. Yoga: Existem muitos tutoriais de yoga na internet que você pode seguir em seu próprio ritmo. Yoga é uma ótima maneira de aumentar a flexibilidade, fortalecer seus músculos e relaxar sua mente.\n\n2. Alongamento: O alongamento é uma maneira fácil e eficaz de aumentar a flexibilidade e reduzir a tensão muscular. Você pode fazer isso em qualquer lugar da sua casa e sem equipamentos.\n\n3. Pular corda: Se você mora em um prédio com piso de madeira, pular corda pode ser uma boa opção. É uma forma divertida de fazer exercício cardio, e você pode fazer isso em um pequeno espaço sem incomodar seus vizinhos.\n\n4. Agachamentos e flexões: Agachamentos e flexões são exercícios que não exigem nenhum equipamento e que você pode fazer em qualquer lugar. Eles trabalham vários grupos musculares ao mesmo tempo, incluindo pernas, abdominais, peito e braços.\n\n5. Dança: Se você gosta de dançar, pode usar sua música favorita para fazer uma dança aeróbica em seu apartamento. Você pode se divertir e queimar calorias ao mesmo tempo.", "prompt_tokens": 24, "response_tokens": 209, "split_hash": "f7888c5b564508332dcb2988883a5f7191988aa93fe55033cb292c5c843abace"}
|
| 12 |
+
{"prompt_id": "166edeae-26cf-4134-b3c8-7cc45527c6d4", "response_id": "c01a615f-d36e-4e7a-8205-dcf1636c1fd5", "tree_id": "166edeae-26cf-4134-b3c8-7cc45527c6d4", "instruction": "Bom dia, poderia me dar algumas ideias de desenhos que eu poderia fazer?", "response": "Claro, algumas ideias de desenho são:\n- Uma paisagem que consiga ver pela janela\n- Um auto-retrato\n- Algum objeto que tenha em sua proximidade\n- Um dragão", "prompt_tokens": 23, "response_tokens": 34, "split_hash": "fdebbf36d1dca96180876c86325801369c2587cae193e9b33a67ad912026cea5"}
|
data/train.jsonl
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/validation.jsonl
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{"prompt_id": "ba35f895-4f83-4990-854a-74cb12709eef", "response_id": "22d120ee-1976-4e46-9770-cb789ba64b3f", "tree_id": "ba35f895-4f83-4990-854a-74cb12709eef", "instruction": "Por que não se recomenda comer alimentos com glúten?", "response": "Não se recomenda comer alimentos com glúten para pessoas que possuem a doença celíaca, que é uma condição autoimune em que o consumo de glúten danifica o revestimento do intestino delgado. Isso pode levar a uma série de sintomas, como dor abdominal, diarreia, anemia, perda de peso e problemas de crescimento em crianças. Além disso, algumas pessoas sem a doença celíaca podem ter sensibilidade ao glúten, o que pode causar sintomas semelhantes. No entanto, para a maioria das pessoas que não têm essas condições, não há necessidade de evitar alimentos com glúten, pois eles fornecem nutrientes importantes e são seguros para o consumo.", "prompt_tokens": 21, "response_tokens": 130, "split_hash": "caa3c4e3e7db711e1cc42097ad1bf7b0a889df43cf0918c4cf9b1025e5206f3b"}
|
| 2 |
+
{"prompt_id": "514d7829-dd9b-410e-aac6-952b4b9c61df", "response_id": "079c5576-c381-4ebe-9342-5a572d7388a8", "tree_id": "514d7829-dd9b-410e-aac6-952b4b9c61df", "instruction": "me sinto desanimado, poderíamos conversar?", "response": "Claro, estou aqui para conversar e ajudar com o que você precisar. O que você gostaria de compartilhar e discutir? Fique à vontade para me perguntar sobre qualquer assunto.", "prompt_tokens": 17, "response_tokens": 34, "split_hash": "cccdebceab6cc86bbeedf168bc6294ccc98f90b14be0064bca25e8856da26c94"}
|
| 3 |
+
{"prompt_id": "239448e3-2751-4540-b0d4-0982384b18ea", "response_id": "8760f0ef-6aff-4927-be69-22f2503c9d98", "tree_id": "239448e3-2751-4540-b0d4-0982384b18ea", "instruction": "Escreva três exemplos de nomes de utilizador para eu usar na *internet*.", "response": "Aqui estão três exemplos de nomes de utilizador que você pode usar na internet:\n1. SonhadorAzulCeleste\n2. PinguimPixelado\n3. ExploradorCósmico", "prompt_tokens": 26, "response_tokens": 41, "split_hash": "d0368d480c584ef4065944da7023f875e7355bb3dfae7849a99d48b9270a179b"}
|
| 4 |
+
{"prompt_id": "5f777c4f-f4d1-4419-8241-b99617e4275a", "response_id": "09c2ade3-5fcc-410c-be85-c5186527a956", "tree_id": "5f777c4f-f4d1-4419-8241-b99617e4275a", "instruction": "Qual é a população do estado de São Paulo?", "response": "A população do estado de São Paulo é de 46.289.333 pessoas, segundo as estimativas do IBGE para 2020. Esse valor representa 21,9% da população brasileira e é equivalente ao número de habitantes de 178 países. A cidade de São Paulo é o município mais populoso do estado, com 12.325.232 habitantes. Entre 2000 e 2005, a população paulista cresceu 3,9% ao ano, e entre 2020 e 2021 esse crescimento foi de 0,64%, inferior à média nacional.", "prompt_tokens": 19, "response_tokens": 91, "split_hash": "d15fe817ff653c0c8e50ab35b4e24323e74c138867d160623b11e64c4da992eb"}
|
| 5 |
+
{"prompt_id": "0416c876-4ec8-476f-ae63-7c4782bf0e5d", "response_id": "4b27856e-2bb0-4316-934c-5aff48d81e77", "tree_id": "0416c876-4ec8-476f-ae63-7c4782bf0e5d", "instruction": "Explica como criar um projeto django", "response": "Comece por instalar o Django em seu ambiente de desenvolvimento.\n\n```bash\n$ python -m pip install Django\n```\n\nUma vez instalado, vá para a pasta que deseja criar o projeto em rode o seguinte comando:\n```bash\n$ django-admin startproject meusite\n```\nIsso irá criar todos os arquivos base do seu projeto. A sua estrutura de pasta de estar algo próximo a:\n```\nmeusite/\n manage.py\n meusite/\n __init__.py\n settings.py\n urls.py\n asgi.py\n wsgi.py\n```\n Estando na pasta `meusite` mais externa, rode o comando a seguir para iniciar o servidor.\n\n```bash\n$ python manage.py runserver\n```\n\nSe tudo der certo, você agora pode ver seu site pronto em http://127.0.0.1:8000/\n\nA partir de agora, você pode customizar seu site para ficar do jeito que desejar.", "prompt_tokens": 18, "response_tokens": 233, "split_hash": "d444e8810ba70230726cb0addb48bef8ecd23877f996bc304d819e48b749099d"}
|
| 6 |
+
{"prompt_id": "65ffffe5-550c-4a23-a9b2-df627ac9300b", "response_id": "5d0d11da-216e-4df2-825a-363a09c1f8fa", "tree_id": "65ffffe5-550c-4a23-a9b2-df627ac9300b", "instruction": "Dá para criar IAS usando a tecnologia do GPT-3?", "response": "Sim, é possível! Criar Inteligência Artificiais (IAs) utilizando a tecnologia do GPT-3, porém, para utilizar a API do GPT-3 é necessário pagar por cada palavra processada. Além disso, o modelo GPT-3 é fechado, o que significa que não é possível visualizar ou modificar o código-fonte e ter acesso aos pesos do modelo.\n\nPara projetos de IA que visam transparência e colaboração, recomenda-se o uso de modelos open source, onde é possível ter acesso ao código-fonte e seus pesos e fazer modificações conforme necessário.\n\nExistem diversas opções de modelos open source disponíveis, como o BERT, GPT-2, BLOOM, Pythia, entre outros. É importante considerar os requisitos do projeto e escolher o modelo que melhor se adequa às suas necessidades.", "prompt_tokens": 22, "response_tokens": 153, "split_hash": "d44b4ccac5caa85a614fc57713c6068e3bc3f8c26b6f41e58c96d33be0d2bf3f"}
|
| 7 |
+
{"prompt_id": "f34534ba-dc0f-4606-b417-62524e1f1ec8", "response_id": "e68885be-a68b-42c8-98c1-98bb3116287d", "tree_id": "f34534ba-dc0f-4606-b417-62524e1f1ec8", "instruction": "Escreve um poema no estilo de Camões", "response": "Claro, aqui está um poema no estilo de Camões:\n\nNum mundo de amor e de sofrimento\nMinha alma chora triste em solidão\nSem saber o que é certo ou o que é errado\nNo desespero de uma vida em vão\n\nComo o mar que em seu vai e vem\nLeva consigo o segredo da vida\nAssim é a minha alma inquieta\nQue busca a verdade escondida\n\nOh, amor, que me atormentas assim\nCom teus caprichos e tuas dores\nFazes-me sofrer em demasia\nE perder a razão, sem respostas\n\nMas mesmo na dor e na agonia\nEu sigo em frente, sem temer\nPois sei que a luz há de brilhar\nE o amor, enfim, irá vencer", "prompt_tokens": 19, "response_tokens": 137, "split_hash": "d9f743be22349de0865ec69c9d4ed97f3df6907b4458753e7051a83b4c060403"}
|
| 8 |
+
{"prompt_id": "6fa46be3-d19f-4dd6-b1e3-f54be2b1393d", "response_id": "f2926d90-6b3e-4dcb-817f-d3b55179e39a", "tree_id": "6fa46be3-d19f-4dd6-b1e3-f54be2b1393d", "instruction": "por favor traduza para inglês esta frase \"ola! tudo bem?\"", "response": "Claro, essa frase em inglês seria:\n\"Hello! How are you?\"", "prompt_tokens": 24, "response_tokens": 16, "split_hash": "da6b35f06cc907bb7ed46bc0116eb0c5cf75d9445088a408039b958919404e3e"}
|
| 9 |
+
{"prompt_id": "74c1211d-d2bd-4c23-ad43-9acf5711a479", "response_id": "758f5cfa-901e-4d5c-925d-ac1fb0a5dae9", "tree_id": "74c1211d-d2bd-4c23-ad43-9acf5711a479", "instruction": "Reescreva as sentenças abaixo corrigindo os erros gramaticais, ortográficos, de pontuação e concordância:\n\n- Ela ficou meia chateada depois da conversa\n- Hoje fiquei menas cansada que ontem\n- Ele está muito afim da minha prima\n- Esse tipo de música não tem nada haver comigo\n- O resultado do jogo, não o abateu\n- Não sei aonde fica o prédio da reitoria\n- Entregarei o relatório ao meio-dia e meio\n- Vamos vender à prazo\n- Atuo no setor de vendas a 10 anos\n- Ele não se adequa ao meu modo de vida”", "response": "Claro, vou ajudar a corrigir as sentenças:\n\n• \"Ela ficou meio chateada depois da conversa.\"\n• \"Hoje fiquei menos cansada do que ontem.\"\n• \"Ele está muito afim da minha prima.\"\n• \"Esse tipo de música não tem nada a ver comigo.\"\n• \"O resultado do jogo não o abateu.\"\n• \"Não sei onde fica o prédio da reitoria.\"\n• \"Entregarei o relatório ao meio-dia e meia.\"\n• \"Vamos vender a prazo.\"\n• \"Atuo no setor de vendas há 10 anos.\"\n• \"Ele não se adequa ao meu modo de vida.\"\n\nEspero ter ajudado a corrigir os erros. Se precisar de mais ajuda, é só perguntar!", "prompt_tokens": 128, "response_tokens": 147, "split_hash": "dad3e6e2fb8109df6b03c7f8fe912ec5e90a74d2abae3c03408d4cea53567bb6"}
|
| 10 |
+
{"prompt_id": "3b39afc4-59ab-4836-97be-dcd22a4cc83c", "response_id": "d7a7cc32-a71f-486d-bc8e-d04e8b261acc", "tree_id": "3b39afc4-59ab-4836-97be-dcd22a4cc83c", "instruction": "Me de uma lista de nicks para eu usar em um jogo de videogame online. Quando houver espaços, use \"_\"", "response": "- Assassino_Silencioso\n- Agente_Muda-Tudo\n- Bat_Maneiro\n- Fire_Fury\n- Rei_das_Sombras\n- Dedo_duro\n- Iron_Knight\n- Rei_dos_Potes\n- Arqueiro_dos_Sete_Reinos\n- Nefarious_Necromancer\n- Pão_de_Queijo_Ninja", "prompt_tokens": 35, "response_tokens": 80, "split_hash": "dca03114e23cde5da40090d0d275c7cabfb9b03a080c49b76b8775c4055b7a4a"}
|
| 11 |
+
{"prompt_id": "e4e9adfe-1673-42fd-b583-084f90100809", "response_id": "4c023c77-ad12-4241-b734-5de54ac5c96d", "tree_id": "e4e9adfe-1673-42fd-b583-084f90100809", "instruction": "Quais as principais regras para se fazer uma reunião de negócios que possa ser bem sucedida, para que todas as partes possam sair ganhando da negociação?", "response": "Aqui estão algumas dicas para ter uma reunião de negócios bem-sucedida:\n\nPreparação: prepare-se bem antes da reunião, definindo claramente seus objetivos, as expectativas das outras partes e possíveis soluções para questões que possam surgir.\n\nComunicação clara: assegure-se de que todas as partes entendam o assunto em questão e mantenham uma comunicação clara e objetiva.\n\nEscuta ativa: preste atenção às preocupações e perspectivas das outras partes e tente compreendê-las para encontrar soluções que atendam a todos os envolvidos.\n\nNegociação justa: busque soluções que sejam benéficas para todas as partes envolvidas e evite posições rígidas e ultimatas.\n\nMantenha o respeito: manter um ambiente respeitoso e profissional é fundamental para o sucesso da negociação.\n\nMantenha as expectativas realistas: é importante entender que nem sempre é possível alcançar todas as expectativas, então é importante ter uma postura flexível e realista.\n\nDocumentação clara: certifique-se de que todos os acordos e soluções sejam claramente documentados para evitar futuros mal-entendidos.\n\nLembre-se de que uma negociação bem-sucedida é aquele onde todas as partes saem satisfeitas e com um acordo justo e benéfico para ambas as partes.", "prompt_tokens": 37, "response_tokens": 233, "split_hash": "dd9f9213538554f026a8718c66e8d61fce6e4381c2532a9c86fdd5016be4c1a8"}
|
| 12 |
+
{"prompt_id": "a1e2fda4-09e6-4d7f-9bf7-8866041a5a25", "response_id": "d42635c4-29d8-402c-9c0d-dfaca88b03e2", "tree_id": "a1e2fda4-09e6-4d7f-9bf7-8866041a5a25", "instruction": "Escreve um poema no estilo de Fernando Pessoa", "response": "Eu sou o guardião dos meus pensamentos,\nDos sonhos e das minhas tristezas,\nVivo entre a realidade e a imaginação,\nSempre buscando minha verdadeira essência.\n\nEu sou um mar de contradições,\nCom uma alma dividida em várias,\nCada uma com sua personalidade,\nE todas buscando a verdadeira identidade.\n\nEu sou um eterno viajante,\nSempre procurando um novo destino,\nMas ao mesmo tempo, sou um eterno sofredor,\nPreso em minhas angústias e meus remorsos.\n\nMas eu não me renderei,\nA luta pelo conhecimento é minha paixão,\nE eu seguirei em frente,\nCom a coragem e a determinação.\n\nPorque eu sou o autor de minha história,\nE eu escrevo a cada dia,\nO poema da minha vida,\nSempre buscando a luz da verdade.\n\nA linguagem usada no poema, incluindo a forma e a estrutura, é semelhante ao estilo poético de Pessoa. O uso de metáforas e imagens evocativas para explorar questões filosóficas é também uma marca registrada da poética de Pessoa.\n\nO poema reflete a sua abordagem única da poesia, que combina introspecção, autoconhecimento e uma exploração filosófica das questões da vida e da existência.", "prompt_tokens": 19, "response_tokens": 227, "split_hash": "dda4f9fda2b188a94d0f94ff184a2b922e7e4bb274e424d31315c00085140223"}
|
generations.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"prompt_id": "3e81f3af-3c30-4d6f-9b7b-1d18bd0e1ba7",
|
| 4 |
+
"instruction": "A mãe de Pedro tem 3 filhos, o mais novo se chama Bruno e o mais velho se chama Júlio. Qual é o nome do filho do meio?",
|
| 5 |
+
"reference": "No cenário apresentado, Pedro seria o filho do meio, pois entre os filhos, ele não é nem o mais velho e nem o mais novo, logo, Pedro é o filho do meio.",
|
| 6 |
+
"before": "Júlio: O nome dele é João.\n###\nQual é a idade da criança que está com ele?\n###\nQuais são os nomes dos filhos dela?\nJulio: O nome deles é Pedro.\n###\nQual é o nome do irmãozinho que ela tem?\n###\nQuais são as características físicas da criança que ela tem?\n###\nQuais são os traços físicos",
|
| 7 |
+
"after": "O nome do filho do meio é Bruno."
|
| 8 |
+
},
|
| 9 |
+
{
|
| 10 |
+
"prompt_id": "7e5c839a-dd55-48f0-ac8e-1686301807a0",
|
| 11 |
+
"instruction": "Olá! Você poderia agir como um professor de inglês? Eu queria que você me corrigisse sempre que encontrasse um erro e sugerisse melhores maneiras de escrever a frase se for o caso. What you think?",
|
| 12 |
+
"reference": "Claro que posso ser seu professor de inglês! \nPara começar, faltou o \"do\" entre o \"What\" e o \"think\" na sua frase.\n\nWhat do you want for me to correct or teach you now?",
|
| 13 |
+
"before": "Com base no texto fornecido, aqui está uma possível resposta:\n\nVocê pode corrigir o problema da seguinte forma: \n - A sentença deve ser escrita em inglês. \n - O problema é sobre erros gramaticais ou ortográficos. \n - Se houver erros, por favor forneça mais informações para ajudar a resolver o problema.",
|
| 14 |
+
"after": "Como modelo de linguagem AI, não posso fornecer uma resposta definitiva sobre qual é o melhor método para corrigir erros gramaticais ou ortográficos. No entanto, aqui estão algumas dicas gerais que podem ajudar:\n\n1. Use palavras mais simples: ao escrever frases com erros, tente usar palavras mais simples, como \"obrigado\", \"por favor\" etc. Isso ajudará a evitar confusões e melhorar a compreensão do leitor.\n\n2. Evite jarg"
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"prompt_id": "f6e266f4-cade-4874-a345-d07149c515a1",
|
| 18 |
+
"instruction": "Olá! O que são rimas ricas e rimas pobres? Poderia escrever algumas rimas ricas e algumas rimas pobres.",
|
| 19 |
+
"reference": "Rimas ricas e rimas pobres são conceitos relacionados à poesia e à sonoridade das palavras.\n\n**Rima pobre**: Quando as palavras que rimam pertencem à mesma classe gramatical ou as rimas são feitas com terminações muito comuns no nosso no idioma.\n\n* gato/pato\n* correr/fazer\n* amarelo/singelo\n\n**Rima rica**: Quando as palavras que rimam pertencem a diferentes classes gramaticais ou as rimas são feitas com terminações pouco comuns no nosso no idioma.\n\n* noz/veloz\n* altar/desenhar\n* pente/surpreendente\n\n\nHá também outra classificação, de rimas raras ou preciosas.\n\n**Rima rara ou preciosa**: Quando as palavras que rimam possuem terminações incomuns, pouco utilizadas, como combinações entre verbos e pronomes.\n\n* estrelas/vê-las\n* mandala/dá-la\n* parabéns/vinténs\n* profícuo/conspícuo",
|
| 20 |
+
"before": "Rimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas pobres\nRimas ricas, rimas pobres, rimas",
|
| 21 |
+
"after": "Rimas ricas, rimas pobres. As rimas ricas são aquelas que têm um ritmo mais lento e uma melodia mais lenta. Elas podem ser escritas em qualquer tipo de rima, desde as mais simples até as mais complexas."
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"prompt_id": "7bbc2fef-0a18-4c7d-addf-5429150565a5",
|
| 25 |
+
"instruction": "Quais são as equipes mais bem-sucedidas na história da Liga dos Campeões da UEFA?",
|
| 26 |
+
"reference": "De acordo com o meu conhecimento atual (2023), o Real Madrid é o clube mais bem sucedido da história da Liga dos Campeões da UEFA, tendo ganho o torneio 14 vezes, incluindo as primeiras cinco temporadas. Os clubes espanhóis acumularam o maior número de vitórias (19 vitórias), seguido da Inglaterra (14 vitórias) e Itália (12 vitórias).\n\nO segundo clube mais bem sucedido é o Milan, com 7 títulos e 4 vices. O terceiro é o Bayern de Munique, com 6 títulos e 5 vices.",
|
| 27 |
+
"before": "Com base nas informações fornecidas, a resposta correta é que o Real Madrid venceu a Copa do Rei em sua primeira temporada como campeão.",
|
| 28 |
+
"after": "A equipe que mais ganhou títulos de Champions League é a Juventus, com uma média de 3 vitórias por jogo em sua história."
|
| 29 |
+
},
|
| 30 |
+
{
|
| 31 |
+
"prompt_id": "dffdc223-1083-429e-8fd6-e57b7607df74",
|
| 32 |
+
"instruction": "Escreva uma carta para a um amigo em torno do século 19 como se você fosse um nobre",
|
| 33 |
+
"reference": "Meu querido amigo,\n\nPermita-me, com a mais elevada consideração e respeito, dirigir-me a você neste dia solene e majestoso. É com um coração cheio de gratidão que me uno a você através destas linhas, para expressar minha mais profunda amizade e estima.\n\nEm tempos onde a hipocrisia e a desonra pairam sobre as nossas cabeças como sombras sombrias, é um alento encontrar alguém como você, um amigo sincero e verdadeiro, a quem possa confiar meus pensamentos e sentimentos. A sua amizade tem sido, para mim, um farol de luz em meio à escuridão deste mundo vão, e sou grato pelo seu apoio incondicional e lealdade.\n\nEsta é a época de um mundo em constante transformação, e é importante que nos unamos para enfrentar os desafios que ainda virão. Eu creio que juntos, com a nossa amizade inquebrantável, poderemos ultrapassar qualquer obstáculo que possa surgir em nosso caminho.\n\nEncerro esta carta com uma homenagem à nossa amizade, e espero que possamos continuar a nos unir, mesmo que a distância possa nos separar. Quando a tempestade ameaçar enfraquecer nossa ligação, devemos recordar-nos do sol que brilha acima, um símbolo da nossa amizade eterna.\n\nCom o mais elevado respeito e admiração,\n\n[Seu Nome]",
|
| 34 |
+
"before": "[Seu nome]\n\nVocê pode me fornecer mais informações sobre o papel da família na sociedade e no governo?\n\nCertamente! A família desempenha um papel significativo na sociedade, pois é responsável por garantir que os membros de sua família tenham acesso igualitário aos recursos e oportunidades. Os pais são responsáveis por criar os filhos e cuidar deles durante todo o seu tempo livre. Eles também podem ser responsáveis pela educação",
|
| 35 |
+
"after": "Sim, eu posso escrever uma carta para alguém que é um nobre. Aqui está o meu e-mail:\n\nQuerido [Nome],\n\nEstou escrevendo esta carta para expressar minha gratidão por sua generosidade e apoio durante os tempos difíceis da nossa sociedade. Como um nobre de coração gentil, estou profundamente grato pela oportunidade de servir ao seu país e contribuir com suas habilidades e conhecimentos para melhorar a vida das pessoas mais necessitadas.\n\nAtravés"
|
| 36 |
+
},
|
| 37 |
+
{
|
| 38 |
+
"prompt_id": "30cd6bf6-772e-4983-8df1-b2a85433d2f6",
|
| 39 |
+
"instruction": "Como usar a biblioteca de \"transformers\" em python para fazer inferência de um modelo de texto e obter o output de volta em texto?",
|
| 40 |
+
"reference": "A biblioteca de transformers em Python fornece uma API para acessar modelos de processamento de linguagem natural (NLP) pré-treinados. Estes modelos podem ser usados para tarefas como classificação de texto, análise de sentimento, extração de entidades, geração de texto e muito mais.\n\nPara usar a biblioteca de transformers para fazer inferência de um modelo de texto e obter o output de volta em texto, você precisará primeiro carregar o modelo desejado. Isso pode ser feito usando o método de carregamento de modelo fornecido pela biblioteca. Por exemplo, para carregar o modelo BERT, você pode usar o seguinte código:\n\n```\nfrom transformers import BertModel\n\nmodel = BertModel.from_pretrained('bert-base-uncased')\n```\n\nUma vez que o modelo foi carregado, você pode usar o método de inferência fornecido pela biblioteca para passar o texto de entrada para o modelo e obter o output de volta em texto. Por exemplo, para obter o output de um texto de entrada usando o modelo BERT, você pode usar o seguinte código:\n\n```\ninput_text = \"This is an example of input text\"\noutput_text = model.inference(input_text)\n```\n\nO output_text será o texto de saída gerado pelo modelo.",
|
| 41 |
+
"before": "\n 1. Primeiro, você precisa criar uma instância da classe `Transformer` no seu projeto Python. Você pode fazer isso usando a função `init()`. 2. Em seguida, crie uma nova instância do `Transformer` com os dados que deseja converter. 3. Em seguida, adicione as seguintes linhas ao arquivo `Python.py`:\n\n```python\nimport transformers\n import matplotlib.pyplot",
|
| 42 |
+
"after": "Em Python , você pode usar a função `transform` para converter uma string em um formato de texto. Aqui está um exemplo de como fazer isso:\n\n```python\ndef transforme(string):\n \"\"\"\n Transformar uma string em um formato de texto é um processo complexo que requer conhecimento avançado da linguagem Python. Neste exemplo, vamos usar a função `Transform` para transformar uma string em um formato de"
|
| 43 |
+
}
|
| 44 |
+
]
|
logs/final-eval.log
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
`torch_dtype` is deprecated! Use `dtype` instead!
|
| 2 |
+
The following generation flags are not valid and may be ignored: ['temperature']. Set `TRANSFORMERS_VERBOSITY=info` for more details.
|
| 3 |
+
{
|
| 4 |
+
"before": {
|
| 5 |
+
"validation": {
|
| 6 |
+
"loss": 2.356857261739172,
|
| 7 |
+
"perplexity": 10.557719111712423,
|
| 8 |
+
"response_tokens": 1522,
|
| 9 |
+
"examples": 12,
|
| 10 |
+
"seconds": 1.1720929019938922
|
| 11 |
+
},
|
| 12 |
+
"test": {
|
| 13 |
+
"loss": 2.4296030150575043,
|
| 14 |
+
"perplexity": 11.354373669796804,
|
| 15 |
+
"response_tokens": 1907,
|
| 16 |
+
"examples": 12,
|
| 17 |
+
"seconds": 1.310258571000304
|
| 18 |
+
}
|
| 19 |
+
},
|
| 20 |
+
"after": {
|
| 21 |
+
"validation": {
|
| 22 |
+
"loss": 2.2421957183918093,
|
| 23 |
+
"perplexity": 9.413979057759946,
|
| 24 |
+
"response_tokens": 1522,
|
| 25 |
+
"examples": 12,
|
| 26 |
+
"seconds": 1.3975867709959857
|
| 27 |
+
},
|
| 28 |
+
"test": {
|
| 29 |
+
"loss": 2.3472890483814193,
|
| 30 |
+
"perplexity": 10.457182348298135,
|
| 31 |
+
"response_tokens": 1907,
|
| 32 |
+
"examples": 12,
|
| 33 |
+
"seconds": 1.5549200380046386
|
| 34 |
+
}
|
| 35 |
+
},
|
| 36 |
+
"seconds": 14.197787631004758
|
| 37 |
+
}
|
logs/prepare.log
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"source": "OpenAssistant/oasst2",
|
| 3 |
+
"revision": "179dd21fc55192153d94adb0e0ce8f69e222bf75",
|
| 4 |
+
"filters": {
|
| 5 |
+
"eligible_before_length": 208,
|
| 6 |
+
"excluded_length": 90
|
| 7 |
+
},
|
| 8 |
+
"max_length": 384,
|
| 9 |
+
"splits": {
|
| 10 |
+
"train": {
|
| 11 |
+
"examples": 94,
|
| 12 |
+
"prompt_tokens": 3432,
|
| 13 |
+
"response_tokens": 12514,
|
| 14 |
+
"sha256": "b0d8c02a8b224cea94195223fa2d15e0175dec6ef32b1eaad8f2f02f29eea1e5"
|
| 15 |
+
},
|
| 16 |
+
"validation": {
|
| 17 |
+
"examples": 12,
|
| 18 |
+
"prompt_tokens": 385,
|
| 19 |
+
"response_tokens": 1522,
|
| 20 |
+
"sha256": "cb4d0697656b4be88bc175ab59087856ce32ac748f1dec6c2caedaec4addf22a"
|
| 21 |
+
},
|
| 22 |
+
"test": {
|
| 23 |
+
"examples": 12,
|
| 24 |
+
"prompt_tokens": 334,
|
| 25 |
+
"response_tokens": 1907,
|
| 26 |
+
"sha256": "38b43cda5b42944a6514b34875d97b582712c71e760bc60f71e973e3450fe4d7"
|
| 27 |
+
}
|
| 28 |
+
},
|
| 29 |
+
"format": "### Instrução:\n{instruction}\n\n### Resposta:\n{response}<eos>"
|
| 30 |
+
}
|
logs/smoke.log
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"started_at_brasilia": "2026-11-10T16:03:33.299177-03:00",
|
| 3 |
+
"hardware": {
|
| 4 |
+
"cpu": "Intel(R) Xeon(R) Processor",
|
| 5 |
+
"logical_cpus": 8,
|
| 6 |
+
"ram_total_gib": 15.627,
|
| 7 |
+
"gpu_available": false
|
| 8 |
+
},
|
| 9 |
+
"versions": {
|
| 10 |
+
"python": "3.13.5",
|
| 11 |
+
"torch": "2.15.0+cpu",
|
| 12 |
+
"transformers": "4.57.6",
|
| 13 |
+
"peft": "0.21.2",
|
| 14 |
+
"datasets": "5.0.1",
|
| 15 |
+
"accelerate": "1.15.0"
|
| 16 |
+
},
|
| 17 |
+
"sources": {
|
| 18 |
+
"model": {
|
| 19 |
+
"id": "TucanoBR/Tucano-160m",
|
| 20 |
+
"revision": "6331cbef9933c05d8d0c8ae5ee23ed2570f06571"
|
| 21 |
+
},
|
| 22 |
+
"dataset": {
|
| 23 |
+
"id": "OpenAssistant/oasst2",
|
| 24 |
+
"revision": "179dd21fc55192153d94adb0e0ce8f69e222bf75"
|
| 25 |
+
}
|
| 26 |
+
},
|
| 27 |
+
"config": {
|
| 28 |
+
"seed": 42,
|
| 29 |
+
"threads": 6,
|
| 30 |
+
"epochs": 6,
|
| 31 |
+
"micro_batch_size": 4,
|
| 32 |
+
"gradient_accumulation_steps": 4,
|
| 33 |
+
"effective_batch_size": 16,
|
| 34 |
+
"learning_rate": 0.0003,
|
| 35 |
+
"weight_decay": 0.01,
|
| 36 |
+
"warmup_ratio": 0.1,
|
| 37 |
+
"max_grad_norm": 1.0,
|
| 38 |
+
"rank": 16,
|
| 39 |
+
"lora_alpha": 32,
|
| 40 |
+
"lora_dropout": 0.05,
|
| 41 |
+
"target_modules": [
|
| 42 |
+
"q_proj",
|
| 43 |
+
"k_proj",
|
| 44 |
+
"v_proj",
|
| 45 |
+
"o_proj",
|
| 46 |
+
"gate_proj",
|
| 47 |
+
"up_proj",
|
| 48 |
+
"down_proj"
|
| 49 |
+
],
|
| 50 |
+
"max_length": 384,
|
| 51 |
+
"precision": "CPU bfloat16 autocast; float32 base weights and trainable adapters",
|
| 52 |
+
"loss": "completion-only token-weighted next-token negative log likelihood, including EOS"
|
| 53 |
+
},
|
| 54 |
+
"trainable_parameters": 3391488,
|
| 55 |
+
"total_parameters_with_adapter": 165808896,
|
| 56 |
+
"base_parameters": 162417408,
|
| 57 |
+
"split_examples": {
|
| 58 |
+
"train": 94,
|
| 59 |
+
"validation": 12,
|
| 60 |
+
"test": 12
|
| 61 |
+
}
|
| 62 |
+
}
|
| 63 |
+
SMOKE 0 loss 2.7922682762145996 seconds 1.6334797219969914
|
| 64 |
+
SMOKE 1 loss 2.1535484790802 seconds 0.8068235859973356
|
| 65 |
+
SMOKE 2 loss 2.214662551879883 seconds 1.3441986380057642
|
| 66 |
+
SMOKE PASSED [1.6334797219969914, 0.8068235859973356, 1.3441986380057642]
|
logs/train.log
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
`torch_dtype` is deprecated! Use `dtype` instead!
|
| 2 |
+
{
|
| 3 |
+
"started_at_brasilia": "2026-11-10T16:11:11.132132-03:00",
|
| 4 |
+
"hardware": {
|
| 5 |
+
"cpu": "Intel(R) Xeon(R) Processor",
|
| 6 |
+
"logical_cpus": 8,
|
| 7 |
+
"ram_total_gib": 15.627,
|
| 8 |
+
"gpu_available": false
|
| 9 |
+
},
|
| 10 |
+
"versions": {
|
| 11 |
+
"python": "3.13.5",
|
| 12 |
+
"torch": "2.15.0+cpu",
|
| 13 |
+
"transformers": "4.57.6",
|
| 14 |
+
"peft": "0.21.2",
|
| 15 |
+
"datasets": "5.0.1",
|
| 16 |
+
"accelerate": "1.15.0"
|
| 17 |
+
},
|
| 18 |
+
"sources": {
|
| 19 |
+
"model": {
|
| 20 |
+
"id": "TucanoBR/Tucano-160m",
|
| 21 |
+
"revision": "6331cbef9933c05d8d0c8ae5ee23ed2570f06571"
|
| 22 |
+
},
|
| 23 |
+
"dataset": {
|
| 24 |
+
"id": "OpenAssistant/oasst2",
|
| 25 |
+
"revision": "179dd21fc55192153d94adb0e0ce8f69e222bf75"
|
| 26 |
+
}
|
| 27 |
+
},
|
| 28 |
+
"config": {
|
| 29 |
+
"seed": 42,
|
| 30 |
+
"threads": 6,
|
| 31 |
+
"epochs": 6,
|
| 32 |
+
"micro_batch_size": 4,
|
| 33 |
+
"gradient_accumulation_steps": 4,
|
| 34 |
+
"effective_batch_size": 16,
|
| 35 |
+
"learning_rate": 0.0003,
|
| 36 |
+
"weight_decay": 0.01,
|
| 37 |
+
"warmup_ratio": 0.1,
|
| 38 |
+
"max_grad_norm": 1.0,
|
| 39 |
+
"rank": 16,
|
| 40 |
+
"lora_alpha": 32,
|
| 41 |
+
"lora_dropout": 0.05,
|
| 42 |
+
"target_modules": [
|
| 43 |
+
"q_proj",
|
| 44 |
+
"k_proj",
|
| 45 |
+
"v_proj",
|
| 46 |
+
"o_proj",
|
| 47 |
+
"gate_proj",
|
| 48 |
+
"up_proj",
|
| 49 |
+
"down_proj"
|
| 50 |
+
],
|
| 51 |
+
"max_length": 384,
|
| 52 |
+
"precision": "CPU bfloat16 autocast; float32 base weights and trainable adapters",
|
| 53 |
+
"loss": "completion-only token-weighted next-token negative log likelihood, including EOS"
|
| 54 |
+
},
|
| 55 |
+
"trainable_parameters": 3391488,
|
| 56 |
+
"total_parameters_with_adapter": 165808896,
|
| 57 |
+
"base_parameters": 162417408,
|
| 58 |
+
"split_examples": {
|
| 59 |
+
"train": 94,
|
| 60 |
+
"validation": 12,
|
| 61 |
+
"test": 12
|
| 62 |
+
}
|
| 63 |
+
}
|
| 64 |
+
The following generation flags are not valid and may be ignored: ['temperature']. Set `TRANSFORMERS_VERBOSITY=info` for more details.
|
| 65 |
+
BASELINE {"validation": {"loss": 2.356751855036902, "perplexity": 10.55660631600646, "response_tokens": 1522, "examples": 12, "seconds": 0.7319192210052279}, "test": {"loss": 2.430188522578911, "perplexity": 11.361023687609077, "response_tokens": 1907, "examples": 12, "seconds": 0.6798040540015791}}
|
| 66 |
+
{"event": "step", "epoch": 1, "optimizer_step": 5, "running_train_loss": 2.238007207674975, "lr": 0.00029728930458940595, "grad_norm": 0.8063221573829651, "epoch_elapsed_seconds": 22.473043352998502}
|
| 67 |
+
{"event": "epoch", "epoch": 1, "optimizer_steps": 6, "train_loss": 2.2584660765231943, "train_seconds": 25.907004280001274, "validation": {"loss": 2.2768132312225764, "perplexity": 9.745573980476506, "response_tokens": 1522, "examples": 12, "seconds": 0.5419957140038605}}
|
| 68 |
+
{"event": "step", "epoch": 2, "optimizer_step": 10, "running_train_loss": 2.1012608638544528, "lr": 0.00026790796421141813, "grad_norm": 0.5991487503051758, "epoch_elapsed_seconds": 18.22901766400173}
|
| 69 |
+
{"event": "epoch", "epoch": 2, "optimizer_steps": 12, "train_loss": 2.098645087989428, "train_seconds": 25.95503581200319, "validation": {"loss": 2.242185463416592, "perplexity": 9.413882518133018, "response_tokens": 1522, "examples": 12, "seconds": 0.5481375860035769}}
|
| 70 |
+
{"event": "step", "epoch": 3, "optimizer_step": 15, "running_train_loss": 1.9789021475735185, "lr": 0.00021231225195028297, "grad_norm": 0.5209558606147766, "epoch_elapsed_seconds": 12.166495024997857}
|
| 71 |
+
{"event": "epoch", "epoch": 3, "optimizer_steps": 18, "train_loss": 1.981365356522283, "train_seconds": 24.54493858999922, "validation": {"loss": 2.243609419633462, "perplexity": 9.427297023236907, "response_tokens": 1522, "examples": 12, "seconds": 0.6372171650000382}}
|
| 72 |
+
{"event": "step", "epoch": 4, "optimizer_step": 20, "running_train_loss": 1.9427905353859114, "lr": 0.00014286271262643866, "grad_norm": 0.5414717197418213, "epoch_elapsed_seconds": 8.372175031996449}
|
| 73 |
+
{"event": "epoch", "epoch": 4, "optimizer_steps": 24, "train_loss": 1.8920829225523852, "train_seconds": 25.12302869799896, "validation": {"loss": 2.24681126335134, "perplexity": 9.457530130000158, "response_tokens": 1522, "examples": 12, "seconds": 0.5965341569972225}}
|
| 74 |
+
{"event": "step", "epoch": 5, "optimizer_step": 25, "running_train_loss": 1.8080690098776657, "lr": 7.500000000000002e-05, "grad_norm": 0.4843766689300537, "epoch_elapsed_seconds": 5.079509700997733}
|
| 75 |
+
{"event": "step", "epoch": 5, "optimizer_step": 30, "running_train_loss": 1.8361153760542404, "lr": 2.38119700753228e-05, "grad_norm": 0.5224012732505798, "epoch_elapsed_seconds": 26.849627632000193}
|
| 76 |
+
{"event": "epoch", "epoch": 5, "optimizer_steps": 30, "train_loss": 1.8361153760542404, "train_seconds": 26.84980382199865, "validation": {"loss": 2.248372650961055, "perplexity": 9.472308534770303, "response_tokens": 1522, "examples": 12, "seconds": 0.5754360380014987}}
|
| 77 |
+
{"event": "step", "epoch": 6, "optimizer_step": 35, "running_train_loss": 1.8029368741417207, "lr": 6.792116140373116e-07, "grad_norm": 0.6384185552597046, "epoch_elapsed_seconds": 22.325316743001167}
|
| 78 |
+
{"event": "epoch", "epoch": 6, "optimizer_steps": 36, "train_loss": 1.8106174533771444, "train_seconds": 26.368592519997037, "validation": {"loss": 2.2492608048129488, "perplexity": 9.48072513914832, "response_tokens": 1522, "examples": 12, "seconds": 0.6144218890040065}}
|
| 79 |
+
FINISHED {"before": {"validation": {"loss": 2.356751855036902, "perplexity": 10.55660631600646, "response_tokens": 1522, "examples": 12, "seconds": 0.7319192210052279}, "test": {"loss": 2.430188522578911, "perplexity": 11.361023687609077, "response_tokens": 1907, "examples": 12, "seconds": 0.6798040540015791}}, "after": {"validation": {"loss": 2.2419521171066044, "perplexity": 9.411686079660129, "response_tokens": 1522, "examples": 12, "seconds": 0.5894143010009429}, "test": {"loss": 2.3471716908678437, "perplexity": 10.455955191388183, "response_tokens": 1907, "examples": 12, "seconds": 0.6937924470039434}}, "train_seconds": 154.74840372199833, "wall_seconds": 187.06369254900346}
|
logs/verify.log
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
`torch_dtype` is deprecated! Use `dtype` instead!
|
| 2 |
+
The following generation flags are not valid and may be ignored: ['temperature']. Set `TRANSFORMERS_VERBOSITY=info` for more details.
|
| 3 |
+
{
|
| 4 |
+
"finite_weights": true,
|
| 5 |
+
"nonzero_trained_B": true,
|
| 6 |
+
"metrics": {
|
| 7 |
+
"before_validation": {
|
| 8 |
+
"loss": 2.356857261739172,
|
| 9 |
+
"perplexity": 10.557719111712423,
|
| 10 |
+
"response_tokens": 1522,
|
| 11 |
+
"matches_saved": true
|
| 12 |
+
},
|
| 13 |
+
"before_test": {
|
| 14 |
+
"loss": 2.4296030150575043,
|
| 15 |
+
"perplexity": 11.354373669796804,
|
| 16 |
+
"response_tokens": 1907,
|
| 17 |
+
"matches_saved": true
|
| 18 |
+
},
|
| 19 |
+
"after_validation": {
|
| 20 |
+
"loss": 2.2421957183918093,
|
| 21 |
+
"perplexity": 9.413979057759946,
|
| 22 |
+
"response_tokens": 1522,
|
| 23 |
+
"matches_saved": true
|
| 24 |
+
},
|
| 25 |
+
"after_test": {
|
| 26 |
+
"loss": 2.3472890483814193,
|
| 27 |
+
"perplexity": 10.457182348298135,
|
| 28 |
+
"response_tokens": 1907,
|
| 29 |
+
"matches_saved": true
|
| 30 |
+
}
|
| 31 |
+
},
|
| 32 |
+
"first_generation_matches_saved": true
|
| 33 |
+
}
|
manifest-sha256.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"LICENSE": "7c6b5cba1532431d58b4820e49de2e5a188d235a9522b8bf3327955c02acac25",
|
| 3 |
+
"NOTICE": "40e1dc3c3b8de124558c834c0e3ccc5f67bacec7ea6d5909813dbde62d5c8549",
|
| 4 |
+
"README.md": "d789675f3591ebbbd1473d00c116498620ef3b2d2d65677971d1c4c54fcf4547",
|
| 5 |
+
"adapter_config.json": "b253bcd664a9aea65293f61730423d47d72bcc5cbf07bbe607407c505b4f76f5",
|
| 6 |
+
"adapter_model.safetensors": "0dec305009fff55a334b7a829d7b0763bbcceeee3a8892090e88303784c6c980",
|
| 7 |
+
"baseline.json": "3883eeea03ad5da6315442e5059362d356c03429428c41edb28c9ce67c08d157",
|
| 8 |
+
"bfloat16-generations.json": "160cccce1ff2cd657d6ebe459f141abaca7b43ce41250aa8bd78c45e108c3f1b",
|
| 9 |
+
"data/test.jsonl": "38b43cda5b42944a6514b34875d97b582712c71e760bc60f71e973e3450fe4d7",
|
| 10 |
+
"data/train.jsonl": "b0d8c02a8b224cea94195223fa2d15e0175dec6ef32b1eaad8f2f02f29eea1e5",
|
| 11 |
+
"data/validation.jsonl": "cb4d0697656b4be88bc175ab59087856ce32ac748f1dec6c2caedaec4addf22a",
|
| 12 |
+
"data-stats.json": "a0aeeebc60b5c9390eba6e8f57ba0fc356132d0b97c33291919d5ad6929a4bc7",
|
| 13 |
+
"generations.json": "53df92d14c1c073d5e4fcd46bead197bc574542829a4b29816d32d32117a0184",
|
| 14 |
+
"logs/final-eval.log": "6cb12bf68a8a488218e1892c4f82662b97e5949acf108607a0106b6984c5f80d",
|
| 15 |
+
"logs/prepare.log": "9ae3a71a43341c8230147030c9fb7d2f6a2afec7bb3b5c4d2ca71daf4f658c27",
|
| 16 |
+
"logs/smoke.log": "2835464af70f6f018f6c8216dbddaf7006d3f16f0ac18f293716de9b5082c3c1",
|
| 17 |
+
"logs/train.log": "76fafb79c735d34753d8fe4a0ced79136aff4cfa783eb5eee2f32cd58b46d6c8",
|
| 18 |
+
"logs/verify.log": "2b68f077164df928e051bb3b34974e1f5eab958301223c7f2a6961b4d16fda83",
|
| 19 |
+
"metrics.json": "e07fa309701cc3265fdf9a83fa324a904c6d486869bcc3b20ad764fd93aff80f",
|
| 20 |
+
"requirements-lock.txt": "9f3d3517410fc37025442fbf1408b50e3392c49303ad1dd5192806c99820d764",
|
| 21 |
+
"scripts/download_base.py": "db95a1585e01dcd938288b096088cc4b7add2c5213f8080fe55c5f93b48c9e02",
|
| 22 |
+
"scripts/final_eval.py": "1eeee1e7196f6ec386e76af4c29e92bd8300c2327bfe08a755347c4b990ab701",
|
| 23 |
+
"scripts/prepare.py": "838e3101671a18fedff9a2ace5fb0085bc47a5af4e757262accb991a366dc19f",
|
| 24 |
+
"scripts/test_pipeline.py": "ac6b1a29bafab420c2ccb7eef1862439ce1254a9c4b0d4eb0e9eafc9b771d13f",
|
| 25 |
+
"scripts/train.py": "79c9de03f82895578ce9fa507b2fd65684b60fa3a9b997533ba82ef1c76ebb54",
|
| 26 |
+
"scripts/verify_adapter.py": "a4fb9efd28803b77e13df35afcb4b9937c50016f8873f0fb0320988126b92f14",
|
| 27 |
+
"source-revisions.json": "288156df0b8d49109ba0d7492cb2f2d9eef91f7f52eec35968c650cea66b085e",
|
| 28 |
+
"training-log.jsonl": "b2a70a53d1404a55284349eaa4bdcc473bf4e09cbb16f1740884138f26954dfb",
|
| 29 |
+
"training-metrics.json": "71f4c66b218299fc6de25436158115b88165547fff0e4cd5118f36784558202d",
|
| 30 |
+
"verification.json": "ca41853bbf0c36bf6b7489f69eee94c09039f1a4199e7cde7282c3d2d533a8e5"
|
| 31 |
+
}
|
metrics.json
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"started_at_brasilia": "2026-11-10T16:11:11.132132-03:00",
|
| 3 |
+
"hardware": {
|
| 4 |
+
"cpu": "Intel(R) Xeon(R) Processor",
|
| 5 |
+
"logical_cpus": 8,
|
| 6 |
+
"ram_total_gib": 15.627,
|
| 7 |
+
"gpu_available": false
|
| 8 |
+
},
|
| 9 |
+
"versions": {
|
| 10 |
+
"python": "3.13.5",
|
| 11 |
+
"torch": "2.15.0+cpu",
|
| 12 |
+
"transformers": "4.57.6",
|
| 13 |
+
"peft": "0.21.2",
|
| 14 |
+
"datasets": "5.0.1",
|
| 15 |
+
"accelerate": "1.15.0"
|
| 16 |
+
},
|
| 17 |
+
"sources": {
|
| 18 |
+
"model": {
|
| 19 |
+
"id": "TucanoBR/Tucano-160m",
|
| 20 |
+
"revision": "6331cbef9933c05d8d0c8ae5ee23ed2570f06571"
|
| 21 |
+
},
|
| 22 |
+
"dataset": {
|
| 23 |
+
"id": "OpenAssistant/oasst2",
|
| 24 |
+
"revision": "179dd21fc55192153d94adb0e0ce8f69e222bf75"
|
| 25 |
+
}
|
| 26 |
+
},
|
| 27 |
+
"config": {
|
| 28 |
+
"seed": 42,
|
| 29 |
+
"threads": 6,
|
| 30 |
+
"epochs": 6,
|
| 31 |
+
"micro_batch_size": 4,
|
| 32 |
+
"gradient_accumulation_steps": 4,
|
| 33 |
+
"effective_batch_size": 16,
|
| 34 |
+
"learning_rate": 0.0003,
|
| 35 |
+
"weight_decay": 0.01,
|
| 36 |
+
"warmup_ratio": 0.1,
|
| 37 |
+
"max_grad_norm": 1.0,
|
| 38 |
+
"rank": 16,
|
| 39 |
+
"lora_alpha": 32,
|
| 40 |
+
"lora_dropout": 0.05,
|
| 41 |
+
"target_modules": [
|
| 42 |
+
"q_proj",
|
| 43 |
+
"k_proj",
|
| 44 |
+
"v_proj",
|
| 45 |
+
"o_proj",
|
| 46 |
+
"gate_proj",
|
| 47 |
+
"up_proj",
|
| 48 |
+
"down_proj"
|
| 49 |
+
],
|
| 50 |
+
"max_length": 384,
|
| 51 |
+
"precision": "CPU bfloat16 autocast; float32 base weights and trainable adapters",
|
| 52 |
+
"loss": "completion-only token-weighted next-token negative log likelihood, including EOS"
|
| 53 |
+
},
|
| 54 |
+
"trainable_parameters": 3391488,
|
| 55 |
+
"total_parameters_with_adapter": 165808896,
|
| 56 |
+
"base_parameters": 162417408,
|
| 57 |
+
"split_examples": {
|
| 58 |
+
"train": 94,
|
| 59 |
+
"validation": 12,
|
| 60 |
+
"test": 12
|
| 61 |
+
},
|
| 62 |
+
"before": {
|
| 63 |
+
"validation": {
|
| 64 |
+
"loss": 2.356857261739172,
|
| 65 |
+
"perplexity": 10.557719111712423,
|
| 66 |
+
"response_tokens": 1522,
|
| 67 |
+
"examples": 12,
|
| 68 |
+
"seconds": 1.1720929019938922
|
| 69 |
+
},
|
| 70 |
+
"test": {
|
| 71 |
+
"loss": 2.4296030150575043,
|
| 72 |
+
"perplexity": 11.354373669796804,
|
| 73 |
+
"response_tokens": 1907,
|
| 74 |
+
"examples": 12,
|
| 75 |
+
"seconds": 1.310258571000304
|
| 76 |
+
}
|
| 77 |
+
},
|
| 78 |
+
"best_epoch": 2,
|
| 79 |
+
"after": {
|
| 80 |
+
"validation": {
|
| 81 |
+
"loss": 2.2421957183918093,
|
| 82 |
+
"perplexity": 9.413979057759946,
|
| 83 |
+
"response_tokens": 1522,
|
| 84 |
+
"examples": 12,
|
| 85 |
+
"seconds": 1.3975867709959857
|
| 86 |
+
},
|
| 87 |
+
"test": {
|
| 88 |
+
"loss": 2.3472890483814193,
|
| 89 |
+
"perplexity": 10.457182348298135,
|
| 90 |
+
"response_tokens": 1907,
|
| 91 |
+
"examples": 12,
|
| 92 |
+
"seconds": 1.5549200380046386
|
| 93 |
+
}
|
| 94 |
+
},
|
| 95 |
+
"training_started_at_brasilia": "2026-11-10T16:11:25.463075-03:00",
|
| 96 |
+
"training_finished_at_brasilia": "2026-11-10T16:14:04.097314-03:00",
|
| 97 |
+
"training_seconds_excluding_evaluation": 154.74840372199833,
|
| 98 |
+
"validation_seconds_during_training": 3.513742549010203,
|
| 99 |
+
"optimizer_steps": 36,
|
| 100 |
+
"supervised_tokens_across_epochs": 75084,
|
| 101 |
+
"history": [
|
| 102 |
+
{
|
| 103 |
+
"event": "epoch",
|
| 104 |
+
"epoch": 1,
|
| 105 |
+
"optimizer_steps": 6,
|
| 106 |
+
"train_loss": 2.2584660765231943,
|
| 107 |
+
"train_seconds": 25.907004280001274,
|
| 108 |
+
"validation": {
|
| 109 |
+
"loss": 2.2768132312225764,
|
| 110 |
+
"perplexity": 9.745573980476506,
|
| 111 |
+
"response_tokens": 1522,
|
| 112 |
+
"examples": 12,
|
| 113 |
+
"seconds": 0.5419957140038605
|
| 114 |
+
}
|
| 115 |
+
},
|
| 116 |
+
{
|
| 117 |
+
"event": "epoch",
|
| 118 |
+
"epoch": 2,
|
| 119 |
+
"optimizer_steps": 12,
|
| 120 |
+
"train_loss": 2.098645087989428,
|
| 121 |
+
"train_seconds": 25.95503581200319,
|
| 122 |
+
"validation": {
|
| 123 |
+
"loss": 2.242185463416592,
|
| 124 |
+
"perplexity": 9.413882518133018,
|
| 125 |
+
"response_tokens": 1522,
|
| 126 |
+
"examples": 12,
|
| 127 |
+
"seconds": 0.5481375860035769
|
| 128 |
+
}
|
| 129 |
+
},
|
| 130 |
+
{
|
| 131 |
+
"event": "epoch",
|
| 132 |
+
"epoch": 3,
|
| 133 |
+
"optimizer_steps": 18,
|
| 134 |
+
"train_loss": 1.981365356522283,
|
| 135 |
+
"train_seconds": 24.54493858999922,
|
| 136 |
+
"validation": {
|
| 137 |
+
"loss": 2.243609419633462,
|
| 138 |
+
"perplexity": 9.427297023236907,
|
| 139 |
+
"response_tokens": 1522,
|
| 140 |
+
"examples": 12,
|
| 141 |
+
"seconds": 0.6372171650000382
|
| 142 |
+
}
|
| 143 |
+
},
|
| 144 |
+
{
|
| 145 |
+
"event": "epoch",
|
| 146 |
+
"epoch": 4,
|
| 147 |
+
"optimizer_steps": 24,
|
| 148 |
+
"train_loss": 1.8920829225523852,
|
| 149 |
+
"train_seconds": 25.12302869799896,
|
| 150 |
+
"validation": {
|
| 151 |
+
"loss": 2.24681126335134,
|
| 152 |
+
"perplexity": 9.457530130000158,
|
| 153 |
+
"response_tokens": 1522,
|
| 154 |
+
"examples": 12,
|
| 155 |
+
"seconds": 0.5965341569972225
|
| 156 |
+
}
|
| 157 |
+
},
|
| 158 |
+
{
|
| 159 |
+
"event": "epoch",
|
| 160 |
+
"epoch": 5,
|
| 161 |
+
"optimizer_steps": 30,
|
| 162 |
+
"train_loss": 1.8361153760542404,
|
| 163 |
+
"train_seconds": 26.84980382199865,
|
| 164 |
+
"validation": {
|
| 165 |
+
"loss": 2.248372650961055,
|
| 166 |
+
"perplexity": 9.472308534770303,
|
| 167 |
+
"response_tokens": 1522,
|
| 168 |
+
"examples": 12,
|
| 169 |
+
"seconds": 0.5754360380014987
|
| 170 |
+
}
|
| 171 |
+
},
|
| 172 |
+
{
|
| 173 |
+
"event": "epoch",
|
| 174 |
+
"epoch": 6,
|
| 175 |
+
"optimizer_steps": 36,
|
| 176 |
+
"train_loss": 1.8106174533771444,
|
| 177 |
+
"train_seconds": 26.368592519997037,
|
| 178 |
+
"validation": {
|
| 179 |
+
"loss": 2.2492608048129488,
|
| 180 |
+
"perplexity": 9.48072513914832,
|
| 181 |
+
"response_tokens": 1522,
|
| 182 |
+
"examples": 12,
|
| 183 |
+
"seconds": 0.6144218890040065
|
| 184 |
+
}
|
| 185 |
+
}
|
| 186 |
+
],
|
| 187 |
+
"wall_seconds_including_baselines_and_generations": 187.06369254900346,
|
| 188 |
+
"max_process_rss_gib": 5.4983062744140625,
|
| 189 |
+
"finished_at_brasilia": "2026-11-10T16:14:17.906711-03:00",
|
| 190 |
+
"bfloat16_training_evaluation": {
|
| 191 |
+
"before": {
|
| 192 |
+
"validation": {
|
| 193 |
+
"loss": 2.356751855036902,
|
| 194 |
+
"perplexity": 10.55660631600646,
|
| 195 |
+
"response_tokens": 1522,
|
| 196 |
+
"examples": 12,
|
| 197 |
+
"seconds": 0.7319192210052279
|
| 198 |
+
},
|
| 199 |
+
"test": {
|
| 200 |
+
"loss": 2.430188522578911,
|
| 201 |
+
"perplexity": 11.361023687609077,
|
| 202 |
+
"response_tokens": 1907,
|
| 203 |
+
"examples": 12,
|
| 204 |
+
"seconds": 0.6798040540015791
|
| 205 |
+
}
|
| 206 |
+
},
|
| 207 |
+
"after": {
|
| 208 |
+
"validation": {
|
| 209 |
+
"loss": 2.2419521171066044,
|
| 210 |
+
"perplexity": 9.411686079660129,
|
| 211 |
+
"response_tokens": 1522,
|
| 212 |
+
"examples": 12,
|
| 213 |
+
"seconds": 0.5894143010009429
|
| 214 |
+
},
|
| 215 |
+
"test": {
|
| 216 |
+
"loss": 2.3471716908678437,
|
| 217 |
+
"perplexity": 10.455955191388183,
|
| 218 |
+
"response_tokens": 1907,
|
| 219 |
+
"examples": 12,
|
| 220 |
+
"seconds": 0.6937924470039434
|
| 221 |
+
}
|
| 222 |
+
}
|
| 223 |
+
},
|
| 224 |
+
"reported_evaluation_precision": "float32, no autocast",
|
| 225 |
+
"checkpoint_selection_precision": "CPU bfloat16 autocast; unchanged recorded validation selection",
|
| 226 |
+
"final_float32_evaluation_seconds": 14.197787631004758,
|
| 227 |
+
"precision_note": "Repeated identical BF16 forwards varied numerically on this CPU. Float32 reporting evaluation was used instead; no checkpoint or hyperparameter was changed. Original BF16 measurements remain in training-metrics.json."
|
| 228 |
+
}
|
requirements-lock.txt
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
accelerate==1.15.0
|
| 2 |
+
aiohappyeyeballs==2.7.1
|
| 3 |
+
aiohttp==3.14.5
|
| 4 |
+
aiosignal==1.4.0
|
| 5 |
+
anyio==4.16.0
|
| 6 |
+
attrs==26.1.0
|
| 7 |
+
certifi==2026.10.23
|
| 8 |
+
charset-normalizer==3.5.2
|
| 9 |
+
cloudpickle==3.1.2
|
| 10 |
+
datasets==5.0.1
|
| 11 |
+
dill==0.4.1
|
| 12 |
+
filelock==4.2.4
|
| 13 |
+
frozenlist==1.8.0
|
| 14 |
+
fsspec==2026.6.0
|
| 15 |
+
h11==0.16.0
|
| 16 |
+
hf-xet==1.8.0
|
| 17 |
+
httpcore==1.0.9
|
| 18 |
+
httpx==0.28.1
|
| 19 |
+
huggingface_hub==0.36.2
|
| 20 |
+
idna==3.20
|
| 21 |
+
Jinja2==3.1.6
|
| 22 |
+
joblib==1.6.0
|
| 23 |
+
MarkupSafe==3.0.3
|
| 24 |
+
mpmath==1.3.0
|
| 25 |
+
multidict==7.2.1
|
| 26 |
+
multiprocess==0.70.19
|
| 27 |
+
narwhals==2.28.0
|
| 28 |
+
networkx==3.7
|
| 29 |
+
numpy==2.5.4
|
| 30 |
+
packaging==26.3
|
| 31 |
+
pandas==3.1.1
|
| 32 |
+
peft==0.21.2
|
| 33 |
+
propcache==0.5.4
|
| 34 |
+
psutil==7.2.2
|
| 35 |
+
pyarrow==26.0.1
|
| 36 |
+
python-dateutil==4.0.0
|
| 37 |
+
PyYAML==6.0.3
|
| 38 |
+
regex==2026.11.9
|
| 39 |
+
requests==2.34.2
|
| 40 |
+
safetensors==0.8.0
|
| 41 |
+
scikit-learn==1.9.1
|
| 42 |
+
scipy==1.18.1
|
| 43 |
+
sentencepiece==0.2.3
|
| 44 |
+
setuptools==78.1.0
|
| 45 |
+
sympy==1.14.0
|
| 46 |
+
threadpoolctl==3.8.0
|
| 47 |
+
tokenizers==0.22.2
|
| 48 |
+
torch==2.15.0+cpu
|
| 49 |
+
tqdm==4.70.1
|
| 50 |
+
transformers==4.57.6
|
| 51 |
+
typing_extensions==4.16.0
|
| 52 |
+
tzdata==2026.6
|
| 53 |
+
urllib3==2.8.0
|
| 54 |
+
xxhash==4.1.0
|
| 55 |
+
yarl==1.25.1
|
scripts/download_base.py
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Fetch the pinned Apache-2.0 base weights, tokenizer and license."""
|
| 2 |
+
import json
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
from huggingface_hub import snapshot_download
|
| 5 |
+
|
| 6 |
+
root = Path(__file__).resolve().parent.parent
|
| 7 |
+
source = json.loads((root / "source-revisions.json").read_text())["model"]
|
| 8 |
+
snapshot_download(source["id"], revision=source["revision"], allow_patterns=["config.json", "generation_config.json", "*.safetensors", "tokenizer*", "special_tokens_map.json", "LICENSE", "README.md"], local_dir=root/"base")
|
scripts/final_eval.py
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Stable float32 reporting evaluation of the already selected checkpoint.
|
| 2 |
+
Training/checkpoint selection remain the recorded bfloat16 experiment.
|
| 3 |
+
"""
|
| 4 |
+
import contextlib
|
| 5 |
+
import json
|
| 6 |
+
import math
|
| 7 |
+
import time
|
| 8 |
+
from pathlib import Path
|
| 9 |
+
import torch
|
| 10 |
+
from peft import PeftModel
|
| 11 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer
|
| 12 |
+
from train import collate, encode, prompt
|
| 13 |
+
|
| 14 |
+
ROOT=Path(__file__).resolve().parent.parent
|
| 15 |
+
OUT=ROOT/"publish"
|
| 16 |
+
start=time.perf_counter()
|
| 17 |
+
torch.set_num_threads(6);torch.set_num_interop_threads(1)
|
| 18 |
+
metrics=json.loads((OUT/"metrics.json").read_text())
|
| 19 |
+
assert metrics.get("reported_evaluation_precision") is None,"Do not overwrite a completed final evaluation"
|
| 20 |
+
(OUT/"training-metrics.json").write_text(json.dumps(metrics,indent=2,ensure_ascii=False))
|
| 21 |
+
(OUT/"bfloat16-generations.json").write_text((OUT/"generations.json").read_text())
|
| 22 |
+
tok=AutoTokenizer.from_pretrained(ROOT/"base")
|
| 23 |
+
base=AutoModelForCausalLM.from_pretrained(ROOT/"base",torch_dtype=torch.float32,attn_implementation="sdpa")
|
| 24 |
+
model=PeftModel.from_pretrained(base,OUT);model.eval()
|
| 25 |
+
rows={s:[json.loads(l) for l in (OUT/"data"/(s+".jsonl")).read_text().splitlines()] for s in ["validation","test"]}
|
| 26 |
+
new={};generated={}
|
| 27 |
+
for phase in ["before","after"]:
|
| 28 |
+
new[phase]={}
|
| 29 |
+
with torch.inference_mode(),(model.disable_adapter() if phase=="before" else contextlib.nullcontext()):
|
| 30 |
+
for split in ["validation","test"]:
|
| 31 |
+
summed=0.;tokens=0;t=time.perf_counter()
|
| 32 |
+
for begin in range(0,len(rows[split]),4):
|
| 33 |
+
batch=collate([encode(r,tok) for r in rows[split][begin:begin+4]],tok.pad_token_id)
|
| 34 |
+
n=int((batch["labels"][:,1:]!=-100).sum())
|
| 35 |
+
loss=model(**batch).loss
|
| 36 |
+
summed+=loss.item()*n;tokens+=n
|
| 37 |
+
new[phase][split]={"loss":summed/tokens,"perplexity":math.exp(summed/tokens),"response_tokens":tokens,"examples":len(rows[split]),"seconds":time.perf_counter()-t}
|
| 38 |
+
generated[phase]=[]
|
| 39 |
+
for row in rows["test"][:6]:
|
| 40 |
+
batch=tok(prompt(row["instruction"]),return_tensors="pt")
|
| 41 |
+
ids=model.generate(**batch,max_new_tokens=80,do_sample=False,use_cache=True,pad_token_id=tok.pad_token_id,eos_token_id=tok.eos_token_id)
|
| 42 |
+
generated[phase].append(tok.decode(ids[0,batch["input_ids"].shape[1]:],skip_special_tokens=True))
|
| 43 |
+
metrics["bfloat16_training_evaluation"]={"before":metrics["before"],"after":metrics["after"]}
|
| 44 |
+
metrics.update(new)
|
| 45 |
+
metrics["reported_evaluation_precision"]="float32, no autocast"
|
| 46 |
+
metrics["checkpoint_selection_precision"]="CPU bfloat16 autocast; unchanged recorded validation selection"
|
| 47 |
+
metrics["final_float32_evaluation_seconds"]=time.perf_counter()-start
|
| 48 |
+
metrics["precision_note"]="Repeated identical BF16 forwards varied numerically on this CPU. Float32 reporting evaluation was used instead; no checkpoint or hyperparameter was changed. Original BF16 measurements remain in training-metrics.json."
|
| 49 |
+
comp=[]
|
| 50 |
+
for i,row in enumerate(rows["test"][:6]):
|
| 51 |
+
comp.append({"prompt_id":row["prompt_id"],"instruction":row["instruction"],"reference":row["response"],"before":generated["before"][i],"after":generated["after"][i]})
|
| 52 |
+
(OUT/"metrics.json").write_text(json.dumps(metrics,indent=2,ensure_ascii=False))
|
| 53 |
+
(OUT/"generations.json").write_text(json.dumps(comp,indent=2,ensure_ascii=False))
|
| 54 |
+
print(json.dumps({"before":metrics["before"],"after":metrics["after"],"seconds":metrics["final_float32_evaluation_seconds"]},indent=2))
|
scripts/prepare.py
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Prepare a deterministic, first-turn pt-BR OASST2 instruction subset.
|
| 2 |
+
Apache-2.0. Run from the experiment directory.
|
| 3 |
+
"""
|
| 4 |
+
import collections
|
| 5 |
+
import gzip
|
| 6 |
+
import hashlib
|
| 7 |
+
import json
|
| 8 |
+
from pathlib import Path
|
| 9 |
+
|
| 10 |
+
import regex
|
| 11 |
+
from huggingface_hub import hf_hub_download
|
| 12 |
+
from transformers import AutoTokenizer
|
| 13 |
+
|
| 14 |
+
ROOT = Path(__file__).resolve().parent.parent
|
| 15 |
+
SOURCES = json.loads((ROOT / "source-revisions.json").read_text())
|
| 16 |
+
REPO = SOURCES["dataset"]["id"]
|
| 17 |
+
REV = SOURCES["dataset"]["revision"]
|
| 18 |
+
MAX_LENGTH = 384
|
| 19 |
+
TOKENIZER = AutoTokenizer.from_pretrained(SOURCES["model"]["id"], revision=SOURCES["model"]["revision"])
|
| 20 |
+
|
| 21 |
+
def prompt(text):
|
| 22 |
+
return "### Instrução:\n" + text.strip() + "\n\n### Resposta:\n"
|
| 23 |
+
|
| 24 |
+
def accepted(row):
|
| 25 |
+
if row.get("lang") != "pt-BR" or row.get("deleted") or row.get("synthetic") or row.get("review_result") is not True:
|
| 26 |
+
return False
|
| 27 |
+
labels = row.get("labels", {})
|
| 28 |
+
for name in ("spam", "pii", "lang_mismatch"):
|
| 29 |
+
if labels.get(name, {}).get("value", 0) > 0:
|
| 30 |
+
return False
|
| 31 |
+
if labels.get("quality", {}).get("value", 0) < 0.5:
|
| 32 |
+
return False
|
| 33 |
+
return not regex.search(r"\p{Extended_Pictographic}", row["text"])
|
| 34 |
+
|
| 35 |
+
def main():
|
| 36 |
+
f = hf_hub_download(REPO, "2023-11-05_oasst2_ready.messages.jsonl.gz", repo_type="dataset", revision=REV)
|
| 37 |
+
with gzip.open(f, "rt") as stream:
|
| 38 |
+
rows = [json.loads(line) for line in stream]
|
| 39 |
+
by_id = {r["message_id"]: r for r in rows}
|
| 40 |
+
counts = collections.Counter()
|
| 41 |
+
pairs = []
|
| 42 |
+
seen_prompts = set()
|
| 43 |
+
for answer in sorted(rows, key=lambda r: r["message_id"]):
|
| 44 |
+
if answer["role"] != "assistant" or answer.get("rank") != 0 or not accepted(answer):
|
| 45 |
+
continue
|
| 46 |
+
question = by_id.get(answer.get("parent_id"))
|
| 47 |
+
if not question or question.get("parent_id") is not None or question["role"] != "prompter" or not accepted(question):
|
| 48 |
+
continue
|
| 49 |
+
counts["eligible_before_length"] += 1
|
| 50 |
+
q, a = question["text"].strip(), answer["text"].strip()
|
| 51 |
+
prompt_ids = TOKENIZER(prompt(q), add_special_tokens=True)["input_ids"]
|
| 52 |
+
answer_ids = TOKENIZER(a, add_special_tokens=False)["input_ids"] + [TOKENIZER.eos_token_id]
|
| 53 |
+
if not 4 <= len(answer_ids) <= 256 or not 4 <= len(prompt_ids) <= 128 or len(prompt_ids) + len(answer_ids) > MAX_LENGTH:
|
| 54 |
+
counts["excluded_length"] += 1
|
| 55 |
+
continue
|
| 56 |
+
norm = " ".join(q.casefold().split())
|
| 57 |
+
if norm in seen_prompts:
|
| 58 |
+
counts["excluded_duplicate_prompt"] += 1
|
| 59 |
+
continue
|
| 60 |
+
seen_prompts.add(norm)
|
| 61 |
+
group_hash = hashlib.sha256(("tucano-ptbr-v1:" + question["message_id"]).encode()).hexdigest()
|
| 62 |
+
pairs.append({"prompt_id": question["message_id"], "response_id": answer["message_id"], "tree_id": answer["message_tree_id"], "instruction": q, "response": a, "prompt_tokens": len(prompt_ids), "response_tokens": len(answer_ids), "split_hash": group_hash})
|
| 63 |
+
pairs.sort(key=lambda r: r["split_hash"])
|
| 64 |
+
# A new 80/10/10 split of whole roots, not the upstream message-level split.
|
| 65 |
+
n = len(pairs); n_train = int(n * .8); n_val = (n - n_train) // 2
|
| 66 |
+
split_rows = {"train": pairs[:n_train], "validation": pairs[n_train:n_train+n_val], "test": pairs[n_train+n_val:]}
|
| 67 |
+
output = ROOT / "publish" / "data"; output.mkdir(parents=True, exist_ok=True)
|
| 68 |
+
stats = {"source": REPO, "revision": REV, "filters": dict(counts), "max_length": MAX_LENGTH, "splits": {}}
|
| 69 |
+
for name, examples in split_rows.items():
|
| 70 |
+
data = "".join(json.dumps(r, ensure_ascii=False) + "\n" for r in examples)
|
| 71 |
+
(output / (name + ".jsonl")).write_text(data)
|
| 72 |
+
stats["splits"][name] = {"examples": len(examples), "prompt_tokens": sum(r["prompt_tokens"] for r in examples), "response_tokens": sum(r["response_tokens"] for r in examples), "sha256": hashlib.sha256(data.encode()).hexdigest()}
|
| 73 |
+
assert len({r["tree_id"] for r in pairs}) == n
|
| 74 |
+
stats["format"] = "### Instrução:\n{instruction}\n\n### Resposta:\n{response}<eos>"
|
| 75 |
+
(ROOT / "publish" / "data-stats.json").write_text(json.dumps(stats, indent=2, ensure_ascii=False))
|
| 76 |
+
print(json.dumps(stats, indent=2, ensure_ascii=False))
|
| 77 |
+
|
| 78 |
+
if __name__ == "__main__":
|
| 79 |
+
main()
|
scripts/test_pipeline.py
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Sanity checks for prompt/padding masks and held-out-root integrity."""
|
| 2 |
+
import json
|
| 3 |
+
import unittest
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from transformers import AutoTokenizer
|
| 6 |
+
from train import collate, encode, prompt
|
| 7 |
+
|
| 8 |
+
ROOT = Path(__file__).resolve().parent.parent
|
| 9 |
+
|
| 10 |
+
class PipelineTests(unittest.TestCase):
|
| 11 |
+
@classmethod
|
| 12 |
+
def setUpClass(cls):
|
| 13 |
+
cls.tokenizer = AutoTokenizer.from_pretrained(ROOT/"base")
|
| 14 |
+
|
| 15 |
+
def test_completion_and_padding_mask(self):
|
| 16 |
+
a = encode({"instruction":"Qual é a capital do Brasil?", "response":"Brasília."}, self.tokenizer)
|
| 17 |
+
b = encode({"instruction":"Responda sim.", "response":"Sim."}, self.tokenizer)
|
| 18 |
+
n = len(self.tokenizer(prompt("Qual é a capital do Brasil?"))["input_ids"])
|
| 19 |
+
self.assertTrue(all(x == -100 for x in a["labels"][:n]))
|
| 20 |
+
self.assertEqual(a["labels"][n:],a["input_ids"][n:])
|
| 21 |
+
self.assertEqual(a["labels"][-1], self.tokenizer.eos_token_id)
|
| 22 |
+
batch = collate([a,b],self.tokenizer.pad_token_id)
|
| 23 |
+
self.assertTrue((batch["labels"][batch["attention_mask"] == 0] == -100).all())
|
| 24 |
+
self.assertEqual(int((batch["labels"][:,1:]!=-100).sum()),sum(sum(v!=-100 for v in row["labels"][1:]) for row in [a,b]))
|
| 25 |
+
|
| 26 |
+
def test_split_integrity(self):
|
| 27 |
+
trees, prompts = set(),set()
|
| 28 |
+
for name in ["train","validation","test"]:
|
| 29 |
+
path = ROOT/"publish"/"data"/(name+".jsonl")
|
| 30 |
+
rows = [json.loads(l) for l in path.read_text().splitlines()]
|
| 31 |
+
for row in rows:
|
| 32 |
+
self.assertNotIn(row["tree_id"],trees);trees.add(row["tree_id"])
|
| 33 |
+
norm=" ".join(row["instruction"].casefold().split())
|
| 34 |
+
self.assertNotIn(norm,prompts);prompts.add(norm)
|
| 35 |
+
encoded = encode(row,self.tokenizer)
|
| 36 |
+
self.assertLessEqual(len(encoded["input_ids"]),384)
|
| 37 |
+
self.assertEqual(sum(y!=-100 for y in encoded["labels"]),row["response_tokens"])
|
| 38 |
+
|
| 39 |
+
if __name__=="__main__": unittest.main()
|
scripts/train.py
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""CPU LoRA training with completion-only NLL and root-disjoint holdouts.
|
| 2 |
+
Apache-2.0. Run from the experiment directory. No generated text is executed.
|
| 3 |
+
"""
|
| 4 |
+
import argparse
|
| 5 |
+
import contextlib
|
| 6 |
+
import json
|
| 7 |
+
import math
|
| 8 |
+
import os
|
| 9 |
+
import platform
|
| 10 |
+
import random
|
| 11 |
+
import resource
|
| 12 |
+
import time
|
| 13 |
+
from datetime import datetime
|
| 14 |
+
from pathlib import Path
|
| 15 |
+
from zoneinfo import ZoneInfo
|
| 16 |
+
|
| 17 |
+
import accelerate
|
| 18 |
+
import datasets
|
| 19 |
+
import peft
|
| 20 |
+
import torch
|
| 21 |
+
import transformers
|
| 22 |
+
from peft import LoraConfig, get_peft_model
|
| 23 |
+
from torch.utils.data import DataLoader
|
| 24 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer, get_cosine_schedule_with_warmup
|
| 25 |
+
|
| 26 |
+
ROOT = Path(__file__).resolve().parent.parent
|
| 27 |
+
|
| 28 |
+
def prompt(text):
|
| 29 |
+
return "### Instrução:\n" + text.strip() + "\n\n### Resposta:\n"
|
| 30 |
+
|
| 31 |
+
def collate(examples, pad):
|
| 32 |
+
length = max(len(x["input_ids"]) for x in examples)
|
| 33 |
+
ids, labels, masks = [], [], []
|
| 34 |
+
for x in examples:
|
| 35 |
+
n = length - len(x["input_ids"])
|
| 36 |
+
ids.append(x["input_ids"] + [pad] * n)
|
| 37 |
+
labels.append(x["labels"] + [-100] * n)
|
| 38 |
+
masks.append([1] * len(x["input_ids"]) + [0] * n)
|
| 39 |
+
return {"input_ids": torch.tensor(ids), "labels": torch.tensor(labels), "attention_mask": torch.tensor(masks)}
|
| 40 |
+
|
| 41 |
+
def encode(row, tokenizer):
|
| 42 |
+
p = tokenizer(prompt(row["instruction"]), add_special_tokens=True)["input_ids"]
|
| 43 |
+
a = tokenizer(row["response"], add_special_tokens=False)["input_ids"] + [tokenizer.eos_token_id]
|
| 44 |
+
return {"input_ids": p+a, "labels": [-100]*len(p)+a}
|
| 45 |
+
|
| 46 |
+
def now():
|
| 47 |
+
return datetime.now(ZoneInfo("America/Sao_Paulo")).isoformat()
|
| 48 |
+
|
| 49 |
+
def main():
|
| 50 |
+
parser = argparse.ArgumentParser()
|
| 51 |
+
parser.add_argument("--smoke", action="store_true")
|
| 52 |
+
args = parser.parse_args()
|
| 53 |
+
cfg = {"seed":42, "threads":6, "epochs":6, "micro_batch_size":4, "gradient_accumulation_steps":4, "effective_batch_size":16, "learning_rate":0.0003, "weight_decay":0.01, "warmup_ratio":0.1, "max_grad_norm":1.0, "rank":16, "lora_alpha":32, "lora_dropout":0.05, "target_modules":["q_proj","k_proj","v_proj","o_proj","gate_proj","up_proj","down_proj"], "max_length":384, "precision":"CPU bfloat16 autocast; float32 base weights and trainable adapters", "loss":"completion-only token-weighted next-token negative log likelihood, including EOS"}
|
| 54 |
+
torch.set_num_threads(cfg["threads"])
|
| 55 |
+
torch.set_num_interop_threads(1)
|
| 56 |
+
random.seed(cfg["seed"]); torch.manual_seed(cfg["seed"])
|
| 57 |
+
start = time.perf_counter()
|
| 58 |
+
sources = json.loads((ROOT/"source-revisions.json").read_text())
|
| 59 |
+
base = sources["model"]["id"]
|
| 60 |
+
tokenizer = AutoTokenizer.from_pretrained(ROOT/"base")
|
| 61 |
+
tokenizer.padding_side = "right"
|
| 62 |
+
model = AutoModelForCausalLM.from_pretrained(ROOT/"base", torch_dtype=torch.float32, attn_implementation="sdpa")
|
| 63 |
+
model.name_or_path = base; model.config._name_or_path = base
|
| 64 |
+
model.config.use_cache = False
|
| 65 |
+
model = get_peft_model(model, LoraConfig(task_type="CAUSAL_LM", r=cfg["rank"], lora_alpha=cfg["lora_alpha"], lora_dropout=cfg["lora_dropout"], target_modules=cfg["target_modules"], base_model_name_or_path=base, revision=sources["model"]["revision"]))
|
| 66 |
+
out = ROOT/("smoke" if args.smoke else "publish")
|
| 67 |
+
out.mkdir(exist_ok=True)
|
| 68 |
+
data = {name:[json.loads(line) for line in (ROOT/"publish"/"data"/(name+".jsonl")).read_text().splitlines()] for name in ["train","validation","test"]}
|
| 69 |
+
encoded = {name:[encode(r,tokenizer) for r in rows] for name,rows in data.items()}
|
| 70 |
+
for split in encoded.values():
|
| 71 |
+
for row in split:
|
| 72 |
+
assert len(row["input_ids"]) <= cfg["max_length"]
|
| 73 |
+
assert any(y != -100 for y in row["labels"])
|
| 74 |
+
loaders = {name:DataLoader(rows, batch_size=cfg["micro_batch_size"], shuffle=name=="train", collate_fn=lambda batch:collate(batch,tokenizer.pad_token_id), generator=torch.Generator().manual_seed(42)) for name,rows in encoded.items()}
|
| 75 |
+
trainable, total = model.get_nb_trainable_parameters()
|
| 76 |
+
info = {"started_at_brasilia":now(), "hardware":{"cpu":next(line.split(":",1)[1].strip() for line in open("/proc/cpuinfo") if line.startswith("model name")), "logical_cpus":os.cpu_count(), "ram_total_gib":round(os.sysconf("SC_PAGE_SIZE")*os.sysconf("SC_PHYS_PAGES")/1024**3,3), "gpu_available":torch.cuda.is_available()}, "versions":{"python":platform.python_version(), "torch":torch.__version__,"transformers":transformers.__version__,"peft":peft.__version__,"datasets":datasets.__version__,"accelerate":accelerate.__version__}, "sources":sources, "config":cfg, "trainable_parameters":trainable,"total_parameters_with_adapter":total,"base_parameters":total-trainable,"split_examples":{name:len(rows) for name,rows in data.items()}}
|
| 77 |
+
print(json.dumps(info,indent=2),flush=True)
|
| 78 |
+
def autocast():
|
| 79 |
+
return torch.autocast("cpu",dtype=torch.bfloat16)
|
| 80 |
+
@torch.inference_mode()
|
| 81 |
+
def evaluate(split):
|
| 82 |
+
model.eval(); summed_loss=0.; tokens=0; t=time.perf_counter()
|
| 83 |
+
for batch in loaders[split]:
|
| 84 |
+
count=(batch["labels"][:,1:] != -100).sum().item()
|
| 85 |
+
with autocast(): loss=model(**batch).loss
|
| 86 |
+
summed_loss+=loss.item()*count;tokens+=count
|
| 87 |
+
return {"loss":summed_loss/tokens,"perplexity":math.exp(summed_loss/tokens),"response_tokens":tokens,"examples":len(data[split]),"seconds":time.perf_counter()-t}
|
| 88 |
+
@torch.inference_mode()
|
| 89 |
+
def generate_examples():
|
| 90 |
+
model.eval(); result=[]
|
| 91 |
+
for row in data["test"][:6]:
|
| 92 |
+
batch=tokenizer(prompt(row["instruction"]),return_tensors="pt")
|
| 93 |
+
with autocast(): generated=model.generate(**batch,max_new_tokens=80,do_sample=False,use_cache=True,pad_token_id=tokenizer.pad_token_id,eos_token_id=tokenizer.eos_token_id)
|
| 94 |
+
result.append({"prompt_id":row["prompt_id"],"instruction":row["instruction"],"reference":row["response"],"generated":tokenizer.decode(generated[0,batch["input_ids"].shape[1]:],skip_special_tokens=True)})
|
| 95 |
+
return result
|
| 96 |
+
if args.smoke:
|
| 97 |
+
optimizer=torch.optim.AdamW([p for p in model.parameters() if p.requires_grad],lr=cfg["learning_rate"])
|
| 98 |
+
model.train(); times=[]
|
| 99 |
+
for i,batch in enumerate(loaders["train"]):
|
| 100 |
+
t=time.perf_counter();optimizer.zero_grad()
|
| 101 |
+
with autocast():loss=model(**batch).loss
|
| 102 |
+
loss.backward();optimizer.step();times.append(time.perf_counter()-t)
|
| 103 |
+
print("SMOKE",i,"loss",loss.item(),"seconds",times[-1],flush=True)
|
| 104 |
+
if i==2:break
|
| 105 |
+
print("SMOKE PASSED",times,flush=True);return
|
| 106 |
+
# Evaluate the actual frozen base path, not zero LoRA additions under autocast.
|
| 107 |
+
with model.disable_adapter():
|
| 108 |
+
info["before"]={s:evaluate(s) for s in ["validation","test"]}
|
| 109 |
+
before_gen=generate_examples()
|
| 110 |
+
(out/"baseline.json").write_text(json.dumps({"metrics":info["before"],"generations":before_gen},indent=2,ensure_ascii=False))
|
| 111 |
+
print("BASELINE",json.dumps(info["before"]),flush=True)
|
| 112 |
+
optimizer=torch.optim.AdamW([p for p in model.parameters() if p.requires_grad],lr=cfg["learning_rate"],weight_decay=cfg["weight_decay"])
|
| 113 |
+
steps_per_epoch=math.ceil(len(loaders["train"])/cfg["gradient_accumulation_steps"])
|
| 114 |
+
total_steps=steps_per_epoch*cfg["epochs"]
|
| 115 |
+
scheduler=get_cosine_schedule_with_warmup(optimizer,int(total_steps*cfg["warmup_ratio"]),total_steps)
|
| 116 |
+
best_loss=math.inf; history=[]; optimizer_step=0;train_time=0.;val_time=0.;supervised_tokens=0
|
| 117 |
+
training_start=now()
|
| 118 |
+
with (out/"training-log.jsonl").open("w") as log:
|
| 119 |
+
for epoch in range(cfg["epochs"]):
|
| 120 |
+
model.train();optimizer.zero_grad();epoch_nll=0.;epoch_tokens=0;epoch_start=time.perf_counter()
|
| 121 |
+
batches=list(loaders["train"])
|
| 122 |
+
# Token-weighted gradient accumulation, including the last partial group.
|
| 123 |
+
for group_start in range(0,len(batches),cfg["gradient_accumulation_steps"]):
|
| 124 |
+
group=batches[group_start:group_start+cfg["gradient_accumulation_steps"]]
|
| 125 |
+
group_tokens=sum((b["labels"][:,1:]!=-100).sum().item() for b in group)
|
| 126 |
+
for batch in group:
|
| 127 |
+
count=(batch["labels"][:,1:]!=-100).sum().item()
|
| 128 |
+
with autocast(): loss=model(**batch).loss
|
| 129 |
+
(loss*count/group_tokens).backward()
|
| 130 |
+
epoch_nll+=loss.item()*count;epoch_tokens+=count
|
| 131 |
+
norm=torch.nn.utils.clip_grad_norm_(model.parameters(),cfg["max_grad_norm"])
|
| 132 |
+
optimizer.step();scheduler.step();optimizer.zero_grad();optimizer_step+=1
|
| 133 |
+
if optimizer_step%5==0:
|
| 134 |
+
row={"event":"step","epoch":epoch+1,"optimizer_step":optimizer_step,"running_train_loss":epoch_nll/epoch_tokens,"lr":scheduler.get_last_lr()[0],"grad_norm":float(norm),"epoch_elapsed_seconds":time.perf_counter()-epoch_start}
|
| 135 |
+
log.write(json.dumps(row)+"\n");log.flush();print(json.dumps(row),flush=True)
|
| 136 |
+
epoch_seconds=time.perf_counter()-epoch_start;train_time+=epoch_seconds;supervised_tokens+=epoch_tokens
|
| 137 |
+
metrics=evaluate("validation");val_time+=metrics["seconds"]
|
| 138 |
+
row={"event":"epoch","epoch":epoch+1,"optimizer_steps":optimizer_step,"train_loss":epoch_nll/epoch_tokens,"train_seconds":epoch_seconds,"validation":metrics}
|
| 139 |
+
history.append(row);log.write(json.dumps(row)+"\n");log.flush();print(json.dumps(row),flush=True)
|
| 140 |
+
if metrics["loss"]<best_loss:
|
| 141 |
+
best_loss=metrics["loss"];info["best_epoch"]=epoch+1
|
| 142 |
+
model.save_pretrained(out,safe_serialization=True)
|
| 143 |
+
training_finished=now()
|
| 144 |
+
# Load the chosen validation checkpoint; the test never chooses hyperparameters or checkpoints.
|
| 145 |
+
from safetensors.torch import load_file
|
| 146 |
+
from peft import set_peft_model_state_dict
|
| 147 |
+
set_peft_model_state_dict(model,load_file(str(out/"adapter_model.safetensors")))
|
| 148 |
+
info["after"]={s:evaluate(s) for s in ["validation","test"]}
|
| 149 |
+
after_gen=generate_examples()
|
| 150 |
+
tokenizer.save_pretrained(out)
|
| 151 |
+
info.update({"training_started_at_brasilia":training_start,"training_finished_at_brasilia":training_finished,"training_seconds_excluding_evaluation":train_time,"validation_seconds_during_training":val_time,"optimizer_steps":optimizer_step,"supervised_tokens_across_epochs":supervised_tokens,"history":history,"wall_seconds_including_baselines_and_generations":time.perf_counter()-start,"max_process_rss_gib":resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024**2,"finished_at_brasilia":now()})
|
| 152 |
+
comparisons=[]
|
| 153 |
+
for b,a in zip(before_gen,after_gen):
|
| 154 |
+
assert b["prompt_id"]==a["prompt_id"]
|
| 155 |
+
comparisons.append({"prompt_id":b["prompt_id"],"instruction":b["instruction"],"reference":b["reference"],"before":b["generated"],"after":a["generated"]})
|
| 156 |
+
(out/"metrics.json").write_text(json.dumps(info,indent=2,ensure_ascii=False))
|
| 157 |
+
(out/"generations.json").write_text(json.dumps(comparisons,indent=2,ensure_ascii=False))
|
| 158 |
+
print("FINISHED",json.dumps({"before":info["before"],"after":info["after"],"train_seconds":train_time,"wall_seconds":info["wall_seconds_including_baselines_and_generations"]}),flush=True)
|
| 159 |
+
|
| 160 |
+
if __name__=="__main__":main()
|
scripts/verify_adapter.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Reload the on-disk adapter and independently reproduce held-out NLL."""
|
| 2 |
+
import json
|
| 3 |
+
import math
|
| 4 |
+
import contextlib
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
|
| 7 |
+
import torch
|
| 8 |
+
from peft import PeftModel
|
| 9 |
+
from safetensors.torch import load_file
|
| 10 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer
|
| 11 |
+
from train import collate, encode, prompt
|
| 12 |
+
|
| 13 |
+
ROOT=Path(__file__).resolve().parent.parent
|
| 14 |
+
OUT=ROOT/"publish"
|
| 15 |
+
metrics=json.loads((OUT/"metrics.json").read_text())
|
| 16 |
+
torch.set_num_threads(6);torch.set_num_interop_threads(1)
|
| 17 |
+
tok=AutoTokenizer.from_pretrained(ROOT/"base")
|
| 18 |
+
base=AutoModelForCausalLM.from_pretrained(ROOT/"base",torch_dtype=torch.float32,attn_implementation="sdpa")
|
| 19 |
+
model=PeftModel.from_pretrained(base,OUT);model.eval()
|
| 20 |
+
weights=load_file(str(OUT/"adapter_model.safetensors"))
|
| 21 |
+
assert all(torch.isfinite(t).all() for t in weights.values())
|
| 22 |
+
assert any(t.abs().sum()>0 for k,t in weights.items() if "lora_B" in k)
|
| 23 |
+
result={"finite_weights":True,"nonzero_trained_B":True,"metrics":{}}
|
| 24 |
+
for phase in ["before","after"]:
|
| 25 |
+
for split in ["validation","test"]:
|
| 26 |
+
rows=[json.loads(l) for l in (OUT/"data"/(split+".jsonl")).read_text().splitlines()]
|
| 27 |
+
summed=0.;tokens=0
|
| 28 |
+
with torch.inference_mode(), (model.disable_adapter() if phase=="before" else contextlib.nullcontext()):
|
| 29 |
+
for start in range(0,len(rows),4):
|
| 30 |
+
batch=collate([encode(r,tok) for r in rows[start:start+4]],tok.pad_token_id)
|
| 31 |
+
n=(batch["labels"][:,1:]!=-100).sum().item()
|
| 32 |
+
loss=model(**batch).loss
|
| 33 |
+
summed+=loss.item()*n;tokens+=n
|
| 34 |
+
value=summed/tokens;expected=metrics[phase][split]["loss"]
|
| 35 |
+
assert abs(value-expected)<1e-6,(phase,split,value,expected)
|
| 36 |
+
result["metrics"][phase+"_"+split]={"loss":value,"perplexity":math.exp(value),"response_tokens":tokens,"matches_saved":True}
|
| 37 |
+
examples=json.loads((OUT/"generations.json").read_text())
|
| 38 |
+
row=examples[0];inputs=tok(prompt(row["instruction"]),return_tensors="pt")
|
| 39 |
+
with torch.inference_mode():
|
| 40 |
+
generated=model.generate(**inputs,max_new_tokens=80,do_sample=False,use_cache=True,pad_token_id=tok.pad_token_id,eos_token_id=tok.eos_token_id)
|
| 41 |
+
text=tok.decode(generated[0,inputs["input_ids"].shape[1]:],skip_special_tokens=True)
|
| 42 |
+
assert text==row["after"],(text,row["after"])
|
| 43 |
+
result["first_generation_matches_saved"]=True
|
| 44 |
+
(OUT/"verification.json").write_text(json.dumps(result,indent=2))
|
| 45 |
+
print(json.dumps(result,indent=2))
|
source-revisions.json
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"model": {
|
| 3 |
+
"id": "TucanoBR/Tucano-160m",
|
| 4 |
+
"revision": "6331cbef9933c05d8d0c8ae5ee23ed2570f06571"
|
| 5 |
+
},
|
| 6 |
+
"dataset": {
|
| 7 |
+
"id": "OpenAssistant/oasst2",
|
| 8 |
+
"revision": "179dd21fc55192153d94adb0e0ce8f69e222bf75"
|
| 9 |
+
}
|
| 10 |
+
}
|
training-log.jsonl
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{"event": "step", "epoch": 1, "optimizer_step": 5, "running_train_loss": 2.238007207674975, "lr": 0.00029728930458940595, "grad_norm": 0.8063221573829651, "epoch_elapsed_seconds": 22.473043352998502}
|
| 2 |
+
{"event": "epoch", "epoch": 1, "optimizer_steps": 6, "train_loss": 2.2584660765231943, "train_seconds": 25.907004280001274, "validation": {"loss": 2.2768132312225764, "perplexity": 9.745573980476506, "response_tokens": 1522, "examples": 12, "seconds": 0.5419957140038605}}
|
| 3 |
+
{"event": "step", "epoch": 2, "optimizer_step": 10, "running_train_loss": 2.1012608638544528, "lr": 0.00026790796421141813, "grad_norm": 0.5991487503051758, "epoch_elapsed_seconds": 18.22901766400173}
|
| 4 |
+
{"event": "epoch", "epoch": 2, "optimizer_steps": 12, "train_loss": 2.098645087989428, "train_seconds": 25.95503581200319, "validation": {"loss": 2.242185463416592, "perplexity": 9.413882518133018, "response_tokens": 1522, "examples": 12, "seconds": 0.5481375860035769}}
|
| 5 |
+
{"event": "step", "epoch": 3, "optimizer_step": 15, "running_train_loss": 1.9789021475735185, "lr": 0.00021231225195028297, "grad_norm": 0.5209558606147766, "epoch_elapsed_seconds": 12.166495024997857}
|
| 6 |
+
{"event": "epoch", "epoch": 3, "optimizer_steps": 18, "train_loss": 1.981365356522283, "train_seconds": 24.54493858999922, "validation": {"loss": 2.243609419633462, "perplexity": 9.427297023236907, "response_tokens": 1522, "examples": 12, "seconds": 0.6372171650000382}}
|
| 7 |
+
{"event": "step", "epoch": 4, "optimizer_step": 20, "running_train_loss": 1.9427905353859114, "lr": 0.00014286271262643866, "grad_norm": 0.5414717197418213, "epoch_elapsed_seconds": 8.372175031996449}
|
| 8 |
+
{"event": "epoch", "epoch": 4, "optimizer_steps": 24, "train_loss": 1.8920829225523852, "train_seconds": 25.12302869799896, "validation": {"loss": 2.24681126335134, "perplexity": 9.457530130000158, "response_tokens": 1522, "examples": 12, "seconds": 0.5965341569972225}}
|
| 9 |
+
{"event": "step", "epoch": 5, "optimizer_step": 25, "running_train_loss": 1.8080690098776657, "lr": 7.500000000000002e-05, "grad_norm": 0.4843766689300537, "epoch_elapsed_seconds": 5.079509700997733}
|
| 10 |
+
{"event": "step", "epoch": 5, "optimizer_step": 30, "running_train_loss": 1.8361153760542404, "lr": 2.38119700753228e-05, "grad_norm": 0.5224012732505798, "epoch_elapsed_seconds": 26.849627632000193}
|
| 11 |
+
{"event": "epoch", "epoch": 5, "optimizer_steps": 30, "train_loss": 1.8361153760542404, "train_seconds": 26.84980382199865, "validation": {"loss": 2.248372650961055, "perplexity": 9.472308534770303, "response_tokens": 1522, "examples": 12, "seconds": 0.5754360380014987}}
|
| 12 |
+
{"event": "step", "epoch": 6, "optimizer_step": 35, "running_train_loss": 1.8029368741417207, "lr": 6.792116140373116e-07, "grad_norm": 0.6384185552597046, "epoch_elapsed_seconds": 22.325316743001167}
|
| 13 |
+
{"event": "epoch", "epoch": 6, "optimizer_steps": 36, "train_loss": 1.8106174533771444, "train_seconds": 26.368592519997037, "validation": {"loss": 2.2492608048129488, "perplexity": 9.48072513914832, "response_tokens": 1522, "examples": 12, "seconds": 0.6144218890040065}}
|
training-metrics.json
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"started_at_brasilia": "2026-11-10T16:11:11.132132-03:00",
|
| 3 |
+
"hardware": {
|
| 4 |
+
"cpu": "Intel(R) Xeon(R) Processor",
|
| 5 |
+
"logical_cpus": 8,
|
| 6 |
+
"ram_total_gib": 15.627,
|
| 7 |
+
"gpu_available": false
|
| 8 |
+
},
|
| 9 |
+
"versions": {
|
| 10 |
+
"python": "3.13.5",
|
| 11 |
+
"torch": "2.15.0+cpu",
|
| 12 |
+
"transformers": "4.57.6",
|
| 13 |
+
"peft": "0.21.2",
|
| 14 |
+
"datasets": "5.0.1",
|
| 15 |
+
"accelerate": "1.15.0"
|
| 16 |
+
},
|
| 17 |
+
"sources": {
|
| 18 |
+
"model": {
|
| 19 |
+
"id": "TucanoBR/Tucano-160m",
|
| 20 |
+
"revision": "6331cbef9933c05d8d0c8ae5ee23ed2570f06571"
|
| 21 |
+
},
|
| 22 |
+
"dataset": {
|
| 23 |
+
"id": "OpenAssistant/oasst2",
|
| 24 |
+
"revision": "179dd21fc55192153d94adb0e0ce8f69e222bf75"
|
| 25 |
+
}
|
| 26 |
+
},
|
| 27 |
+
"config": {
|
| 28 |
+
"seed": 42,
|
| 29 |
+
"threads": 6,
|
| 30 |
+
"epochs": 6,
|
| 31 |
+
"micro_batch_size": 4,
|
| 32 |
+
"gradient_accumulation_steps": 4,
|
| 33 |
+
"effective_batch_size": 16,
|
| 34 |
+
"learning_rate": 0.0003,
|
| 35 |
+
"weight_decay": 0.01,
|
| 36 |
+
"warmup_ratio": 0.1,
|
| 37 |
+
"max_grad_norm": 1.0,
|
| 38 |
+
"rank": 16,
|
| 39 |
+
"lora_alpha": 32,
|
| 40 |
+
"lora_dropout": 0.05,
|
| 41 |
+
"target_modules": [
|
| 42 |
+
"q_proj",
|
| 43 |
+
"k_proj",
|
| 44 |
+
"v_proj",
|
| 45 |
+
"o_proj",
|
| 46 |
+
"gate_proj",
|
| 47 |
+
"up_proj",
|
| 48 |
+
"down_proj"
|
| 49 |
+
],
|
| 50 |
+
"max_length": 384,
|
| 51 |
+
"precision": "CPU bfloat16 autocast; float32 base weights and trainable adapters",
|
| 52 |
+
"loss": "completion-only token-weighted next-token negative log likelihood, including EOS"
|
| 53 |
+
},
|
| 54 |
+
"trainable_parameters": 3391488,
|
| 55 |
+
"total_parameters_with_adapter": 165808896,
|
| 56 |
+
"base_parameters": 162417408,
|
| 57 |
+
"split_examples": {
|
| 58 |
+
"train": 94,
|
| 59 |
+
"validation": 12,
|
| 60 |
+
"test": 12
|
| 61 |
+
},
|
| 62 |
+
"before": {
|
| 63 |
+
"validation": {
|
| 64 |
+
"loss": 2.356751855036902,
|
| 65 |
+
"perplexity": 10.55660631600646,
|
| 66 |
+
"response_tokens": 1522,
|
| 67 |
+
"examples": 12,
|
| 68 |
+
"seconds": 0.7319192210052279
|
| 69 |
+
},
|
| 70 |
+
"test": {
|
| 71 |
+
"loss": 2.430188522578911,
|
| 72 |
+
"perplexity": 11.361023687609077,
|
| 73 |
+
"response_tokens": 1907,
|
| 74 |
+
"examples": 12,
|
| 75 |
+
"seconds": 0.6798040540015791
|
| 76 |
+
}
|
| 77 |
+
},
|
| 78 |
+
"best_epoch": 2,
|
| 79 |
+
"after": {
|
| 80 |
+
"validation": {
|
| 81 |
+
"loss": 2.2419521171066044,
|
| 82 |
+
"perplexity": 9.411686079660129,
|
| 83 |
+
"response_tokens": 1522,
|
| 84 |
+
"examples": 12,
|
| 85 |
+
"seconds": 0.5894143010009429
|
| 86 |
+
},
|
| 87 |
+
"test": {
|
| 88 |
+
"loss": 2.3471716908678437,
|
| 89 |
+
"perplexity": 10.455955191388183,
|
| 90 |
+
"response_tokens": 1907,
|
| 91 |
+
"examples": 12,
|
| 92 |
+
"seconds": 0.6937924470039434
|
| 93 |
+
}
|
| 94 |
+
},
|
| 95 |
+
"training_started_at_brasilia": "2026-11-10T16:11:25.463075-03:00",
|
| 96 |
+
"training_finished_at_brasilia": "2026-11-10T16:14:04.097314-03:00",
|
| 97 |
+
"training_seconds_excluding_evaluation": 154.74840372199833,
|
| 98 |
+
"validation_seconds_during_training": 3.513742549010203,
|
| 99 |
+
"optimizer_steps": 36,
|
| 100 |
+
"supervised_tokens_across_epochs": 75084,
|
| 101 |
+
"history": [
|
| 102 |
+
{
|
| 103 |
+
"event": "epoch",
|
| 104 |
+
"epoch": 1,
|
| 105 |
+
"optimizer_steps": 6,
|
| 106 |
+
"train_loss": 2.2584660765231943,
|
| 107 |
+
"train_seconds": 25.907004280001274,
|
| 108 |
+
"validation": {
|
| 109 |
+
"loss": 2.2768132312225764,
|
| 110 |
+
"perplexity": 9.745573980476506,
|
| 111 |
+
"response_tokens": 1522,
|
| 112 |
+
"examples": 12,
|
| 113 |
+
"seconds": 0.5419957140038605
|
| 114 |
+
}
|
| 115 |
+
},
|
| 116 |
+
{
|
| 117 |
+
"event": "epoch",
|
| 118 |
+
"epoch": 2,
|
| 119 |
+
"optimizer_steps": 12,
|
| 120 |
+
"train_loss": 2.098645087989428,
|
| 121 |
+
"train_seconds": 25.95503581200319,
|
| 122 |
+
"validation": {
|
| 123 |
+
"loss": 2.242185463416592,
|
| 124 |
+
"perplexity": 9.413882518133018,
|
| 125 |
+
"response_tokens": 1522,
|
| 126 |
+
"examples": 12,
|
| 127 |
+
"seconds": 0.5481375860035769
|
| 128 |
+
}
|
| 129 |
+
},
|
| 130 |
+
{
|
| 131 |
+
"event": "epoch",
|
| 132 |
+
"epoch": 3,
|
| 133 |
+
"optimizer_steps": 18,
|
| 134 |
+
"train_loss": 1.981365356522283,
|
| 135 |
+
"train_seconds": 24.54493858999922,
|
| 136 |
+
"validation": {
|
| 137 |
+
"loss": 2.243609419633462,
|
| 138 |
+
"perplexity": 9.427297023236907,
|
| 139 |
+
"response_tokens": 1522,
|
| 140 |
+
"examples": 12,
|
| 141 |
+
"seconds": 0.6372171650000382
|
| 142 |
+
}
|
| 143 |
+
},
|
| 144 |
+
{
|
| 145 |
+
"event": "epoch",
|
| 146 |
+
"epoch": 4,
|
| 147 |
+
"optimizer_steps": 24,
|
| 148 |
+
"train_loss": 1.8920829225523852,
|
| 149 |
+
"train_seconds": 25.12302869799896,
|
| 150 |
+
"validation": {
|
| 151 |
+
"loss": 2.24681126335134,
|
| 152 |
+
"perplexity": 9.457530130000158,
|
| 153 |
+
"response_tokens": 1522,
|
| 154 |
+
"examples": 12,
|
| 155 |
+
"seconds": 0.5965341569972225
|
| 156 |
+
}
|
| 157 |
+
},
|
| 158 |
+
{
|
| 159 |
+
"event": "epoch",
|
| 160 |
+
"epoch": 5,
|
| 161 |
+
"optimizer_steps": 30,
|
| 162 |
+
"train_loss": 1.8361153760542404,
|
| 163 |
+
"train_seconds": 26.84980382199865,
|
| 164 |
+
"validation": {
|
| 165 |
+
"loss": 2.248372650961055,
|
| 166 |
+
"perplexity": 9.472308534770303,
|
| 167 |
+
"response_tokens": 1522,
|
| 168 |
+
"examples": 12,
|
| 169 |
+
"seconds": 0.5754360380014987
|
| 170 |
+
}
|
| 171 |
+
},
|
| 172 |
+
{
|
| 173 |
+
"event": "epoch",
|
| 174 |
+
"epoch": 6,
|
| 175 |
+
"optimizer_steps": 36,
|
| 176 |
+
"train_loss": 1.8106174533771444,
|
| 177 |
+
"train_seconds": 26.368592519997037,
|
| 178 |
+
"validation": {
|
| 179 |
+
"loss": 2.2492608048129488,
|
| 180 |
+
"perplexity": 9.48072513914832,
|
| 181 |
+
"response_tokens": 1522,
|
| 182 |
+
"examples": 12,
|
| 183 |
+
"seconds": 0.6144218890040065
|
| 184 |
+
}
|
| 185 |
+
}
|
| 186 |
+
],
|
| 187 |
+
"wall_seconds_including_baselines_and_generations": 187.06369254900346,
|
| 188 |
+
"max_process_rss_gib": 5.4983062744140625,
|
| 189 |
+
"finished_at_brasilia": "2026-11-10T16:14:17.906711-03:00"
|
| 190 |
+
}
|
verification.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"finite_weights": true,
|
| 3 |
+
"nonzero_trained_B": true,
|
| 4 |
+
"metrics": {
|
| 5 |
+
"before_validation": {
|
| 6 |
+
"loss": 2.356857261739172,
|
| 7 |
+
"perplexity": 10.557719111712423,
|
| 8 |
+
"response_tokens": 1522,
|
| 9 |
+
"matches_saved": true
|
| 10 |
+
},
|
| 11 |
+
"before_test": {
|
| 12 |
+
"loss": 2.4296030150575043,
|
| 13 |
+
"perplexity": 11.354373669796804,
|
| 14 |
+
"response_tokens": 1907,
|
| 15 |
+
"matches_saved": true
|
| 16 |
+
},
|
| 17 |
+
"after_validation": {
|
| 18 |
+
"loss": 2.2421957183918093,
|
| 19 |
+
"perplexity": 9.413979057759946,
|
| 20 |
+
"response_tokens": 1522,
|
| 21 |
+
"matches_saved": true
|
| 22 |
+
},
|
| 23 |
+
"after_test": {
|
| 24 |
+
"loss": 2.3472890483814193,
|
| 25 |
+
"perplexity": 10.457182348298135,
|
| 26 |
+
"response_tokens": 1907,
|
| 27 |
+
"matches_saved": true
|
| 28 |
+
}
|
| 29 |
+
},
|
| 30 |
+
"first_generation_matches_saved": true
|
| 31 |
+
}
|