Spaces:
Running
Running
Upload 35 files
Browse files- .gitattributes +3 -0
- README.md +7 -7
- dist/assets/BWD-causal-True.png +0 -0
- dist/assets/BWD-causal-True_dark.png +0 -0
- dist/assets/CE.png +0 -0
- dist/assets/CE_dark.png +0 -0
- dist/assets/FAT5.gif +3 -0
- dist/assets/FAT5_dark.gif +3 -0
- dist/assets/FWD-causal-True.png +0 -0
- dist/assets/FWD-causal-True_dark.png +0 -0
- dist/assets/LN.png +0 -0
- dist/assets/LN_dark.png +0 -0
- dist/assets/LinFAT5_dark.gif +3 -0
- dist/assets/bwd-bfloat16-b16-dark.png +0 -0
- dist/assets/bwd-bfloat16-b16.png +0 -0
- dist/assets/convergence_masked_accuracy_FAT5.png +0 -0
- dist/assets/fwd-bfloat16-b16-dark.png +0 -0
- dist/assets/fwd-bfloat16-b16.png +0 -0
- dist/assets/loss_eval.png +0 -0
- dist/assets/loss_train.png +0 -0
- dist/assets/mem-bfloat16-b32-dark.png +0 -0
- dist/assets/mem-bfloat16-b32.png +0 -0
- dist/assets/mem-bfloat16-b8-dark.png +0 -0
- dist/assets/mem-bfloat16-b8.png +0 -0
- dist/assets/nvidiasmi.png +0 -0
- dist/bibliography.bib +590 -0
- dist/distill.bundle.js +0 -0
- dist/distill.bundle.js.map +0 -0
- dist/index.html +1395 -0
- dist/main.bundle.js +0 -0
- dist/main.bundle.js.LICENSE.txt +19 -0
- dist/main.bundle.js.map +0 -0
- dist/style.css +349 -0
- package-lock.json +0 -0
- package.json +32 -0
- webpack.config.js +96 -0
.gitattributes
CHANGED
@@ -33,3 +33,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
dist/assets/FAT5_dark.gif filter=lfs diff=lfs merge=lfs -text
|
37 |
+
dist/assets/FAT5.gif filter=lfs diff=lfs merge=lfs -text
|
38 |
+
dist/assets/LinFAT5_dark.gif filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
---
|
2 |
-
title: FAT5
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
-
colorTo:
|
6 |
sdk: static
|
7 |
pinned: false
|
8 |
-
|
9 |
-
|
10 |
-
|
|
|
1 |
---
|
2 |
+
title: 'Le FAT5 : Flash Attention T5'
|
3 |
+
emoji: ⚡
|
4 |
+
colorFrom: blue
|
5 |
+
colorTo: red
|
6 |
sdk: static
|
7 |
pinned: false
|
8 |
+
header: default
|
9 |
+
app_file: dist/index.html
|
10 |
+
---
|
dist/assets/BWD-causal-True.png
ADDED
![]() |
dist/assets/BWD-causal-True_dark.png
ADDED
![]() |
dist/assets/CE.png
ADDED
![]() |
dist/assets/CE_dark.png
ADDED
![]() |
dist/assets/FAT5.gif
ADDED
![]() |
Git LFS Details
|
dist/assets/FAT5_dark.gif
ADDED
![]() |
Git LFS Details
|
dist/assets/FWD-causal-True.png
ADDED
![]() |
dist/assets/FWD-causal-True_dark.png
ADDED
![]() |
dist/assets/LN.png
ADDED
![]() |
dist/assets/LN_dark.png
ADDED
![]() |
dist/assets/LinFAT5_dark.gif
ADDED
![]() |
Git LFS Details
|
dist/assets/bwd-bfloat16-b16-dark.png
ADDED
![]() |
dist/assets/bwd-bfloat16-b16.png
ADDED
![]() |
dist/assets/convergence_masked_accuracy_FAT5.png
ADDED
![]() |
dist/assets/fwd-bfloat16-b16-dark.png
ADDED
![]() |
dist/assets/fwd-bfloat16-b16.png
ADDED
![]() |
dist/assets/loss_eval.png
ADDED
![]() |
dist/assets/loss_train.png
ADDED
![]() |
dist/assets/mem-bfloat16-b32-dark.png
ADDED
![]() |
dist/assets/mem-bfloat16-b32.png
ADDED
![]() |
dist/assets/mem-bfloat16-b8-dark.png
ADDED
![]() |
dist/assets/mem-bfloat16-b8.png
ADDED
![]() |
dist/assets/nvidiasmi.png
ADDED
![]() |
dist/bibliography.bib
ADDED
@@ -0,0 +1,590 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@article{JMLR:v21:20-074,
|
2 |
+
author = {Colin Raffel and Noam Shazeer and Adam Roberts and Katherine Lee and Sharan Narang and Michael Matena and Yanqi Zhou and Wei Li and Peter J. Liu},
|
3 |
+
title = {Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer},
|
4 |
+
journal = {Journal of Machine Learning Research},
|
5 |
+
year = {2020},
|
6 |
+
volume = {21},
|
7 |
+
number = {140},
|
8 |
+
pages = {1--67},
|
9 |
+
url = {http://jmlr.org/papers/v21/20-074.html}
|
10 |
+
}
|
11 |
+
@misc{chia2023instructeval,
|
12 |
+
title={INSTRUCTEVAL: Towards Holistic Evaluation of Instruction-Tuned Large Language Models},
|
13 |
+
author={Yew Ken Chia and Pengfei Hong and Lidong Bing and Soujanya Poria},
|
14 |
+
year={2023},
|
15 |
+
url={https://arxiv.org/abs/2306.04757},
|
16 |
+
archivePrefix={arXiv},
|
17 |
+
primaryClass={cs.CL}
|
18 |
+
}
|
19 |
+
@misc{fu2024tiny,
|
20 |
+
title={Tiny Titans: Can Smaller Large Language Models Punch Above Their Weight in the Real World for Meeting Summarization?},
|
21 |
+
author={Xue-Yong Fu and Md Tahmid Rahman Laskar and Elena Khasanova and Cheng Chen and Shashi Bhushan TN},
|
22 |
+
year={2024},
|
23 |
+
url={https://arxiv.org/abs/2402.00841},
|
24 |
+
archivePrefix={arXiv},
|
25 |
+
primaryClass={cs.CL}
|
26 |
+
}
|
27 |
+
@misc{hsieh2023distilling,
|
28 |
+
title={Distilling Step-by-Step! Outperforming Larger Language Models with Less Training Data and Smaller Model Sizes},
|
29 |
+
author={Cheng-Yu Hsieh and Chun-Liang Li and Chih-Kuan Yeh and Hootan Nakhost and Yasuhisa Fujii and Alexander Ratner and Ranjay Krishna and Chen-Yu Lee and Tomas Pfister},
|
30 |
+
year={2023},
|
31 |
+
url={https://arxiv.org/abs/2305.02301},
|
32 |
+
archivePrefix={arXiv},
|
33 |
+
primaryClass={cs.CL}
|
34 |
+
}
|
35 |
+
@misc{nawrot2023nanot5,
|
36 |
+
title={nanoT5: A PyTorch Framework for Pre-training and Fine-tuning T5-style Models with Limited Resources},
|
37 |
+
author={Piotr Nawrot},
|
38 |
+
year={2023},
|
39 |
+
url={https://arxiv.org/abs/2309.02373},
|
40 |
+
archivePrefix={arXiv},
|
41 |
+
primaryClass={cs.CL}
|
42 |
+
}
|
43 |
+
@misc{tay2023ul2,
|
44 |
+
title={UL2: Unifying Language Learning Paradigms},
|
45 |
+
author={Yi Tay and Mostafa Dehghani and Vinh Q. Tran and Xavier Garcia and Jason Wei and Xuezhi Wang and Hyung Won Chung and Siamak Shakeri and Dara Bahri and Tal Schuster and Huaixiu Steven Zheng and Denny Zhou and Neil Houlsby and Donald Metzler},
|
46 |
+
year={2023},
|
47 |
+
url={https://arxiv.org/abs/2205.05131},
|
48 |
+
archivePrefix={arXiv},
|
49 |
+
primaryClass={cs.CL}
|
50 |
+
}
|
51 |
+
@misc{dao2022flashattention,
|
52 |
+
title={FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness},
|
53 |
+
author={Tri Dao and Daniel Y. Fu and Stefano Ermon and Atri Rudra and Christopher Ré},
|
54 |
+
year={2022},
|
55 |
+
url={https://arxiv.org/abs/2205.14135},
|
56 |
+
archivePrefix={arXiv},
|
57 |
+
primaryClass={cs.LG}
|
58 |
+
}
|
59 |
+
@misc{turbot5,
|
60 |
+
title={TurboT5},
|
61 |
+
author={Knowledgator},
|
62 |
+
year={2024},
|
63 |
+
publisher={GitHub},
|
64 |
+
url={https://github.com/Knowledgator/TurboT5},
|
65 |
+
}
|
66 |
+
@misc{nguyen2023culturax,
|
67 |
+
title={CulturaX: A Cleaned, Enormous, and Multilingual Dataset for Large Language Models in 167 Languages},
|
68 |
+
author={Thuat Nguyen and Chien Van Nguyen and Viet Dac Lai and Hieu Man and Nghia Trung Ngo and Franck Dernoncourt and Ryan A. Rossi and Thien Huu Nguyen},
|
69 |
+
year={2023},
|
70 |
+
url={https://arxiv.org/abs/2309.09400},
|
71 |
+
archivePrefix={arXiv},
|
72 |
+
primaryClass={cs.CL}
|
73 |
+
}
|
74 |
+
@misc{leclerc2023ffcv,
|
75 |
+
title={FFCV: Accelerating Training by Removing Data Bottlenecks},
|
76 |
+
author={Guillaume Leclerc and Andrew Ilyas and Logan Engstrom and Sung Min Park and Hadi Salman and Aleksander Madry},
|
77 |
+
year={2023},
|
78 |
+
url={https://arxiv.org/abs/2306.12517},
|
79 |
+
archivePrefix={arXiv},
|
80 |
+
primaryClass={cs.LG}
|
81 |
+
}
|
82 |
+
@misc{lhoest2021datasets,
|
83 |
+
title={Datasets: A Community Library for Natural Language Processing},
|
84 |
+
author={Quentin Lhoest and Albert Villanova del Moral and Yacine Jernite and Abhishek Thakur and Patrick von Platen and Suraj Patil and Julien Chaumond and Mariama Drame and Julien Plu and Lewis Tunstall and Joe Davison and Mario Šaško and Gunjan Chhablani and Bhavitvya Malik and Simon Brandeis and Teven Le Scao and Victor Sanh and Canwen Xu and Nicolas Patry and Angelina McMillan-Major and Philipp Schmid and Sylvain Gugger and Clément Delangue and Théo Matussière and Lysandre Debut and Stas Bekman and Pierric Cistac and Thibault Goehringer and Victor Mustar and François Lagunas and Alexander M. Rush and Thomas Wolf},
|
85 |
+
year={2021},
|
86 |
+
url={https://arxiv.org/abs/2109.02846},
|
87 |
+
archivePrefix={arXiv},
|
88 |
+
primaryClass={cs.CL}
|
89 |
+
}
|
90 |
+
@misc{paszke2019pytorch,
|
91 |
+
title={PyTorch: An Imperative Style, High-Performance Deep Learning Library},
|
92 |
+
author={Adam Paszke and Sam Gross and Francisco Massa and Adam Lerer and James Bradbury and Gregory Chanan and Trevor Killeen and Zeming Lin and Natalia Gimelshein and Luca Antiga and Alban Desmaison and Andreas Köpf and Edward Yang and Zach DeVito and Martin Raison and Alykhan Tejani and Sasank Chilamkurthy and Benoit Steiner and Lu Fang and Junjie Bai and Soumith Chintala},
|
93 |
+
year={2019},
|
94 |
+
url={https://arxiv.org/abs/1912.01703},
|
95 |
+
archivePrefix={arXiv},
|
96 |
+
primaryClass={cs.LG}
|
97 |
+
}
|
98 |
+
@inproceedings{10.1145/2833157.2833162,
|
99 |
+
author = {Lam, Siu Kwan and Pitrou, Antoine and Seibert, Stanley},
|
100 |
+
title = {Numba: a LLVM-based Python JIT compiler},
|
101 |
+
year = {2015},
|
102 |
+
isbn = {9781450340052},
|
103 |
+
publisher = {Association for Computing Machinery},
|
104 |
+
address = {New York, NY, USA},
|
105 |
+
url = {https://doi.org/10.1145/2833157.2833162},
|
106 |
+
doi = {10.1145/2833157.2833162},
|
107 |
+
abstract = {Dynamic, interpreted languages, like Python, are attractive for domain-experts and scientists experimenting with new ideas. However, the performance of the interpreter is often a barrier when scaling to larger data sets. This paper presents a just-in-time compiler for Python that focuses in scientific and array-oriented computing. Starting with the simple syntax of Python, Numba compiles a subset of the language into efficient machine code that is comparable in performance to a traditional compiled language. In addition, we share our experience in building a JIT compiler using LLVM[1].},
|
108 |
+
booktitle = {Proceedings of the Second Workshop on the LLVM Compiler Infrastructure in HPC},
|
109 |
+
articleno = {7},
|
110 |
+
numpages = {6},
|
111 |
+
keywords = {compiler, Python, LLVM},
|
112 |
+
location = {Austin, Texas},
|
113 |
+
series = {LLVM '15}
|
114 |
+
}
|
115 |
+
@inproceedings{10.1145/3315508.3329973,
|
116 |
+
author = {Tillet, Philippe and Kung, H. T. and Cox, David},
|
117 |
+
title = {Triton: an intermediate language and compiler for tiled neural network computations},
|
118 |
+
year = {2019},
|
119 |
+
isbn = {9781450367196},
|
120 |
+
publisher = {Association for Computing Machinery},
|
121 |
+
address = {New York, NY, USA},
|
122 |
+
url = {https://doi.org/10.1145/3315508.3329973},
|
123 |
+
doi = {10.1145/3315508.3329973},
|
124 |
+
abstract = {The validation and deployment of novel research ideas in the field of Deep Learning is often limited by the availability of efficient compute kernels for certain basic primitives. In particular, operations that cannot leverage existing vendor libraries (e.g., cuBLAS, cuDNN) are at risk of facing poor device utilization unless custom implementations are written by experts – usually at the expense of portability. For this reason, the development of new programming abstractions for specifying custom Deep Learning workloads at a minimal performance cost has become crucial. We present Triton, a language and compiler centered around the concept of tile, i.e., statically shaped multi-dimensional sub-arrays. Our approach revolves around (1) a C-based language and an LLVM-based intermediate representation (IR) for expressing tensor programs in terms of operations on parametric tile variables and (2) a set of novel tile-level optimization passes for compiling these programs into efficient GPU code. We demonstrate how Triton can be used to build portable implementations of matrix multiplication and convolution kernels on par with hand-tuned vendor libraries (cuBLAS / cuDNN), or for efficiently implementing recent research ideas such as shift convolutions.},
|
125 |
+
booktitle = {Proceedings of the 3rd ACM SIGPLAN International Workshop on Machine Learning and Programming Languages},
|
126 |
+
pages = {10–19},
|
127 |
+
numpages = {10},
|
128 |
+
keywords = {GPU, compiler, neural networks},
|
129 |
+
location = {Phoenix, AZ, USA},
|
130 |
+
series = {MAPL 2019}
|
131 |
+
}
|
132 |
+
@misc{flagattention,
|
133 |
+
title={FlagAttention},
|
134 |
+
author={FlagOpen},
|
135 |
+
year={2023},
|
136 |
+
publisher={GitHub},
|
137 |
+
title={https://github.com/FlagOpen/FlagAttention}
|
138 |
+
}
|
139 |
+
@misc{nvidiapex,
|
140 |
+
title={Apex},
|
141 |
+
author={NVIDIA},
|
142 |
+
year={2018},
|
143 |
+
publisher={GitHub},
|
144 |
+
url={https://github.com/NVIDIA/apex},
|
145 |
+
}
|
146 |
+
@misc{jansen2022perplexed,
|
147 |
+
title={Perplexed by Quality: A Perplexity-based Method for Adult and Harmful Content Detection in Multilingual Heterogeneous Web Data},
|
148 |
+
author={Tim Jansen and Yangling Tong and Victoria Zevallos and Pedro Ortiz Suarez},
|
149 |
+
year={2022},
|
150 |
+
url={https://arxiv.org/abs/2212.10440},
|
151 |
+
archivePrefix={arXiv},
|
152 |
+
primaryClass={cs.CL}
|
153 |
+
}
|
154 |
+
@misc{micikevicius2018mixed,
|
155 |
+
title={Mixed Precision Training},
|
156 |
+
author={Paulius Micikevicius and Sharan Narang and Jonah Alben and Gregory Diamos and Erich Elsen and David Garcia and Boris Ginsburg and Michael Houston and Oleksii Kuchaiev and Ganesh Venkatesh and Hao Wu},
|
157 |
+
year={2018},
|
158 |
+
url={https://arxiv.org/abs/1710.03740},
|
159 |
+
archivePrefix={arXiv},
|
160 |
+
primaryClass={cs.AI}
|
161 |
+
}
|
162 |
+
@misc{you2020large,
|
163 |
+
title={Large Batch Optimization for Deep Learning: Training BERT in 76 minutes},
|
164 |
+
author={Yang You and Jing Li and Sashank Reddi and Jonathan Hseu and Sanjiv Kumar and Srinadh Bhojanapalli and Xiaodan Song and James Demmel and Kurt Keutzer and Cho-Jui Hsieh},
|
165 |
+
year={2020},
|
166 |
+
url={https://arxiv.org/abs/1904.00962},
|
167 |
+
archivePrefix={arXiv},
|
168 |
+
primaryClass={cs.LG}
|
169 |
+
}
|
170 |
+
@misc{liu2024sophia,
|
171 |
+
title={Sophia: A Scalable Stochastic Second-order Optimizer for Language Model Pre-training},
|
172 |
+
author={Hong Liu and Zhiyuan Li and David Hall and Percy Liang and Tengyu Ma},
|
173 |
+
year={2024},
|
174 |
+
url={https://arxiv.org/abs/2305.14342},
|
175 |
+
archivePrefix={arXiv},
|
176 |
+
primaryClass={cs.LG}
|
177 |
+
}
|
178 |
+
@misc{rajbhandari2020zero,
|
179 |
+
title={ZeRO: Memory Optimizations Toward Training Trillion Parameter Models},
|
180 |
+
author={Samyam Rajbhandari and Jeff Rasley and Olatunji Ruwase and Yuxiong He},
|
181 |
+
year={2020},
|
182 |
+
url={https://arxiv.org/abs/1910.02054},
|
183 |
+
archivePrefix={arXiv},
|
184 |
+
primaryClass={cs.LG}
|
185 |
+
}
|
186 |
+
@misc{debrébisson2016zloss,
|
187 |
+
title={The Z-loss: a shift and scale invariant classification loss belonging to the Spherical Family},
|
188 |
+
author={Alexandre de Brébisson and Pascal Vincent},
|
189 |
+
year={2016},
|
190 |
+
url={https://arxiv.org/abs/1604.08859},
|
191 |
+
archivePrefix={arXiv},
|
192 |
+
primaryClass={cs.LG}
|
193 |
+
}
|
194 |
+
@misc{zhang2019root,
|
195 |
+
title={Root Mean Square Layer Normalization},
|
196 |
+
author={Biao Zhang and Rico Sennrich},
|
197 |
+
year={2019},
|
198 |
+
url={https://arxiv.org/abs/1910.07467},
|
199 |
+
archivePrefix={arXiv},
|
200 |
+
primaryClass={cs.LG}
|
201 |
+
}
|
202 |
+
@misc{liu2021pay,
|
203 |
+
title={Pay Attention to MLPs},
|
204 |
+
author={Hanxiao Liu and Zihang Dai and David R. So and Quoc V. Le},
|
205 |
+
year={2021},
|
206 |
+
url={https://arxiv.org/abs/2105.08050},
|
207 |
+
archivePrefix={arXiv},
|
208 |
+
primaryClass={cs.LG}
|
209 |
+
}
|
210 |
+
@misc{wolf2020huggingfaces,
|
211 |
+
title={HuggingFace's Transformers: State-of-the-art Natural Language Processing},
|
212 |
+
author={Thomas Wolf and Lysandre Debut and Victor Sanh and Julien Chaumond and Clement Delangue and Anthony Moi and Pierric Cistac and Tim Rault and Rémi Louf and Morgan Funtowicz and Joe Davison and Sam Shleifer and Patrick von Platen and Clara Ma and Yacine Jernite and Julien Plu and Canwen Xu and Teven Le Scao and Sylvain Gugger and Mariama Drame and Quentin Lhoest and Alexander M. Rush},
|
213 |
+
year={2020},
|
214 |
+
url={https://arxiv.org/abs/1910.03771},
|
215 |
+
archivePrefix={arXiv},
|
216 |
+
primaryClass={cs.CL}
|
217 |
+
}
|
218 |
+
@misc{liu2022enct5,
|
219 |
+
title={EncT5: A Framework for Fine-tuning T5 as Non-autoregressive Models},
|
220 |
+
author={Frederick Liu and Terry Huang and Shihang Lyu and Siamak Shakeri and Hongkun Yu and Jing Li},
|
221 |
+
year={2022},
|
222 |
+
url={https://arxiv.org/abs/2110.08426},
|
223 |
+
archivePrefix={arXiv},
|
224 |
+
primaryClass={cs.CL}
|
225 |
+
}
|
226 |
+
@misc{shaw2018selfattention,
|
227 |
+
title={Self-Attention with Relative Position Representations},
|
228 |
+
author={Peter Shaw and Jakob Uszkoreit and Ashish Vaswani},
|
229 |
+
year={2018},
|
230 |
+
url={https://arxiv.org/abs/1803.02155},
|
231 |
+
archivePrefix={arXiv},
|
232 |
+
primaryClass={cs.CL}
|
233 |
+
}
|
234 |
+
@misc{press2022train,
|
235 |
+
title={Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation},
|
236 |
+
author={Ofir Press and Noah A. Smith and Mike Lewis},
|
237 |
+
year={2022},
|
238 |
+
url={https://arxiv.org/abs/2108.12409},
|
239 |
+
archivePrefix={arXiv},
|
240 |
+
primaryClass={cs.CL}
|
241 |
+
}
|
242 |
+
@misc{su2023roformer,
|
243 |
+
title={RoFormer: Enhanced Transformer with Rotary Position Embedding},
|
244 |
+
author={Jianlin Su and Yu Lu and Shengfeng Pan and Ahmed Murtadha and Bo Wen and Yunfeng Liu},
|
245 |
+
year={2023},
|
246 |
+
url={https://arxiv.org/abs/2104.09864},
|
247 |
+
archivePrefix={arXiv},
|
248 |
+
primaryClass={cs.CL}
|
249 |
+
}
|
250 |
+
@misc{li2024functional,
|
251 |
+
title={Functional Interpolation for Relative Positions Improves Long Context Transformers},
|
252 |
+
author={Shanda Li and Chong You and Guru Guruganesh and Joshua Ainslie and Santiago Ontanon and Manzil Zaheer and Sumit Sanghai and Yiming Yang and Sanjiv Kumar and Srinadh Bhojanapalli},
|
253 |
+
year={2024},
|
254 |
+
url={https://arxiv.org/abs/2310.04418},
|
255 |
+
archivePrefix={arXiv},
|
256 |
+
primaryClass={cs.LG}
|
257 |
+
}
|
258 |
+
@misc{lacoste2019quantifying,
|
259 |
+
title={Quantifying the Carbon Emissions of Machine Learning},
|
260 |
+
author={Alexandre Lacoste and Alexandra Luccioni and Victor Schmidt and Thomas Dandres},
|
261 |
+
year={2019},
|
262 |
+
url={https://arxiv.org/abs/1910.09700},
|
263 |
+
archivePrefix={arXiv},
|
264 |
+
primaryClass={cs.CY}
|
265 |
+
}
|
266 |
+
@misc{devlin2019bert,
|
267 |
+
title={BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding},
|
268 |
+
author={Jacob Devlin and Ming-Wei Chang and Kenton Lee and Kristina Toutanova},
|
269 |
+
year={2019},
|
270 |
+
url={https://arxiv.org/abs/1810.04805},
|
271 |
+
archivePrefix={arXiv},
|
272 |
+
primaryClass={cs.CL}
|
273 |
+
}
|
274 |
+
@misc{eddine2021barthez,
|
275 |
+
title={BARThez: a Skilled Pretrained French Sequence-to-Sequence Model},
|
276 |
+
author={Moussa Kamal Eddine and Antoine J. -P. Tixier and Michalis Vazirgiannis},
|
277 |
+
year={2021},
|
278 |
+
url={https://arxiv.org/abs/2010.12321},
|
279 |
+
archivePrefix={arXiv},
|
280 |
+
primaryClass={cs.CL}
|
281 |
+
}
|
282 |
+
}
|
283 |
+
@misc{allocine,
|
284 |
+
title={French sentiment analysis with BERT},
|
285 |
+
author={Théophile Blard},
|
286 |
+
year={2020},
|
287 |
+
url={https://arxiv.org/abs/https://github.com/TheophileBlard/french-sentiment-analysis-with-bert},
|
288 |
+
}
|
289 |
+
@misc{delestre2022distilcamembert,
|
290 |
+
title={DistilCamemBERT: a distillation of the French model CamemBERT},
|
291 |
+
author={Cyrile Delestre and Abibatou Amar},
|
292 |
+
year={2022},
|
293 |
+
url={https://arxiv.org/abs/2205.11111},
|
294 |
+
archivePrefix={arXiv},
|
295 |
+
primaryClass={cs.CL}
|
296 |
+
}
|
297 |
+
@misc {frenchQA2023,
|
298 |
+
author = { ALBAR, Boris and BEDU, Pierre and BOURDOIS, Loïck },
|
299 |
+
organization = { Centre Aquitain des Technologies de l'Information et Electroniques },
|
300 |
+
title = { frenchQA (Revision 6249cd5) },
|
301 |
+
year = 2023,
|
302 |
+
url = { https://huggingface.co/CATIE-AQ/frenchQA },
|
303 |
+
doi = { 10.57967/hf/0862 },
|
304 |
+
publisher = { Hugging Face }
|
305 |
+
}
|
306 |
+
@misc {frenchNER2024,
|
307 |
+
author = { BOURDOIS, Loïck },
|
308 |
+
organization = { Centre Aquitain des Technologies de l'Information et Electroniques },
|
309 |
+
title = { frenchNER_4entities (Revision f1e8fef) },
|
310 |
+
year = 2024,
|
311 |
+
url = { https://huggingface.co/datasets/CATIE-AQ/frenchNER_4entities },
|
312 |
+
doi = { 10.57967/hf/1751 },
|
313 |
+
publisher = { Hugging Face }
|
314 |
+
}
|
315 |
+
@misc{lacoste2019quantifying,
|
316 |
+
title={Quantifying the Carbon Emissions of Machine Learning},
|
317 |
+
author={Alexandre Lacoste and Alexandra Luccioni and Victor Schmidt and Thomas Dandres},
|
318 |
+
year={2019},
|
319 |
+
url={https://arxiv.org/abs/1910.09700},
|
320 |
+
archivePrefix={arXiv},
|
321 |
+
primaryClass={cs.CY}
|
322 |
+
}
|
323 |
+
@inproceedings{Martin_2020,
|
324 |
+
title={CamemBERT: a Tasty French Language Model},
|
325 |
+
url={http://dx.doi.org/10.18653/v1/2020.acl-main.645},
|
326 |
+
DOI={10.18653/v1/2020.acl-main.645},
|
327 |
+
booktitle={Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics},
|
328 |
+
publisher={Association for Computational Linguistics},
|
329 |
+
author={Martin, Louis and Muller, Benjamin and Ortiz Suárez, Pedro Javier and Dupont, Yoann and Romary, Laurent and de la Clergerie, Éric and Seddah, Djamé and Sagot, Benoît},
|
330 |
+
year={2020} }
|
331 |
+
@misc{le2020flaubert,
|
332 |
+
title={FlauBERT: Unsupervised Language Model Pre-training for French},
|
333 |
+
author={Hang Le and Loïc Vial and Jibril Frej and Vincent Segonne and Maximin Coavoux and Benjamin Lecouteux and Alexandre Allauzen and Benoît Crabbé and Laurent Besacier and Didier Schwab},
|
334 |
+
year={2020},
|
335 |
+
url={https://arxiv.org/abs/1912.05372},
|
336 |
+
archivePrefix={arXiv},
|
337 |
+
primaryClass={cs.CL}
|
338 |
+
}
|
339 |
+
@misc{chung2022scaling,
|
340 |
+
title={Scaling Instruction-Finetuned Language Models},
|
341 |
+
author={Hyung Won Chung and Le Hou and Shayne Longpre and Barret Zoph and Yi Tay and William Fedus and Yunxuan Li and Xuezhi Wang and Mostafa Dehghani and Siddhartha Brahma and Albert Webson and Shixiang Shane Gu and Zhuyun Dai and Mirac Suzgun and Xinyun Chen and Aakanksha Chowdhery and Alex Castro-Ros and Marie Pellat and Kevin Robinson and Dasha Valter and Sharan Narang and Gaurav Mishra and Adams Yu and Vincent Zhao and Yanping Huang and Andrew Dai and Hongkun Yu and Slav Petrov and Ed H. Chi and Jeff Dean and Jacob Devlin and Adam Roberts and Denny Zhou and Quoc V. Le and Jason Wei},
|
342 |
+
year={2022},
|
343 |
+
url={https://arxiv.org/abs/2210.11416},
|
344 |
+
archivePrefix={arXiv},
|
345 |
+
primaryClass={cs.LG}
|
346 |
+
}
|
347 |
+
@misc{guo2022longt5,
|
348 |
+
title={LongT5: Efficient Text-To-Text Transformer for Long Sequences},
|
349 |
+
author={Mandy Guo and Joshua Ainslie and David Uthus and Santiago Ontanon and Jianmo Ni and Yun-Hsuan Sung and Yinfei Yang},
|
350 |
+
year={2022},
|
351 |
+
url={https://arxiv.org/abs/2112.07916},
|
352 |
+
archivePrefix={arXiv},
|
353 |
+
primaryClass={cs.CL}
|
354 |
+
}
|
355 |
+
@misc{arora2024simple,
|
356 |
+
title={Simple linear attention language models balance the recall-throughput tradeoff},
|
357 |
+
author={Simran Arora and Sabri Eyuboglu and Michael Zhang and Aman Timalsina and Silas Alberti and Dylan Zinsley and James Zou and Atri Rudra and Christopher Ré},
|
358 |
+
year={2024},
|
359 |
+
url={https://arxiv.org/abs/2402.18668},
|
360 |
+
archivePrefix={arXiv},
|
361 |
+
primaryClass={cs.CL}
|
362 |
+
}
|
363 |
+
@misc{zhang2024hedgehog,
|
364 |
+
title={The Hedgehog & the Porcupine: Expressive Linear Attentions with Softmax Mimicry},
|
365 |
+
author={Michael Zhang and Kush Bhatia and Hermann Kumbong and Christopher Ré},
|
366 |
+
year={2024},
|
367 |
+
url={https://arxiv.org/abs/2402.04347},
|
368 |
+
archivePrefix={arXiv},
|
369 |
+
primaryClass={cs.LG}
|
370 |
+
}
|
371 |
+
@misc{thunderkittens ,
|
372 |
+
title={ThunderKittens},
|
373 |
+
author={HazyResearch},
|
374 |
+
year={2024},
|
375 |
+
publisher={GitHub},
|
376 |
+
url={https://github.com/HazyResearch/ThunderKittens},
|
377 |
+
}
|
378 |
+
@misc{flashdecoding ,
|
379 |
+
title={Flash-Decoding for long-context inference},
|
380 |
+
author={Tri Dao and Daniel Haziza and Francisco Massa and Grigory Sizov},
|
381 |
+
year={2023},
|
382 |
+
url={https://crfm.stanford.edu/2023/10/12/flashdecoding.html},
|
383 |
+
}
|
384 |
+
@InProceedings{huggingface:dataset:stsb_multi_mt,
|
385 |
+
title = {Machine translated multilingual STS benchmark dataset.},
|
386 |
+
author={Philip May},
|
387 |
+
year={2021},
|
388 |
+
url={https://github.com/PhilipMay/stsb-multi-mt}
|
389 |
+
}
|
390 |
+
@misc{ciancone2024mtebfrenchresourcesfrenchsentence,
|
391 |
+
title={MTEB-French: Resources for French Sentence Embedding Evaluation and Analysis},
|
392 |
+
author={Mathieu Ciancone and Imene Kerboua and Marion Schaeffer and Wissam Siblini},
|
393 |
+
year={2024},
|
394 |
+
eprint={2405.20468},
|
395 |
+
archivePrefix={arXiv},
|
396 |
+
primaryClass={cs.CL},
|
397 |
+
url={https://arxiv.org/abs/2405.20468},
|
398 |
+
}
|
399 |
+
@misc{dubey2024llama3herdmodels,
|
400 |
+
title={The Llama 3 Herd of Models},
|
401 |
+
author={Abhimanyu Dubey and Abhinav Jauhri and Abhinav Pandey and Abhishek Kadian and Ahmad Al-Dahle and Aiesha Letman and Akhil Mathur and Alan Schelten and Amy Yang and Angela Fan and Anirudh Goyal and Anthony Hartshorn and Aobo Yang and Archi Mitra and Archie Sravankumar and Artem Korenev and Arthur Hinsvark and Arun Rao and Aston Zhang and Aurelien Rodriguez and Austen Gregerson and Ava Spataru and Baptiste Roziere and Bethany Biron and Binh Tang and Bobbie Chern and Charlotte Caucheteux and Chaya Nayak and Chloe Bi and Chris Marra and Chris McConnell and Christian Keller and Christophe Touret and Chunyang Wu and Corinne Wong and Cristian Canton Ferrer and Cyrus Nikolaidis and Damien Allonsius and Daniel Song and Danielle Pintz and Danny Livshits and David Esiobu and Dhruv Choudhary and Dhruv Mahajan and Diego Garcia-Olano and Diego Perino and Dieuwke Hupkes and Egor Lakomkin and Ehab AlBadawy and Elina Lobanova and Emily Dinan and Eric Michael Smith and Filip Radenovic and Frank Zhang and Gabriel Synnaeve and Gabrielle Lee and Georgia Lewis Anderson and Graeme Nail and Gregoire Mialon and Guan Pang and Guillem Cucurell and Hailey Nguyen and Hannah Korevaar and Hu Xu and Hugo Touvron and Iliyan Zarov and Imanol Arrieta Ibarra and Isabel Kloumann and Ishan Misra and Ivan Evtimov and Jade Copet and Jaewon Lee and Jan Geffert and Jana Vranes and Jason Park and Jay Mahadeokar and Jeet Shah and Jelmer van der Linde and Jennifer Billock and Jenny Hong and Jenya Lee and Jeremy Fu and Jianfeng Chi and Jianyu Huang and Jiawen Liu and Jie Wang and Jiecao Yu and Joanna Bitton and Joe Spisak and Jongsoo Park and Joseph Rocca and Joshua Johnstun and Joshua Saxe and Junteng Jia and Kalyan Vasuden Alwala and Kartikeya Upasani and Kate Plawiak and Ke Li and Kenneth Heafield and Kevin Stone and Khalid El-Arini and Krithika Iyer and Kshitiz Malik and Kuenley Chiu and Kunal Bhalla and Lauren Rantala-Yeary and Laurens van der Maaten and Lawrence Chen and Liang Tan and Liz Jenkins and Louis Martin and Lovish Madaan and Lubo Malo and Lukas Blecher and Lukas Landzaat and Luke de Oliveira and Madeline Muzzi and Mahesh Pasupuleti and Mannat Singh and Manohar Paluri and Marcin Kardas and Mathew Oldham and Mathieu Rita and Maya Pavlova and Melanie Kambadur and Mike Lewis and Min Si and Mitesh Kumar Singh and Mona Hassan and Naman Goyal and Narjes Torabi and Nikolay Bashlykov and Nikolay Bogoychev and Niladri Chatterji and Olivier Duchenne and Onur Çelebi and Patrick Alrassy and Pengchuan Zhang and Pengwei Li and Petar Vasic and Peter Weng and Prajjwal Bhargava and Pratik Dubal and Praveen Krishnan and Punit Singh Koura and Puxin Xu and Qing He and Qingxiao Dong and Ragavan Srinivasan and Raj Ganapathy and Ramon Calderer and Ricardo Silveira Cabral and Robert Stojnic and Roberta Raileanu and Rohit Girdhar and Rohit Patel and Romain Sauvestre and Ronnie Polidoro and Roshan Sumbaly and Ross Taylor and Ruan Silva and Rui Hou and Rui Wang and Saghar Hosseini and Sahana Chennabasappa and Sanjay Singh and Sean Bell and Seohyun Sonia Kim and Sergey Edunov and Shaoliang Nie and Sharan Narang and Sharath Raparthy and Sheng Shen and Shengye Wan and Shruti Bhosale and Shun Zhang and Simon Vandenhende and Soumya Batra and Spencer Whitman and Sten Sootla and Stephane Collot and Suchin Gururangan and Sydney Borodinsky and Tamar Herman and Tara Fowler and Tarek Sheasha and Thomas Georgiou and Thomas Scialom and Tobias Speckbacher and Todor Mihaylov and Tong Xiao and Ujjwal Karn and Vedanuj Goswami and Vibhor Gupta and Vignesh Ramanathan and Viktor Kerkez and Vincent Gonguet and Virginie Do and Vish Vogeti and Vladan Petrovic and Weiwei Chu and Wenhan Xiong and Wenyin Fu and Whitney Meers and Xavier Martinet and Xiaodong Wang and Xiaoqing Ellen Tan and Xinfeng Xie and Xuchao Jia and Xuewei Wang and Yaelle Goldschlag and Yashesh Gaur and Yasmine Babaei and Yi Wen and Yiwen Song and Yuchen Zhang and Yue Li and Yuning Mao and Zacharie Delpierre Coudert and Zheng Yan and Zhengxing Chen and Zoe Papakipos and Aaditya Singh and Aaron Grattafiori and Abha Jain and Adam Kelsey and Adam Shajnfeld and Adithya Gangidi and Adolfo Victoria and Ahuva Goldstand and Ajay Menon and Ajay Sharma and Alex Boesenberg and Alex Vaughan and Alexei Baevski and Allie Feinstein and Amanda Kallet and Amit Sangani and Anam Yunus and Andrei Lupu and Andres Alvarado and Andrew Caples and Andrew Gu and Andrew Ho and Andrew Poulton and Andrew Ryan and Ankit Ramchandani and Annie Franco and Aparajita Saraf and Arkabandhu Chowdhury and Ashley Gabriel and Ashwin Bharambe and Assaf Eisenman and Azadeh Yazdan and Beau James and Ben Maurer and Benjamin Leonhardi and Bernie Huang and Beth Loyd and Beto De Paola and Bhargavi Paranjape and Bing Liu and Bo Wu and Boyu Ni and Braden Hancock and Bram Wasti and Brandon Spence and Brani Stojkovic and Brian Gamido and Britt Montalvo and Carl Parker and Carly Burton and Catalina Mejia and Changhan Wang and Changkyu Kim and Chao Zhou and Chester Hu and Ching-Hsiang Chu and Chris Cai and Chris Tindal and Christoph Feichtenhofer and Damon Civin and Dana Beaty and Daniel Kreymer and Daniel Li and Danny Wyatt and David Adkins and David Xu and Davide Testuggine and Delia David and Devi Parikh and Diana Liskovich and Didem Foss and Dingkang Wang and Duc Le and Dustin Holland and Edward Dowling and Eissa Jamil and Elaine Montgomery and Eleonora Presani and Emily Hahn and Emily Wood and Erik Brinkman and Esteban Arcaute and Evan Dunbar and Evan Smothers and Fei Sun and Felix Kreuk and Feng Tian and Firat Ozgenel and Francesco Caggioni and Francisco Guzmán and Frank Kanayet and Frank Seide and Gabriela Medina Florez and Gabriella Schwarz and Gada Badeer and Georgia Swee and Gil Halpern and Govind Thattai and Grant Herman and Grigory Sizov and Guangyi and Zhang and Guna Lakshminarayanan and Hamid Shojanazeri and Han Zou and Hannah Wang and Hanwen Zha and Haroun Habeeb and Harrison Rudolph and Helen Suk and Henry Aspegren and Hunter Goldman and Ibrahim Damlaj and Igor Molybog and Igor Tufanov and Irina-Elena Veliche and Itai Gat and Jake Weissman and James Geboski and James Kohli and Japhet Asher and Jean-Baptiste Gaya and Jeff Marcus and Jeff Tang and Jennifer Chan and Jenny Zhen and Jeremy Reizenstein and Jeremy Teboul and Jessica Zhong and Jian Jin and Jingyi Yang and Joe Cummings and Jon Carvill and Jon Shepard and Jonathan McPhie and Jonathan Torres and Josh Ginsburg and Junjie Wang and Kai Wu and Kam Hou U and Karan Saxena and Karthik Prasad and Kartikay Khandelwal and Katayoun Zand and Kathy Matosich and Kaushik Veeraraghavan and Kelly Michelena and Keqian Li and Kun Huang and Kunal Chawla and Kushal Lakhotia and Kyle Huang and Lailin Chen and Lakshya Garg and Lavender A and Leandro Silva and Lee Bell and Lei Zhang and Liangpeng Guo and Licheng Yu and Liron Moshkovich and Luca Wehrstedt and Madian Khabsa and Manav Avalani and Manish Bhatt and Maria Tsimpoukelli and Martynas Mankus and Matan Hasson and Matthew Lennie and Matthias Reso and Maxim Groshev and Maxim Naumov and Maya Lathi and Meghan Keneally and Michael L. Seltzer and Michal Valko and Michelle Restrepo and Mihir Patel and Mik Vyatskov and Mikayel Samvelyan and Mike Clark and Mike Macey and Mike Wang and Miquel Jubert Hermoso and Mo Metanat and Mohammad Rastegari and Munish Bansal and Nandhini Santhanam and Natascha Parks and Natasha White and Navyata Bawa and Nayan Singhal and Nick Egebo and Nicolas Usunier and Nikolay Pavlovich Laptev and Ning Dong and Ning Zhang and Norman Cheng and Oleg Chernoguz and Olivia Hart and Omkar Salpekar and Ozlem Kalinli and Parkin Kent and Parth Parekh and Paul Saab and Pavan Balaji and Pedro Rittner and Philip Bontrager and Pierre Roux and Piotr Dollar and Polina Zvyagina and Prashant Ratanchandani and Pritish Yuvraj and Qian Liang and Rachad Alao and Rachel Rodriguez and Rafi Ayub and Raghotham Murthy and Raghu Nayani and Rahul Mitra and Raymond Li and Rebekkah Hogan and Robin Battey and Rocky Wang and Rohan Maheswari and Russ Howes and Ruty Rinott and Sai Jayesh Bondu and Samyak Datta and Sara Chugh and Sara Hunt and Sargun Dhillon and Sasha Sidorov and Satadru Pan and Saurabh Verma and Seiji Yamamoto and Sharadh Ramaswamy and Shaun Lindsay and Shaun Lindsay and Sheng Feng and Shenghao Lin and Shengxin Cindy Zha and Shiva Shankar and Shuqiang Zhang and Shuqiang Zhang and Sinong Wang and Sneha Agarwal and Soji Sajuyigbe and Soumith Chintala and Stephanie Max and Stephen Chen and Steve Kehoe and Steve Satterfield and Sudarshan Govindaprasad and Sumit Gupta and Sungmin Cho and Sunny Virk and Suraj Subramanian and Sy Choudhury and Sydney Goldman and Tal Remez and Tamar Glaser and Tamara Best and Thilo Kohler and Thomas Robinson and Tianhe Li and Tianjun Zhang and Tim Matthews and Timothy Chou and Tzook Shaked and Varun Vontimitta and Victoria Ajayi and Victoria Montanez and Vijai Mohan and Vinay Satish Kumar and Vishal Mangla and Vítor Albiero and Vlad Ionescu and Vlad Poenaru and Vlad Tiberiu Mihailescu and Vladimir Ivanov and Wei Li and Wenchen Wang and Wenwen Jiang and Wes Bouaziz and Will Constable and Xiaocheng Tang and Xiaofang Wang and Xiaojian Wu and Xiaolan Wang and Xide Xia and Xilun Wu and Xinbo Gao and Yanjun Chen and Ye Hu and Ye Jia and Ye Qi and Yenda Li and Yilin Zhang and Ying Zhang and Yossi Adi and Youngjin Nam and Yu and Wang and Yuchen Hao and Yundi Qian and Yuzi He and Zach Rait and Zachary DeVito and Zef Rosnbrick and Zhaoduo Wen and Zhenyu Yang and Zhiwei Zhao},
|
402 |
+
year={2024},
|
403 |
+
eprint={2407.21783},
|
404 |
+
archivePrefix={arXiv},
|
405 |
+
primaryClass={cs.AI},
|
406 |
+
url={https://arxiv.org/abs/2407.21783},
|
407 |
+
}
|
408 |
+
@Misc{accelerate,
|
409 |
+
title = {Accelerate: Training and inference at scale made simple, efficient and adaptable.},
|
410 |
+
author = {Sylvain Gugger and Lysandre Debut and Thomas Wolf and Philipp Schmid and Zachary Mueller and Sourab Mangrulkar and Marc Sun and Benjamin Bossan},
|
411 |
+
howpublished = {\url{https://github.com/huggingface/accelerate}},
|
412 |
+
year = {2022}
|
413 |
+
}
|
414 |
+
@misc{wang2022languagemodelarchitecturepretraining,
|
415 |
+
title={What Language Model Architecture and Pretraining Objective Work Best for Zero-Shot Generalization?},
|
416 |
+
author={Thomas Wang and Adam Roberts and Daniel Hesslow and Teven Le Scao and Hyung Won Chung and Iz Beltagy and Julien Launay and Colin Raffel},
|
417 |
+
year={2022},
|
418 |
+
eprint={2204.05832},
|
419 |
+
archivePrefix={arXiv},
|
420 |
+
primaryClass={cs.CL},
|
421 |
+
url={https://arxiv.org/abs/2204.05832},
|
422 |
+
}
|
423 |
+
@misc{kaddour2023minipilechallengedataefficientlanguage,
|
424 |
+
title={The MiniPile Challenge for Data-Efficient Language Models},
|
425 |
+
author={Jean Kaddour},
|
426 |
+
year={2023},
|
427 |
+
eprint={2304.08442},
|
428 |
+
archivePrefix={arXiv},
|
429 |
+
primaryClass={cs.CL},
|
430 |
+
url={https://arxiv.org/abs/2304.08442},
|
431 |
+
}
|
432 |
+
@article{Kocetkov2022TheStack,
|
433 |
+
title={The Stack: 3 TB of permissively licensed source code},
|
434 |
+
author={Kocetkov, Denis and Li, Raymond and Ben Allal, Loubna and Li, Jia and Mou,Chenghao and Muñoz Ferrandis, Carlos and Jernite, Yacine and Mitchell, Margaret and Hughes, Sean and Wolf, Thomas and Bahdanau, Dzmitry and von Werra, Leandro and de Vries, Harm},
|
435 |
+
journal={Preprint},
|
436 |
+
year={2022}
|
437 |
+
}
|
438 |
+
@misc{sennrich2016neuralmachinetranslationrare,
|
439 |
+
title={Neural Machine Translation of Rare Words with Subword Units},
|
440 |
+
author={Rico Sennrich and Barry Haddow and Alexandra Birch},
|
441 |
+
year={2016},
|
442 |
+
eprint={1508.07909},
|
443 |
+
archivePrefix={arXiv},
|
444 |
+
primaryClass={cs.CL},
|
445 |
+
url={https://arxiv.org/abs/1508.07909},
|
446 |
+
}
|
447 |
+
@ONLINE{wikidump,
|
448 |
+
author = "Wikimedia Foundation",
|
449 |
+
title = "Wikimedia Downloads",
|
450 |
+
url = "https://dumps.wikimedia.org"
|
451 |
+
}
|
452 |
+
@misc {justice_fr,
|
453 |
+
author = { ECKENDOERFFER, Guillaume },
|
454 |
+
title = { justice_fr },
|
455 |
+
year = 2023,
|
456 |
+
url = { https://huggingface.co/datasets/eckendoerffer/justice_fr },
|
457 |
+
publisher = { Hugging Face }
|
458 |
+
}
|
459 |
+
@software{unsloth,
|
460 |
+
author = {Daniel Han, Michael Han and Unsloth team},
|
461 |
+
title = {Unsloth},
|
462 |
+
url = {http://github.com/unslothai/unsloth},
|
463 |
+
year = {2023}
|
464 |
+
}
|
465 |
+
@misc{antoun2024camembert20smarterfrench,
|
466 |
+
title={CamemBERT 2.0: A Smarter French Language Model Aged to Perfection},
|
467 |
+
author={Wissam Antoun and Francis Kulumba and Rian Touchent and Éric de la Clergerie and Benoît Sagot and Djamé Seddah},
|
468 |
+
year={2024},
|
469 |
+
eprint={2411.08868},
|
470 |
+
archivePrefix={arXiv},
|
471 |
+
primaryClass={cs.CL},
|
472 |
+
url={https://arxiv.org/abs/2411.08868},
|
473 |
+
}
|
474 |
+
@article{wijmans2024cut,
|
475 |
+
author = {Erik Wijmans and
|
476 |
+
Brody Huval and
|
477 |
+
Alexander Hertzberg and
|
478 |
+
Vladlen Koltun and
|
479 |
+
Philipp Kr\"ahenb\"uhl},
|
480 |
+
title = {Cut Your Losses in Large-Vocabulary Language Models},
|
481 |
+
journal = {arXiv},
|
482 |
+
year = {2024},
|
483 |
+
url = {https://arxiv.org/abs/2411.09009},
|
484 |
+
}
|
485 |
+
@misc{rafailov2024directpreferenceoptimizationlanguage,
|
486 |
+
title={Direct Preference Optimization: Your Language Model is Secretly a Reward Model},
|
487 |
+
author={Rafael Rafailov and Archit Sharma and Eric Mitchell and Stefano Ermon and Christopher D. Manning and Chelsea Finn},
|
488 |
+
year={2024},
|
489 |
+
eprint={2305.18290},
|
490 |
+
archivePrefix={arXiv},
|
491 |
+
primaryClass={cs.LG},
|
492 |
+
url={https://arxiv.org/abs/2305.18290},
|
493 |
+
}
|
494 |
+
@misc{muennighoff2023crosslingualgeneralizationmultitaskfinetuning,
|
495 |
+
title={Crosslingual Generalization through Multitask Finetuning},
|
496 |
+
author={Niklas Muennighoff and Thomas Wang and Lintang Sutawika and Adam Roberts and Stella Biderman and Teven Le Scao and M Saiful Bari and Sheng Shen and Zheng-Xin Yong and Hailey Schoelkopf and Xiangru Tang and Dragomir Radev and Alham Fikri Aji and Khalid Almubarak and Samuel Albanie and Zaid Alyafeai and Albert Webson and Edward Raff and Colin Raffel},
|
497 |
+
year={2023},
|
498 |
+
eprint={2211.01786},
|
499 |
+
archivePrefix={arXiv},
|
500 |
+
primaryClass={cs.CL},
|
501 |
+
url={https://arxiv.org/abs/2211.01786},
|
502 |
+
}
|
503 |
+
@misc {centre_aquitain_des_technologies_de_l'information_et_electroniques_2023,
|
504 |
+
author = { {BOURDOIS, Loïck} },
|
505 |
+
organization = { {Centre Aquitain des Technologies de l'Information et Electroniques} },
|
506 |
+
title = { Dataset of French Prompts (DFP) (Revision 1d24c09) },
|
507 |
+
year = 2023,
|
508 |
+
url = { https://huggingface.co/datasets/CATIE-AQ/DFP },
|
509 |
+
doi = { 10.57967/hf/1200 },
|
510 |
+
publisher = { Hugging Face } }
|
511 |
+
@misc{wang2022languagemodelarchitecturepretraining,
|
512 |
+
title={What Language Model Architecture and Pretraining Objective Work Best for Zero-Shot Generalization?},
|
513 |
+
author={Thomas Wang and Adam Roberts and Daniel Hesslow and Teven Le Scao and Hyung Won Chung and Iz Beltagy and Julien Launay and Colin Raffel},
|
514 |
+
year={2022},
|
515 |
+
eprint={2204.05832},
|
516 |
+
archivePrefix={arXiv},
|
517 |
+
primaryClass={cs.CL},
|
518 |
+
url={https://arxiv.org/abs/2204.05832},
|
519 |
+
}
|
520 |
+
@misc{zhang2024lolcatslowranklinearizinglarge,
|
521 |
+
title={LoLCATs: On Low-Rank Linearizing of Large Language Models},
|
522 |
+
author={Michael Zhang and Simran Arora and Rahul Chalamala and Alan Wu and Benjamin Spector and Aaryan Singhal and Krithik Ramesh and Christopher Ré},
|
523 |
+
year={2024},
|
524 |
+
eprint={2410.10254},
|
525 |
+
archivePrefix={arXiv},
|
526 |
+
primaryClass={cs.LG},
|
527 |
+
url={https://arxiv.org/abs/2410.10254},
|
528 |
+
}
|
529 |
+
@misc{hu2021loralowrankadaptationlarge,
|
530 |
+
title={LoRA: Low-Rank Adaptation of Large Language Models},
|
531 |
+
author={Edward J. Hu and Yelong Shen and Phillip Wallis and Zeyuan Allen-Zhu and Yuanzhi Li and Shean Wang and Lu Wang and Weizhu Chen},
|
532 |
+
year={2021},
|
533 |
+
eprint={2106.09685},
|
534 |
+
archivePrefix={arXiv},
|
535 |
+
primaryClass={cs.CL},
|
536 |
+
url={https://arxiv.org/abs/2106.09685},
|
537 |
+
}
|
538 |
+
@misc{zhang2024sageattention2efficientattentionthorough,
|
539 |
+
title={SageAttention2: Efficient Attention with Thorough Outlier Smoothing and Per-thread INT4 Quantization},
|
540 |
+
author={Jintao Zhang and Haofeng Huang and Pengle Zhang and Jia Wei and Jun Zhu and Jianfei Chen},
|
541 |
+
year={2024},
|
542 |
+
eprint={2411.10958},
|
543 |
+
archivePrefix={arXiv},
|
544 |
+
primaryClass={cs.LG},
|
545 |
+
url={https://arxiv.org/abs/2411.10958},
|
546 |
+
}
|
547 |
+
@software{penedo2024fineweb-2,
|
548 |
+
author = {Penedo, Guilherme and Kydlíček, Hynek and Sabolčec, Vinko and Messmer, Bettina and Foroutan, Negar and Jaggi, Martin and von Werra, Leandro and Wolf, Thomas},
|
549 |
+
title = {FineWeb2: A sparkling update with 1000s of languages},
|
550 |
+
month = dec,
|
551 |
+
year = 2024,
|
552 |
+
doi = { },
|
553 |
+
url = {https://huggingface.co/datasets/HuggingFaceFW/fineweb-2}
|
554 |
+
}
|
555 |
+
@misc{lewis2019bartdenoisingsequencetosequencepretraining,
|
556 |
+
title={BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension},
|
557 |
+
author={Mike Lewis and Yinhan Liu and Naman Goyal and Marjan Ghazvininejad and Abdelrahman Mohamed and Omer Levy and Ves Stoyanov and Luke Zettlemoyer},
|
558 |
+
year={2019},
|
559 |
+
eprint={1910.13461},
|
560 |
+
archivePrefix={arXiv},
|
561 |
+
primaryClass={cs.CL},
|
562 |
+
url={https://arxiv.org/abs/1910.13461},
|
563 |
+
}
|
564 |
+
@misc{gloeckle2024betterfasterlarge,
|
565 |
+
title={Better & Faster Large Language Models via Multi-token Prediction},
|
566 |
+
author={Fabian Gloeckle and Badr Youbi Idrissi and Baptiste Rozière and David Lopez-Paz and Gabriel Synnaeve},
|
567 |
+
year={2024},
|
568 |
+
eprint={2404.19737},
|
569 |
+
archivePrefix={arXiv},
|
570 |
+
primaryClass={cs.CL},
|
571 |
+
url={https://arxiv.org/abs/2404.19737},
|
572 |
+
}
|
573 |
+
@misc{he2023debertav3improvingdebertausing,
|
574 |
+
title={DeBERTaV3: Improving DeBERTa using ELECTRA-Style Pre-Training with Gradient-Disentangled Embedding Sharing},
|
575 |
+
author={Pengcheng He and Jianfeng Gao and Weizhu Chen},
|
576 |
+
year={2023},
|
577 |
+
eprint={2111.09543},
|
578 |
+
archivePrefix={arXiv},
|
579 |
+
primaryClass={cs.CL},
|
580 |
+
url={https://arxiv.org/abs/2111.09543},
|
581 |
+
}
|
582 |
+
@misc{liu2019robertarobustlyoptimizedbert,
|
583 |
+
title={RoBERTa: A Robustly Optimized BERT Pretraining Approach},
|
584 |
+
author={Yinhan Liu and Myle Ott and Naman Goyal and Jingfei Du and Mandar Joshi and Danqi Chen and Omer Levy and Mike Lewis and Luke Zettlemoyer and Veselin Stoyanov},
|
585 |
+
year={2019},
|
586 |
+
eprint={1907.11692},
|
587 |
+
archivePrefix={arXiv},
|
588 |
+
primaryClass={cs.CL},
|
589 |
+
url={https://arxiv.org/abs/1907.11692},
|
590 |
+
}
|
dist/distill.bundle.js
ADDED
The diff for this file is too large to render.
See raw diff
|
|
dist/distill.bundle.js.map
ADDED
The diff for this file is too large to render.
See raw diff
|
|
dist/index.html
ADDED
@@ -0,0 +1,1395 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<script src="distill.bundle.js" type="module" fetchpriority="high" blocking></script>
|
5 |
+
<script src="main.bundle.js" type="module" fetchpriority="low" defer></script>
|
6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
7 |
+
<meta charset="utf8">
|
8 |
+
<base target="_blank">
|
9 |
+
<title>Le FAT5 : Flash Attention T5</title>
|
10 |
+
<link rel="stylesheet" href="style.css">
|
11 |
+
</head>
|
12 |
+
|
13 |
+
<body>
|
14 |
+
<d-front-matter>
|
15 |
+
<script id='distill-front-matter' type="text/json">{
|
16 |
+
"title": "Le FAT5 : Flash Attention T5",
|
17 |
+
"description": "",
|
18 |
+
"published": "May 28, 2024",
|
19 |
+
"authors": [
|
20 |
+
{
|
21 |
+
"author":"Boris ALBAR",
|
22 |
+
"authorURL":"https://github.com/b-albar",
|
23 |
+
"affiliation": [{"name": "CATIE", "url": "https://catie.fr"}]
|
24 |
+
},
|
25 |
+
{
|
26 |
+
"author":"Loïck BOURDOIS",
|
27 |
+
"authorURL":"https://github.com/lbourdois",
|
28 |
+
"affiliation": [{"name": "CATIE", "url": "https://catie.fr"}]
|
29 |
+
}
|
30 |
+
],
|
31 |
+
"color": "#9CA3AF",
|
32 |
+
"katex": {
|
33 |
+
"delimiters": [
|
34 |
+
{"left": "$$", "right": "$$", "display": false}
|
35 |
+
]
|
36 |
+
}
|
37 |
+
}
|
38 |
+
</script>
|
39 |
+
</d-front-matter>
|
40 |
+
<d-title>
|
41 |
+
<h1 class="l-page" style="text-align: center;">Le FAT5 : Flash Attention T5</h1>
|
42 |
+
<p><img src="./assets/FAT5_dark.gif" alt="FAT5" width="100%"></p>
|
43 |
+
</d-title>
|
44 |
+
|
45 |
+
<d-article>
|
46 |
+
<d-contents>
|
47 |
+
</d-contents>
|
48 |
+
|
49 |
+
<div class="note">Pour une meilleure expérience, nous déconseillons la lecture sur téléphone portable</div>
|
50 |
+
|
51 |
+
<br>
|
52 |
+
|
53 |
+
<h2 id="motivation">Motivation</h2>
|
54 |
+
<p class="width_125">
|
55 |
+
Alors que beaucoup d’efforts ont été consacrés à l’optimisation de <i>transformer</i> de type décodeur, abandonnant ainsi l’encodeur,
|
56 |
+
nous pensons qu’il est essentiel de maintenir une architecture encodeur-décodeur.<br>
|
57 |
+
|
58 |
+
En effet, cette architecture qui présente des performances intéressantes pour l’instruction tuning <d-cite bibtex-key="chia2023instructeval"></d-cite>,
|
59 |
+
est propice à la distillation <d-cite bibtex-key="hsieh2023distilling"></d-cite> et semble supérieure aux modèles décodeur lorsqu’elle est finetunée <d-cite bibtex-key="fu2024tiny"></d-cite>.
|
60 |
+
Il a aussi été montré que les modèles encodeur-décodeur entraînés avec une modélisation du langage masqué obtiennent une meilleure performance zéro-shot
|
61 |
+
après un finetuning multitâche par rapport à un modèle décodeur <d-cite bibtex-key="wang2022languagemodelarchitecturepretraining"></d-cite>.<br>
|
62 |
+
Au-delà du NLP sur lequel nous nous concentrons dans cet article de blog, l’architecture encodeur-décodeur est très utilisée dans d’autres domaines
|
63 |
+
comme l’audio ou les séries temporelles par exemple. L'encodeur d'une telle architecture est également utilisé dans des modèles de diffusion.<br>
|
64 |
+
|
65 |
+
Dans cette logique, nous avons décidé de nous concentrer sur le T5 <d-cite bibtex-key="JMLR:v21:20-074"></d-cite>.<br><br>
|
66 |
+
|
67 |
+
Dans cet article, sont détaillons les optimisations que nous avons mises en place afin de pré-entraîner de manière efficiente un T5 de 147M de paramètres en français en un temps raisonnable (1 461 H pour 419Mds de <i>tokens</i>) et avec des moyens limités (1 unique A100 ; soit un budget de calcul d'environ 2 200 euros).
|
68 |
+
Pour ce faire, nous avons conçu des noyaux CUDA/Triton afin de rendre la Flash Attention compatible avec T5 et de fournir une inférence linéaire, étendant ainsi la taille du contexte qui peut être prise en compte par le modèle.<br><br>
|
69 |
+
<strong>Le code de pré-entrainement est disponible sur notre répertoire <a class="link" href="https://github.com/catie-aq/flashT5">GitHub</a> sous licence Apache-2.0. et les poids sur notre compte <a class="link" href="https://hf.co/CATIE-AQ">Hugging Face</a>.</strong>
|
70 |
+
<p class="width_125"><br><br><br></p>
|
71 |
+
|
72 |
+
|
73 |
+
<h2 id="vue-d-ensemble-de-notre-travail">Vue d’ensemble de notre travail</h2>
|
74 |
+
<p class="width_125">Nous avons donc choisi de travailler avec un T5 et en pratique avec le nanoT5 <d-cite bibtex-key="nawrot2023nanot5"></d-cite>.<br>
|
75 |
+
Pour les tâches de prétexte lors du pré-entraînement, nous avons suivi celles d'UL2 <d-cite bibtex-key="tay2023ul2"></d-cite> avec les 7 tâches suivantes :</p>
|
76 |
+
<pre><code class="lang-py">
|
77 |
+
denoiser_list=[
|
78 |
+
{<span class="hljs-string">"mu"</span>: <span class="hljs-number">3.0</span>, <span class="hljs-string">"r"</span>: <span class="hljs-number">0</span>.<span class="hljs-number">15</span>, <span class="hljs-string">"max_spans"</span>: max_token_length, <span class="hljs-string">"prefix"</span>: <span class="hljs-string">"[R]"</span>},
|
79 |
+
{<span class="hljs-string">"mu"</span>: <span class="hljs-number">8.0</span>, <span class="hljs-string">"r"</span>: <span class="hljs-number">0</span>.<span class="hljs-number">15</span>, <span class="hljs-string">"max_spans"</span>: max_token_length, <span class="hljs-string">"prefix"</span>: <span class="hljs-string">"[R]"</span>},
|
80 |
+
{<span class="hljs-string">"mu"</span>: <span class="hljs-number">4.0</span>, <span class="hljs-string">"r"</span>: <span class="hljs-number">0</span>.<span class="hljs-number">0</span>, <span class="hljs-string">"max_spans"</span>: <span class="hljs-number">1</span>, <span class="hljs-string">"prefix"</span>: <span class="hljs-string">"[S]"</span>},
|
81 |
+
{<span class="hljs-string">"mu"</span>: <span class="hljs-number">3.0</span>, <span class="hljs-string">"r"</span>: <span class="hljs-number">0</span>.<span class="hljs-number">5</span>, <span class="hljs-string">"max_spans"</span>: max_token_length, <span class="hljs-string">"prefix"</span>: <span class="hljs-string">"[X]"</span>},
|
82 |
+
{<span class="hljs-string">"mu"</span>: <span class="hljs-number">8.0</span>, <span class="hljs-string">"r"</span>: <span class="hljs-number">0</span>.<span class="hljs-number">15</span>, <span class="hljs-string">"max_spans"</span>: max_token_length, <span class="hljs-string">"prefix"</span>: <span class="hljs-string">"[X]"</span>},
|
83 |
+
{<span class="hljs-string">"mu"</span>: <span class="hljs-number">64.0</span>, <span class="hljs-string">"r"</span>: <span class="hljs-number">0</span>.<span class="hljs-number">15</span>, <span class="hljs-string">"max_spans"</span>: max_token_length, <span class="hljs-string">"prefix"</span>: <span class="hljs-string">"[X]"</span>},
|
84 |
+
{<span class="hljs-string">"mu"</span>: <span class="hljs-number">64.0</span>, <span class="hljs-string">"r"</span>: <span class="hljs-number">0</span>.<span class="hljs-number">5</span>, <span class="hljs-string">"max_spans"</span>: max_token_length, <span class="hljs-string">"prefix"</span>: <span class="hljs-string">"[X]"</span>}]
|
85 |
+
denoiser_proportions=[<span class="hljs-number">0</span>.<span class="hljs-number">165</span>, <span class="hljs-number">0</span>.<span class="hljs-number">165</span>, <span class="hljs-number">0</span>.<span class="hljs-number">34</span>, <span class="hljs-number">0</span>.0825, <span class="hljs-number">0</span>.0825, <span class="hljs-number">0</span>.0825, <span class="hljs-number">0</span>.0825]
|
86 |
+
</code></pre>
|
87 |
+
<p class="width_125">avec <code>mu</code> la taille du n-gram, <code>r</code> le pourcentage de masquage dans le n-gram et <code>prefix</code> le type de tâche de prétexte.
|
88 |
+
La signification des lettres <code>[R]</code>, <code>[S]</code> et <code>[X]</code> est décrite <a class="link" href="https://huggingface.co/google/ul2#mixture-of-denoisers">ici</a>
|
89 |
+
et nous vous invitons à consulter notamment l'image explicative <a class="link" href="https://raw.githubusercontent.com/google-research/google-research/master/ul2/figs/mod.png">ici</a>.</p>
|
90 |
+
<p class="width_125">Pour avoir un entraînement rapide, nous nous sommes orientés sur la Flash Attention <d-cite bibtex-key="dao2022flashattention"></d-cite>.
|
91 |
+
Cependant, comme celle-ci ne gère pas les biais attentionnels (additifs) du T5, nous avons dû l’étendre en développant un noyau personnalisé.
|
92 |
+
Plus précisément nous avons développé successivement deux versions de ce noyau.
|
93 |
+
Dans la première version, au début de notre travail nous transmettions la matrice de biais au noyau.
|
94 |
+
Dans la version actuelle, nous inspirant du TurboT5 <d-cite bibtex-key="turbot5"></d-cite>,
|
95 |
+
nous communiquons seulement un tenseur contenant les biais fusionnés afin de matérialiser la matrice de biais à la volée.
|
96 |
+
Cela permet de passer d’un T5 à mémoire quadratique à un T5 à mémoire linéaire, et par conséquent augmente fortement la taille de contexte que le modèle peut gérer.</p>
|
97 |
+
<p class="width_125">Notre travail a abouti au pré-entraînement d'un T5 en français de 147M de paramètres : le FAT5 <i>small</i>.<br>
|
98 |
+
Le jeu de données que nous avons utilisé est composé de la partie en français du corpus CulturaX <d-cite bibtex-key="nguyen2023culturax"></d-cite>
|
99 |
+
(principale source avec plus de 1258 Go de texte),
|
100 |
+
de la partie en français de Wikipedia <d-cite bibtex-key="wikidump"></d-cite> (dump 20231101),
|
101 |
+
de justice_fr (textes de loi française) <d-cite bibtex-key="justice_fr"></d-cite>,
|
102 |
+
et de 25 000 000 lignes de TheStack <d-cite bibtex-key="Kocetkov2022TheStack"></d-cite>
|
103 |
+
(l'idée ici est de montrer un peu de code à notre modèle bien que ce ne soit pas notre objectif principal).<br>
|
104 |
+
Ce modèle a été évalué sur cinq tâches : le résumé de textes, la classification binaire, le question answering, la reconnaissance d’entités nommées et la <i>sentence similarity</i>.</p>
|
105 |
+
<p class="width_125"><br><br><br></p>
|
106 |
+
|
107 |
+
<h2 id="les-d-tails-de-la-recette">Les détails de la recette</h2>
|
108 |
+
<p class="width_125">Ne disposant que de deux A100 (une de 80Go et une de 40Go), nous avons dû consacrer un peu de temps afin d’implémenter des optimisations permettant d'exploiter au mieux notre matériel.
|
109 |
+
En effet, avant même d’entraîner un modèle voire de modifier son architecture, il faut s’assurer qu’on optimise l'usage des capacités de calcul de nos GPU.
|
110 |
+
Plusieurs facteurs peuvent expliquer un entraînement sous-optimal d’un modèle de deep learning :<br>
|
111 |
+
• Le manque de nourriture (<em>disk-bounded</em> - limitation en disque)<br>
|
112 |
+
• La bande passante mémoire (<em>memory-bounded</em> - limitation en bande passante mémoire)<br>
|
113 |
+
• La vitesse de calcul (<em>compute-bounded</em> - limitation en calcul)</p>
|
114 |
+
|
115 |
+
<p class="width_125">Idéalement, on aimerait que le modèle soit limité par la vitesse de calcul, c’est-à-dire que le GPU soit utilisé à pleine capacité.
|
116 |
+
Partant de ce constat, nous avons travaillé sur trois points principaux : <br>
|
117 |
+
• L’optimisation du disque du GPU <br>
|
118 |
+
• L’optimisation de la bande passante de la mémoire du GPU <br>
|
119 |
+
• L’optimisation de l’utilisation des Tensor Cores<br>
|
120 |
+
</p>
|
121 |
+
|
122 |
+
<p class="width_125">Il s’agit donc de points à la fois hardware mais aussi software.</p>
|
123 |
+
<p></p>
|
124 |
+
<p class="width_125">Dans la suite de cette section, tout ce que nous avons réalisé/implémenté pour apporter une réponse aux limites rencontrées est disponible dans un encadré en vert. Des notes/commentaires sont trouvables dans un encadré en bleu.
|
125 |
+
<br><br></p>
|
126 |
+
<h3 id="optimisation-du-disque-du-gpu">Optimisation du disque du GPU</h3>
|
127 |
+
<p class="width_125">La limitation en disque intervient soit lors du chargement des données, soit lors des opérations de prétraitement.
|
128 |
+
Dans les deux cas, cela se matérialise par un problème de lenteur.
|
129 |
+
<br></p>
|
130 |
+
<h4 id="acc-s-disques">Accès disques</h4>
|
131 |
+
<p class="width_125">Si la limitation vient des accès disques, plusieurs solutions sont possibles :</p>
|
132 |
+
<ul>
|
133 |
+
<li><p class="width_125"><u>Mettre les données en RAM</u><br>
|
134 |
+
Cela résout le problème de manière radicale mais suppose que la base de données rentre en RAM, ce qui est loin d’être évident du fait de sa petite taille.</p>
|
135 |
+
<div class="tip"><p>Ce n’est donc pas la solution que nous avons retenue.</p></div>
|
136 |
+
</li>
|
137 |
+
<li><p class="width_125"><u>Mettre les données sur un disque plus rapide et/ou moins utilisé</u><br>
|
138 |
+
Si vous avez un accès physique à votre serveur de GPU, il est très utile d’intégrer des <a class="link" href="https://fr.wikipedia.org/wiki/NVM_Express">NVMe</a> dans la configuration de celui-ci.</p>
|
139 |
+
<p class="width_125">Il faut aussi faire attention à ne pas avoir trop de processus de différents entraînements qui tirent sur un même disque.
|
140 |
+
Il est alors préférable d’avoir plusieurs petits disques plutôt qu’un gros. </p>
|
141 |
+
<div class="note"><p>Un effet indirect bénéfique est qu’une telle configuration coûte moins cher 😉</p></div>
|
142 |
+
</li>
|
143 |
+
</ul>
|
144 |
+
<ul>
|
145 |
+
<li class="width_125"><u>Utiliser des formats de fichiers plus efficients notamment au niveau des accès aléatoires</u><br>
|
146 |
+
Par exemple les fichiers <code>.parquet</code> sont plus efficients que les <code>.csv</code>.
|
147 |
+
On peut aussi utiliser des formats spécifiquement développés dans ce but comme le <code>.beton</code> de ffcv <d-cite bibtex-key="leclerc2023ffcv"></d-cite>.</li>
|
148 |
+
<div class="tip"><p>Nous utilisons la bibliothèque Datasets <d-cite bibtex-key="lhoest2021datasets"></d-cite> pour charger et traiter les données que nous utilisons.
|
149 |
+
Avec cette bibliothèque, les données sont décompressées en local au format <code>Arrow</code>.
|
150 |
+
De plus, si les données chargées depuis le Hub d’Hugging Face ont été ajoutées avec la fonction <code>push_to_hub()</code>,
|
151 |
+
alors le jeu de données est par défaut converti au format <code>parquet</code>.</p></div>
|
152 |
+
</ul>
|
153 |
+
<ul>
|
154 |
+
<li class="width_125"><u>Prétokeniser les données</u><br>
|
155 |
+
L'option la plus efficace est probablement de prétokeniser les données afin d'optimiser les accès.
|
156 |
+
C'est-à-dire que la tokenisation a lieu dans une étape préalable et non pas à la volée.
|
157 |
+
</li>
|
158 |
+
<div class="tip"><p>Nous invitions le lecteur à consulter le code
|
159 |
+
<a class="link" href="https://github.com/catie-aq/flashT5/blob/main/examples/minipile/pretokenize_minipile.py">suivant</a> qui
|
160 |
+
illustre la façon dont nous procédons dans notre tutoriel sur le FAT5 appliqué au jeu de données Minipile <d-cite bibtex-key="kaddour2023minipilechallengedataefficientlanguage"></d-cite>.</p></div>
|
161 |
+
</ul>
|
162 |
+
<p><br></p>
|
163 |
+
<h4 id="traitement-des-donn-es">Traitement des données</h4>
|
164 |
+
<p class="width_125">Si la limitation vient du traitement des données après leur chargement :</p>
|
165 |
+
<ul>
|
166 |
+
<li><p class="width_125"><u>Il est possible d’utiliser plusieurs processus pour traiter les données en parallèle</u><br>
|
167 |
+
Par exemple, le paramètre <code>num_workers</code> du <code>Dataloader</code> de PyTorch <d-cite bibtex-key="paszke2019pytorch"></d-cite>.</p></li>
|
168 |
+
<div class="tip"><p>Vous pouvez retrouver dans notre code les valeurs que nous utilisons pour ce paramètre pour notre FAT5 <a class="link" href="https://github.com/catie-aq/flashT5/blob/dfe10d498ae0b39082182f807acb509e91992360/configs/fr/fat5-fr-small.yaml#L42">small</a>.</div>
|
169 |
+
</ul>
|
170 |
+
<ul>
|
171 |
+
<li><p class="width_125"><u>Le goulot d’étranglement peut aussi venir du <code>DataCollator</code></u><br>
|
172 |
+
C'est notamment le cas lorsqu’il y a des tâches complexes à effectuer (masquage d’image ou débruiteurs multiples sur des tâches de NLP).<br>
|
173 |
+
On pourra alors construire un <code>DataCollator</code> personnalisé pour la tâche.
|
174 |
+
On appliquera les méthodes traditionnelles pour optimiser la vitesse de celui-ci.
|
175 |
+
De même, l’emploi de la vectorisation de Numpy permettra de traiter plus rapidement des listes qu'avec des boucles <code>for</code>.
|
176 |
+
D’une manière générale, Numpy est plus rapide que PyTorch pour ce type de tâches.
|
177 |
+
On pourra aussi utiliser des méthodes de compilation comme numba <d-cite bibtex-key="10.1145/2833157.2833162"></d-cite> pour Python par exemple.</p></li>
|
178 |
+
<div class="tip"><p>Nous avons suivi ce principe et développé un <code>DataCollator</code> personnalisé pour notre FAT5 dont vous pouvez consulter le code <a class="link" href="https://github.com/catie-aq/flashT5/blob/main/src/data/data_collator_ul2.py">ici</a>.
|
179 |
+
Il gère les tâches de prétexte UL2 tout en ayant un mécanisme de batch dynamique pour réduire le <em>padding</em> (plus d'informations dans la section suivante).</p></div>
|
180 |
+
<div class="note"><p>Comme il n’y avait pas d’implémentation du <code>DataCollator</code> d’UL2 disponible en PyTorch jusqu’ici, nous espérons que cela pourra être utile à d’autres travaux.</p></div>
|
181 |
+
</ul>
|
182 |
+
<ul>
|
183 |
+
<li><p class="width_125"><u>Réaliser un <em>padding</em> efficace</u><br>
|
184 |
+
<p class="width_125">Lorsque l’on travaille avec des séquences, on a naturellement tendance à padder un ensemble de séquences pour pouvoir construire des batchs.
|
185 |
+
Les <em>tokens</em> de <em>padding</em> engendrent alors des calculs inutiles.<br>
|
186 |
+
La première chose à faire est de limiter le <em>padding</em> à la séquence de taille maximum et non à une valeur maximale.
|
187 |
+
C’est la technique du <a class="link" href="https://huggingface.co/learn/nlp-course/chapter3/2?fw=pt#dynamic-padding">padding dynamique</a>.<br>
|
188 |
+
Avec cette technique, il peut néanmoins rester des <em>tokens</em> de <em>padding</em>. Pour les gérer, il existe deux possibilités :<br>
|
189 |
+
• soit utiliser une méthode de groupage des données avec des tailles similaires
|
190 |
+
(par exemple, <a class="link" href="https://huggingface.co/docs/transformers/main_classes/trainer#transformers.TrainingArguments.group_by_length">ce paramètre</a>
|
191 |
+
dans la bibliothèque Transformers <d-cite bibtex-key="wolf2020huggingfaces"></d-cite> ou encore
|
192 |
+
<a class="link" href="https://discuss.huggingface.co/t/how-to-implement-trainers-group-by-length-in-pytorch/9232">en récupérant ce sampler</a> pour PyTorch)<br>
|
193 |
+
• soit concaténer différents exemples dans un DataCollator personnalisé.</p>
|
194 |
+
<div class="tip"><p>Nous avons opté pour la seconde option et nous renvoyons donc le lecteur à nouveau au <a class="link" href="https://github.com/catie-aq/flashT5/blob/main/src/data/data_collator_ul2.py">code</a> de notre DataCollator de mélange de débruiteurs (UL2).</p></div>
|
195 |
+
<div class="note"><p>Des heuristiques plus optimisées doivent probablement être mises en place.
|
196 |
+
Nous avons fait un test en proposant une
|
197 |
+
<a class="link" href="https://github.com/catie-aq/flashT5/blob/dfe10d498ae0b39082182f807acb509e91992360/src/data/data_collator_ul2.py#L45">fonction</a>
|
198 |
+
dans le <code>DataCollator</code> afin de trier les <code>input_ids</code> et les <code>labels</code> par longueur décroissante.
|
199 |
+
Néanmoins ceci est plutôt long pour un gain d'empaquetage minime.
|
200 |
+
Un travail plus conséquent serait à effectuer sur ce point.
|
201 |
+
</p></div>
|
202 |
+
</ul>
|
203 |
+
<p class="width_125"><br><br></p>
|
204 |
+
|
205 |
+
|
206 |
+
<h3 id="optimisation-de-la-bande-passante-de-la-m-moire-du-gpu">Optimisation de la bande passante de la mémoire du GPU</h3>
|
207 |
+
<p class="width_125">La limitation en bande passante mémoire est plus difficile à traiter.
|
208 |
+
Une opération limitée par la mémoire est une opération dont le temps global d’exécution est restreint par les accès mémoires.
|
209 |
+
C’est notamment le cas pour les LLMs particulièrement au niveau de l’inférence.
|
210 |
+
Le diagnostic peut être posé à partir du <a class="link" href="https://pytorch.org/tutorials/intermediate/tensorboard_profiler_tutorial.html"><em>profiler</em> de PyTorch</a> :</p>
|
211 |
+
<figure class="width_125">
|
212 |
+
<img src="https://pytorch.org/tutorials/_static/img/profiler_overview1.png" alt="profiler_overview1.png" width="100%">
|
213 |
+
<figcaption><center><i>Source : <a class="link" href="https://pytorch.org/tutorials/_static/img/profiler_overview1.png">https://pytorch.org/tutorials/_static/img/profiler_overview1.png</a></i></center></figcaption>
|
214 |
+
</figure>
|
215 |
+
<br><br><br>
|
216 |
+
<p class="width_125">Une autre possibilité pour établir un diagnostic est d’utiliser un simple <code>nvidia-smi</code> :</p>
|
217 |
+
<figure class="width_125">
|
218 |
+
<img src="./assets/nvidiasmi.png" alt="nvidiasmi.png" width="100%">
|
219 |
+
</figure>
|
220 |
+
<br>
|
221 |
+
<p class="width_125">Utile pour savoir si un problème est présent mais donne peu d’information sur la nature de ce problème.
|
222 |
+
C’est pourquoi nous avons une préférence pour le profiler.</p>
|
223 |
+
<p><br></p>
|
224 |
+
<h4 id="noyau-cuda">Noyau CUDA</h4>
|
225 |
+
<p class="width_125">La technique reine pour optimiser la bande passante de la mémoire du GPU est de développer un kernel CUDA fusionnant
|
226 |
+
dans la SRAM plusieurs opérations limitantes.
|
227 |
+
Cela peut limiter la copie de larges matrices dans l’HBM pour les recharger immédiatement ensuite dans la SRAM.
|
228 |
+
C’est désormais une caractéristique courante des <i>transformers</i> décodeurs grâce à la <a class="link" href="https://github.com/Dao-AILab/flash-attention">Flash Attention</a>.</p>
|
229 |
+
<div class="tip"><p>
|
230 |
+
Comme la Flash Attention ne gère pas les biais attentionnels (additifs) du T5, nous l’avons étendue en développant un noyau CUDA personnalisé.
|
231 |
+
Comme évoqué dans l’introduction, c’est en réalité successivement deux versions successives de ce noyau que nous avons implémentées.
|
232 |
+
Sans pour autant entrer dans les détails des 650 lignes de code de l’implémentation de la première version (consultable
|
233 |
+
<a class="link" href="https://github.com/Dao-AILab/flash-attention/pull/617">ici</a>),
|
234 |
+
l’idée générale et simplifiée (pour une passe avant) est la suivante :</p>
|
235 |
+
<ul>
|
236 |
+
<li>On charge de l’HBM vers la SRAM la sortie attendue O (output) initialisée avec des 0,
|
237 |
+
de même que la requête Q (query), la clé K (key), la valeur V (value) et les biais B.</li>
|
238 |
+
<li>Notre noyau CUDA calcule les étapes suivantes :<br>
|
239 |
+
• Calcul de la matrice S via le produit matriciel entre Q et la transposée de K<br>
|
240 |
+
• Calcul de S’ qui est la somme de la matrice S et de la matrice des biais B<br>
|
241 |
+
• Calcul de P qui est la softmax (cumulative sous le capot) de S’<br>
|
242 |
+
• Calcul de la sortie O qui est le produit matriciel de P par V<br>
|
243 |
+
</li>
|
244 |
+
<li>La sortie O est chargée sur l’HBM et la SRAM est vidée.
|
245 |
+
<picture>
|
246 |
+
<source media="(prefers-color-scheme: dark)" srcset="./assets/FAT5_dark.gif">
|
247 |
+
<img alt="FAT5 animation" src="./assets/FAT5.gif" width="100%">
|
248 |
+
</picture>
|
249 |
+
</ul>
|
250 |
+
<br>
|
251 |
+
<p>Alors que la première version du noyau est générique, la seconde (disponible <a class="link" href="https://github.com/Dao-AILab/flash-attention/pull/956">ici</a>)
|
252 |
+
est spécifique au fonctionnement de modèles avec encodage positionnel relatif (ce qui est le cas du T5).
|
253 |
+
L’idée générale et simplifiée (pour une passe avant) est la suivante :</p>
|
254 |
+
<ul>
|
255 |
+
<li>Dans l'HBM, nous avons la sortie attendue O (output) initialisée avec des 0,
|
256 |
+
de même que la requête Q (query), la clé K (key), la valeur V (value).
|
257 |
+
Cependant nous n'avons pas la matrice de biais B comme précédemment mais le bucket de tenseur T.</li>
|
258 |
+
<li>On charge de l’HBM vers la SRAM la sortie attendue O (output) initialisée avec des 0,
|
259 |
+
de même que la requête Q (query), la clé K (key), la valeur V (value) et le bucket de tenseur T.</li>
|
260 |
+
<li>Notre noyau CUDA calcule les étapes suivantes :<br>
|
261 |
+
• Calcul de la matrice S via le produit matriciel entre Q et la transposée de K<br>
|
262 |
+
• Calcul de S’ qui est la somme de la matrice S et d'une matrice remplie avec les éléments de T<br>
|
263 |
+
• Calcul de P qui est la softmax (cumulative sous le capot) de S’<br>
|
264 |
+
• Calcul de la sortie O qui est le produit matriciel de P par V<br>
|
265 |
+
</li>
|
266 |
+
<li>La sortie O est chargée sur l’HBM et la SRAM est vidée.</li>
|
267 |
+
</ul>
|
268 |
+
<p>
|
269 |
+
De cette façon, alors que la première version la matrice de biais B nécessitait une mémoire quadratique, ici nous nous ramenons
|
270 |
+
à une mémoire linéaire permettant d'effectuer des inférences sur des dizaines de milliers de <em>tokens</em>.<br>
|
271 |
+
Pour la conception de cette seconde version, nous nous sommes inspirés du noyau Triton du TurboT5 que nous avons porté en CUDA et étendu au full bf16.
|
272 |
+
</p>
|
273 |
+
</div>
|
274 |
+
<br>
|
275 |
+
|
276 |
+
<div class="tip"><p>Notons que les deux versions développées peuvent être utilisées avec plusieurs encodages positionnels.<br>
|
277 |
+
Nous invitions le lecteur à consulter ce <a class="link" href="https://github.com/catie-aq/flashT5/blob/main/src/utils/positional_encoding.py">fichier</a>
|
278 |
+
contenant des classes compatibles avec la Flash Attention pour le
|
279 |
+
<a class="link" href="https://github.com/catie-aq/flashT5/blob/dfe10d498ae0b39082182f807acb509e91992360/src/utils/positional_encoding.py#L10">RelativePositionalEncoding</a>
|
280 |
+
<d-cite bibtex-key="shaw2018selfattention"></d-cite>,
|
281 |
+
l’<a class="link" href="https://github.com/catie-aq/flashT5/blob/dfe10d498ae0b39082182f807acb509e91992360/src/utils/positional_encoding.py#L113">ALiBiPositionalEncoding</a>
|
282 |
+
<d-cite bibtex-key="press2022train"></d-cite>,
|
283 |
+
le <a class="link" href="https://github.com/catie-aq/flashT5/blob/dfe10d498ae0b39082182f807acb509e91992360/src/utils/positional_encoding.py#L205">RotaryPositionalEncoding</a>
|
284 |
+
<d-cite bibtex-key="su2023roformer"></d-cite> et
|
285 |
+
<a class="link" href="https://github.com/catie-aq/flashT5/blob/dfe10d498ae0b39082182f807acb509e91992360/src/utils/positional_encoding.py#L341">FIRE</a> <d-cite bibtex-key="li2024functional"></d-cite>.</p></div>
|
286 |
+
|
287 |
+
<div class="note"><p>Au moment de la rédaction de ces lignes,
|
288 |
+
les deux <em>pull request</em> (une pour chaque version du noyau, disponibles <a class="link" href="https://github.com/Dao-AILab/flash-attention/pull/617">ici</a>
|
289 |
+
et <a class="link" href="https://github.com/Dao-AILab/flash-attention/pull/956">ici</a>) ouvertes sur le répertoire officiel de la Flash Attention n’ont pas été mergées.
|
290 |
+
Le lecteur devra donc provisoirement recompiler nos patchs personnalisés de la Flash Attention pour pouvoir utiliser nos modèles.<br>
|
291 |
+
Nous invitons le lecteur à consulter la partie Benchmark plus bas dans l'article pour visualiser l'amélioration apportée par ces deux noyaux.</p></div>
|
292 |
+
|
293 |
+
<br>
|
294 |
+
<div class="note"><p>Bien que nous n’y ayons pas eu recours, il est à noter que certaines libraires contiennent des implémentations d’opérateurs courant fusionnés, par exemple Apex <d-cite bibtex-key="nvidiapex"></d-cite>.</p></div>
|
295 |
+
|
296 |
+
<p><br></p>
|
297 |
+
<h4 id="noyau-triton">Noyau Triton</h4>
|
298 |
+
<p class="width_125">Triton <d-cite bibtex-key="10.1145/3315508.3329973"></d-cite> est un langage de programmation maintenu qui permet de compiler du code Python efficacement à l’instar de CUDA mais ayant l’avantage d’être (de notre point de vue) plus simple à prendre en main. En effet, contrairement à CUDA, qui nécessite une compréhension approfondie de l’architecture matérielle des GPU, Triton fait abstraction de nombreux détails de bas niveau tels que la coalescence de la mémoire, la gestion de la mémoire partagée et l’ordonnancement au sein des blocs de threads CUDA.</p>
|
299 |
+
|
300 |
+
<div class="tip"><p>Une implémentation en Triton de la
|
301 |
+
<a class="link" href="https://github.com/catie-aq/flashT5/blob/main/src/model/ops/flash_attention_v2_bias.py">Flash Attention 2 gérant les biais d’attention</a>
|
302 |
+
est fournie pour ceux qui ne souhaitent pas recompiler un patch personnalisé pour la Flash Attention.
|
303 |
+
Pour cela, nous nous sommes appuyés sur le répertoire de FlagAttention <d-cite bibtex-key="flagattention"></d-cite>.
|
304 |
+
<br>
|
305 |
+
<br>
|
306 |
+
En complément de cette implémentation (dont l'usage est facultatif), d’autres parties de l’architecture ont été optimisées à l’aide de noyaux Triton ad hoc, à savoir :
|
307 |
+
<br>
|
308 |
+
• la perte d’<a class="link" href="https://github.com/catie-aq/flashT5/blob/main/src/model/ops/cross_entropy_loss.py">entropie croisée</a> (et la perte z <d-cite bibtex-key="debrébisson2016zloss"></d-cite>) <br>
|
309 |
+
• la <a class="link" href="https://github.com/catie-aq/flashT5/blob/main/src/model/ops/rms_norm.py">couche de RMSNorm</a> <d-cite bibtex-key="zhang2019root"></d-cite> <br>
|
310 |
+
<br>
|
311 |
+
Nous nous sommes notamment inspirés de <a class="link" href="https://github.com/unslothai/unsloth">Unsloth</a> <d-cite bibtex-key="unsloth"></d-cite>.<br>
|
312 |
+
<br>
|
313 |
+
Nous invitons le lecteur se référer à la partie Benchmark plus bas dans l'article pour visualiser l'impact de cette optimisation.</div>
|
314 |
+
|
315 |
+
<p><br></p>
|
316 |
+
<h4 id="utiliser-torch-compile-">Utiliser <code>torch.compile</code></h4>
|
317 |
+
<p class="width_125">Une approche plus simple est de compiler les modèles avec <code>torch.compile</code>.
|
318 |
+
PyTorch se charge alors de faire les fusions possibles, éventuellement en réordonnant des opérations.
|
319 |
+
Il s’agit alors de faire la chasse aux cassures dans le graphe de compilation qui sont des retours à un mode d’exécution « eager » impactant
|
320 |
+
négativement la performance de l’opération.</p>
|
321 |
+
<div class="note"><p>Voir la <a class="link" href="https://pytorch.org/tutorials/intermediate/torch_compile_tutorial.html">documentation</a> officielle pour plus de détails.</p></div>
|
322 |
+
<p class="width_125">Une autre possibilité consiste à un usage conjoint d’un noyau kernel personnalisé et de <code>torch.compile</code>.
|
323 |
+
L'implémentation de cette option est grandement simplifiée depuis la
|
324 |
+
<a class="link" href="https://github.com/pytorch/pytorch/releases/tag/v2.4.0">version 2.4 de PyTorch</a>.</p>
|
325 |
+
<p class="width_125">Nous invitons le lecteur à se référer à la partie benchmark disponible plus bas dans l’article afin de mesurer les performances mémoire
|
326 |
+
des différentes techniques décrites.</p>
|
327 |
+
<p class="width_125"><br><br></p>
|
328 |
+
<h3 id="optimisation-de-l-utilisation-des-tensor-cores">Optimisation de l’utilisation des Tensor Cores</h3>
|
329 |
+
<p class="width_125">Les GPU récents possèdent des unités dédiées aux opérations tensorielles : les TensorCore. Les utiliser correctement est essentiel.</p>
|
330 |
+
<p class="width_125">A nouveau, pour établir un diagnostic, il est conseillé de se référer au profiler de PyTorch qui indique la proportion de TensorCore
|
331 |
+
utilisé pour chaque noyau CUDA :</p>
|
332 |
+
<p><figure class="width_125">
|
333 |
+
<img src="https://pytorch.org/tutorials/_static/img/profiler_kernel_view.png" alt="profiler_kernel_view.png" width="100%">
|
334 |
+
<figcaption><center><i>Source : <a class="link" href="https://pytorch.org/tutorials/_static/img/profiler_kernel_view.png">https://pytorch.org/tutorials/_static/img/profiler_kernel_view.png</a></i></center></figcaption>
|
335 |
+
</figure>
|
336 |
+
<br><br>
|
337 |
+
<p class="width_125">Concernant les optimisations réalisables :<br></p>
|
338 |
+
<h4 id="puissances-de-2">Multiple de 8 ou de 64</h4>
|
339 |
+
<p class="width_125">La première consiste à employer des tailles de tenseurs de certains multiples de 8 ou de 64.
|
340 |
+
Nous invitons le lecteur à se référer à la documentation de Nvidia,
|
341 |
+
en particulier cet <a class="link" href="https://docs.nvidia.com/deeplearning/performance/dl-performance-matrix-multiplication/index.html#requirements-tc">article</a>
|
342 |
+
et cet <a class="link" href="https://developer.nvidia.com/blog/optimizing-gpu-performance-tensor-cores/">article</a> pour déterminer le multiple à sélectionner en fonction de la précision désirée. </p>
|
343 |
+
<div class="tip"><p>Dans cette logique, nous avons entraîné un <em>tokenizer</em> de taille 32 768 (8**5), suivant <a class="link" href="https://twitter.com/karpathy/status/1621578354024677377">cette observation de KARPATHY</a>.
|
344 |
+
Il s'agit d'un BPE <d-cite bibtex-key="sennrich2016neuralmachinetranslationrare"></d-cite> entraîné sur CulturaX et The Stack, utilisant 256 extra_tokens et
|
345 |
+
les chiffres sont séparés.<br>
|
346 |
+
Le lecteur pourra trouver le code utilisé <a class="link" href=https://github.com/catie-aq/flashT5/blob/main/examples/fat5-fr/train_tokenizer.py">ici</a>.
|
347 |
+
</p></div>
|
348 |
+
<p><br></p>
|
349 |
+
|
350 |
+
<h4 id="utiliser-le-bon-optimiseur">Utiliser le bon optimiseur</h4>
|
351 |
+
<p class="width_125">Changer d’optimiseur par rapport à l’implémentation initiale du modèle peut être judicieux pour accélérer la convergence du modèle
|
352 |
+
(cela peut néanmoins empêcher la reproduction des résultats du papier original).<br>
|
353 |
+
Les optimiseurs accélèrent la convergence en permettant des tailles de batchs conséquentes comme dans le cas de LAMB <d-cite bibtex-key="you2020large"></d-cite>
|
354 |
+
ou l’utilisation de <em>learning rates</em> plus élevés comme Sophia <d-cite bibtex-key="liu2024sophia"></d-cite>.<br>
|
355 |
+
Des versions plus efficaces des optimiseurs peuvent être aussi utilisées comme l’option <code>fused</code>
|
356 |
+
dans l’<a class="link" href="https://pytorch.org/docs/stable/generated/torch.optim.Adam.html">optimiseur Adam</a> de PyTorch
|
357 |
+
ou encore les optimiseurs disponibles dans <a class="link" href="https://github.com/NVIDIA/apex">Apex</a>.</p>
|
358 |
+
<div class="tip"><p>
|
359 |
+
Nous avons utilisé l’optimiseur l’optimiseur original du T5, <a class="link" href="https://github.com/catie-aq/flashT5/blob/main/src/utils/adamw_scaled.py">AdamWScale</a>.
|
360 |
+
Pour les valeurs des hyperparamètres, nous utilisons <code>lr = 5e-3</code>, <code>betas = (0.9, 0.999)</code>, <code>eps = 1e-6</code> et <code>weight_decay = 0.0</code>
|
361 |
+
en nous basant sur les observations de <a class="link" href="https://github.com/PiotrNawrot/nanoT5/issues/25#issuecomment-1922731400">Wilson Wongso</a>.
|
362 |
+
En effet, il s'avère que tous les optimiseurs alternatifs testés ne convergeaient pas.</p></div>
|
363 |
+
<div class="note"><p>Nous avons fait en sorte que notre version d'AdamWScale dispose du paramètre <code>foreach</code>.</p>
|
364 |
+
</div>
|
365 |
+
<p><br></p>
|
366 |
+
|
367 |
+
<h4 id="entra-ner-ses-mod-les-en-bf16-ou-fp16-">Entraîner ses modèles en <code>bf16</code></h4>
|
368 |
+
<p class="width_125">Les GPU récents permettent d’exploiter pleinement l’utilisation de précision réduite
|
369 |
+
(permettant de gagner un facteur 2 de débit par rapport au <code>fp32</code>).
|
370 |
+
Le <code>bf16</code> n’est disponible que sur les architectures Ampere ou plus récentes mais autorise de s’affranchir de méthode
|
371 |
+
de <em>loss scaling</em> <d-cite bibtex-key="micikevicius2018mixed"></d-cite> qui est généralement nécessaire en <code>fp16</code>
|
372 |
+
grâce à une plage dynamique plus grande (l’exposant est codé sur 8 bits comme le <code>fp32</code>).</p>
|
373 |
+
<div class="tip"><p>Dans cette logique, nous entraînons nos modèles en <code>bf16</code>.
|
374 |
+
Plus précisément, alors qu'au début de nos expérimentations nous utilisions du <code>bf16-mixed</code>, nous avons recouru à
|
375 |
+
<a class="link" href="https://en.wikipedia.org/wiki/Kahan_summation_algorithm">la sommation compensée de Kahan</a>
|
376 |
+
afin de pouvoir utiliser du <code>full bf16</code> dans notre optimiseur.<br>
|
377 |
+
A nouveau, le code de notre optimiseur est consultable <a class="link" href="https://github.com/catie-aq/flashT5/blob/main/src/utils/adamw_scaled.py">ici</a>.</p>
|
378 |
+
</div>
|
379 |
+
|
380 |
+
<h4 id="utiliser-moins-de-m-moire-du-gpu">Utiliser moins de mémoire GPU</h4>
|
381 |
+
<p class="width_125">Certaines techniques existent pour limiter l’utilisation de mémoire GPU par le modèle tel que le
|
382 |
+
<a class="link" href="https://pytorch.org/docs/stable/checkpoint.html"><em>gradient checkpointing</em></a>
|
383 |
+
ou les méthodes type ZeRO <d-cite bibtex-key="rajbhandari2020zero"></d-cite> implémentées dans
|
384 |
+
<a class="link" href="https://github.com/microsoft/DeepSpeed">DeepSpeed</a>.
|
385 |
+
En limitant la mémoire utilisée, des tailles de batchs plus grandes peuvent être utilisées accélérar l’entraînement du modèle.</p>
|
386 |
+
<p class="width_125"><br><br></p>
|
387 |
+
|
388 |
+
|
389 |
+
<h3 id="autres">Autres</h3>
|
390 |
+
<h4 id="le-parall-lisme">Le parallélisme</h4>
|
391 |
+
<p class="width_125">L’utilisation de plusieurs GPUs est délicate.
|
392 |
+
Réalisée naïvement, elle peut résulter en des performances inférieures à l’implémentation sur un seul GPU gâchant alors des ressources de calculs.
|
393 |
+
C’est le cas notamment lorsque des goulets d’étranglement se forment au niveau des communications entre les GPU.
|
394 |
+
Il s’agit d’être sûr que le modèle n’est pas limité par la bande passante entre les cartes ou de s'assurer que les cartes sont connectées avec des
|
395 |
+
bandes passantes suffisantes via des techniques type <a class="link" href="https://en.wikipedia.org/wiki/NVLink">NVLink</a> par exemple. </p>
|
396 |
+
<p class="width_125">A noter aussi que les techniques d’optimisation requièrent en général de synchroniser tous les GPU à la fin d’un batch.
|
397 |
+
De ce fait, si un GPU est plus lent que les autres (ou est utilisé par un autre processus), le modèle est bridé à la vitesse du GPU le plus lent de l’ensemble. </p>
|
398 |
+
<div class="note"><p>
|
399 |
+
Ayant pré-entraîné notre modèle sur une seule A100 80Go, nous n'avons pas pu expérimenter le parallélisme.</p>
|
400 |
+
</div>
|
401 |
+
<p><br></p>
|
402 |
+
|
403 |
+
<h4 id="les-t-tes-pour-le-finetuning">Les têtes pour le finetuning</h4>
|
404 |
+
<p class="width_125">Nous nous sommes penchés sur les éléments listés ci-dessus dans une optique d’optimiser le pré-entraînement de notre modèle.
|
405 |
+
En pratique, nous devons ensuite le finetuner pour le spécialiser sur les tâches finales qui nous intéresse.
|
406 |
+
Pour cela, nous recourrons à des têtes. Pour le <a class="link" href="https://huggingface.co/docs/transformers/model_doc/t5">T5 « standard »</a>,
|
407 |
+
cinq sont disponibles dans Transformers permettant d’effectuer toutes les tâches faisables :
|
408 |
+
<a class="link" href="https://huggingface.co/docs/transformers/model_doc/t5#transformers.T5ForConditionalGeneration"><code>T5ForConditionalGeneration</code></a>,
|
409 |
+
<a class="link" href="https://huggingface.co/docs/transformers/model_doc/t5#transformers.T5ForSequenceClassification"><code>T5ForSequenceClassification</code></a>,
|
410 |
+
<a class="link" href="https://huggingface.co/docs/transformers/model_doc/t5#transformers.T5ForTokenClassification"><code>T5ForTokenClassification</code></a>,
|
411 |
+
<a class="link" href="https://huggingface.co/docs/transformers/model_doc/t5#transformers.T5ForQuestionAnswering"><code>T5ForQuestionAnswering</code></a>
|
412 |
+
et <a class="link" href="https://huggingface.co/docs/transformers/model_doc/t5#transformers.T5EncoderModel"><code>T5EncoderModel</code></a>.<br><br>
|
413 |
+
Là encore, un travail d’optimisation peut être effectué.<br>
|
414 |
+
Pour la génération conditionnelle, le principal point est de s’assurer d’avoir un processus de génération efficace.<br>
|
415 |
+
Pour les têtes portant sur des tâches de classification (séquence, NER et QA), il faut s’assurer que l’on utilise la partie encodeur
|
416 |
+
du T5 puisque le décodeur n’est pas essentiel pour celles-ci comme le montre l’EncT5 <d-cite bibtex-key="liu2022enct5"></d-cite>.
|
417 |
+
En effet, les poids du décodeur prennent inutilement de la place en mémoire, et le temps d’exécution du code du finetuning est doublé inutilement.<br>
|
418 |
+
La dernière tête sert simplement à ne garder que la partie encodeur d'un modèle encodeur-décodeur. Elle n'a donc pas besoin d'être optimisée.</p>
|
419 |
+
<div class="tip"><p>
|
420 |
+
Concernant la tête <code>ForConditionalGeneration</code>, notre
|
421 |
+
<a class="link" href="https://github.com/catie-aq/flashT5/blob/main/src/model/modeling_flash_t5.py">implémentation</a>
|
422 |
+
repose sur le processus de génération disponible dans le
|
423 |
+
<a class="link" href="https://github.com/PiotrNawrot/nanoT5/blob/1c82d67bf8dea635be68a3b2a68a43b68b665193/nanoT5/utils/t5_model.py#L407">nanoT5</a>
|
424 |
+
car est 14% plus rapide que l’implémentation d’Hugging Face.<br>
|
425 |
+
Concernant les têtes de classification, l’implémentation est disponible dans ce
|
426 |
+
<a class="link" href="https://github.com/catie-aq/flashT5/blob/main/src/model/custom_heads_flash_t5.py">fichier</a>.
|
427 |
+
Il s'agit d'un fichier disjoint du fichier modeling car nos implémentations diffèrent de celles disponibles dans Transformers.
|
428 |
+
En effet, les implémentations des têtes <code>T5ForSequenceClassification</code> et de <code>T5ForQuestionAnswering</code> disponibles dans Transformers reposent
|
429 |
+
sur l’encodeur et le décodeur du T5 ce qui est donc inefficient.
|
430 |
+
Nous avons donc recodé ces deux têtes pour n'utiliser que l'encodeur.
|
431 |
+
Nous avons alors suivi la même structure que la tête <code>T5ForTokenClassification</code> disponible dans Transformers qui,
|
432 |
+
utilise aussi que l'encodeur et donc reprenons telle quelle. </p>
|
433 |
+
</div>
|
434 |
+
|
435 |
+
<p class="width_125"><br><br><br></p>
|
436 |
+
<h2 id="benchmark">Benchmark</h2>
|
437 |
+
|
438 |
+
<h3 id="TFLOPS">TFLOPS</h3>
|
439 |
+
<p class="width_125">
|
440 |
+
Le nombre de TFLOPS (trillions de calculs en virgule flottante qu'un processeur peut effectuer en une seconde) est probablement la mesure la plus parlante
|
441 |
+
pour étayer l'impact des optimisations effectuées.<br>
|
442 |
+
Nous comparons alors quatre approches :<br>
|
443 |
+
• l'implémentation SPDA (Scaled Dot Product Attention) avec full bias,<br>
|
444 |
+
• la même implémentation mais en Triton,<br>
|
445 |
+
• l'implémentation en Flash Attention RPE, c'est-à-dire le second noyau que nous avons développé (peut être vu comme le turboT5 mais en C++/Cuda avec bf16 full),<br>
|
446 |
+
• l'implémentation en Flash Attention i.e. sans biais. Nous l'indiquons pour avoir une référence car elle est inutilisable en pratique pour un T5.<br>
|
447 |
+
<br>
|
448 |
+
Pour la passe avant, nous avons :
|
449 |
+
</p>
|
450 |
+
<p class="width_125">
|
451 |
+
<picture>
|
452 |
+
<source media="(prefers-color-scheme: dark)" srcset="./assets/FWD-causal-True_dark.png" width="100%">
|
453 |
+
<img alt="Benchmark memory backward pass" src="./assets/FWD-causal-True.png" width="100%">
|
454 |
+
</picture>
|
455 |
+
|
456 |
+
<div class="width_125"><p>Pour la passe avant, nous pouvons observer que l'approche en Triton permet 1,34 fois plus de FLOPS que celle en SPDA et que l'approche en Flash Attention RPE permet 1,99 fois plus de FLOPS que celle en SPDA.<br>
|
457 |
+
Nous pouvons aussi constater que notre implémentation en bf16 est équivalente à du fp16 (faisant même mieux en taille 512).<br>
|
458 |
+
C'est suite à ce benchmark que nous avons décidé d'entraîner notre modèle en français en bf16, head_dim = 128 et avec une séquence 1024.</p></div>
|
459 |
+
|
460 |
+
<br>
|
461 |
+
<p class="width_125">
|
462 |
+
Pour la passe arrière, nous avons :
|
463 |
+
</p>
|
464 |
+
|
465 |
+
<p class="width_125">
|
466 |
+
<picture>
|
467 |
+
<source media="(prefers-color-scheme: dark)" srcset="./assets/BWD-causal-True_dark.png" width="100%">
|
468 |
+
<img alt="Benchmark memory backward pass" src="./assets/BWD-causal-True.png" width="100%">
|
469 |
+
</picture>
|
470 |
+
|
471 |
+
<div class="width_125"><p>Pour la passe arrière, l'implémentation en Triton se révèle moins efficace que SPDA avec 0,71 fois les FLOPS de SPDA. Celle en Flash Attention RPE est plus ou moins équivalente à SPDA (1,018 fois plus de FLOPS).<br>
|
472 |
+
Nous pouvons également observer que Triton en head_dim 64 est plus efficace que Triton en head_dim 128.</p></div>
|
473 |
+
|
474 |
+
|
475 |
+
<p><br></p>
|
476 |
+
<h3 id="torchvstriton">Torch vs Triton</h3>
|
477 |
+
<p class="width_125">
|
478 |
+
Nous indiquions plus haut avoir optimisé des parties de l’architecture à l’aide de noyaux Triton ad hoc, à savoir l'entropie croisée et la couche de RMSNorm.
|
479 |
+
Les benchmarks suivants doivent en illustrer la raison.<br>
|
480 |
+
|
481 |
+
Pour l'entropie croisée, nous obtenons une passe avant 7 à 11,4 fois plus rapide, une passe arrière 3,26 à 3,75 plus rapide ainsi qu'une mémoire réduite d'un facteur 4 :</p>
|
482 |
+
|
483 |
+
<p class="width_125">
|
484 |
+
<picture>
|
485 |
+
<source media="(prefers-color-scheme: dark)" srcset="./assets/CE_dark.png" width="100%">
|
486 |
+
<img alt="Benchmark memory backward pass" src="./assets/CE.png" width="100%">
|
487 |
+
</picture>
|
488 |
+
|
489 |
+
<p class="width_125">
|
490 |
+
Pour la couche de RMSNorm, nous obtenons une passe avant 3 à 5 fois plus rapide, une passe arrière 2,33 à 4,33 plus rapide ainsi qu'une mémoire réduite d'un facteur 3,2 :</p>
|
491 |
+
|
492 |
+
<p class="width_125">
|
493 |
+
<picture>
|
494 |
+
<source media="(prefers-color-scheme: dark)" srcset="./assets/LN_dark.png" width="100%">
|
495 |
+
<img alt="Benchmark memory backward pass" src="./assets/LN.png" width="100%">
|
496 |
+
</picture>
|
497 |
+
|
498 |
+
<p class="note">
|
499 |
+
Notez que l'ensemble des graphiques des benchmarks peuvent être générés automatiquement via le code <a href="https://github.com/catie-aq/flashT5/tree/main/benchmarks">suivant</a>.
|
500 |
+
</p>
|
501 |
+
|
502 |
+
<p><br><br></p>
|
503 |
+
<h3 id="mod-le-en-fran-ais">Modèle en français</h3>
|
504 |
+
<p class="width_125">Nous avons appliqué notre travail au français en pré-entraînant un modèle de 147M de paramètres. <br>
|
505 |
+
Le jeu de données que nous avons utilisé est un mélange de CulturaX, Wikipedia, justice_fr et The Stack. <br>
|
506 |
+
Notre <em>tokenizer</em> de taille 32 768 (8**5) est entraîné sur CulturaX et The Stack.<br>
|
507 |
+
Notre modèle est pré-entraîné sur une séquence de 1 024 tokens.</p>
|
508 |
+
|
509 |
+
<p class="width_125">
|
510 |
+
Nous souhaitions comparer les performances de notre modèle face à d'autres modèles en français précédemment publiés comme le CamemBERT <d-cite bibtex-key="Martin_2020"></d-cite> pour les tâches de classification et le BARThez <d-cite bibtex-key="eddine2021barthez"></d-cite> pour les tâches de génération.<br>
|
511 |
+
Pour cela, il nous est paru important de faire des comparaisons à nombre de <i>tokens</i> vus équivalent.
|
512 |
+
Nous avons ainsi essayé d'estimer le nombre de <i>tokens</i> vus par ces deux modèles via la formule nombre de steps × la taille de la séquence × la taille du batch. Nous n'avons pas trouvé les informations dans la publication du BARThez pour le faire. Pour le CamemBERT nous l'estimons à environ 419,4 Mds de <i>tokens</i> au maximum. Ce chiffre pourrait être en réalité moins élevé car nous ne connaissons pas le nombre de <i>tokens</i> de <i>padding</i> vus par ce modèle (là où dans notre cas, nous n'en utilisons pas). Ainsi, nous avons pré-entraîné notre modèle sur le nombre maximal de <i>tokens</i> vus par le CamemBERT.<br></p>
|
513 |
+
|
514 |
+
<p><br></p>
|
515 |
+
|
516 |
+
<p class="width_125">
|
517 |
+
<picture>
|
518 |
+
<source media="(prefers-color-scheme: dark)" srcset="./assets/loss_train.png" width="49%">
|
519 |
+
<img alt="Convergence masked accuracy FAT5" src="./assets/loss_train.png" width="49%">
|
520 |
+
</picture>
|
521 |
+
<picture>
|
522 |
+
<source media="(prefers-color-scheme: dark)" srcset="./assets/loss_eval.png" width="49%">
|
523 |
+
<img alt="Convergence masked accuracy FAT5" src="./assets/loss_eval.png" width="49%">
|
524 |
+
</picture>
|
525 |
+
</p>
|
526 |
+
|
527 |
+
<p><br></p>
|
528 |
+
|
529 |
+
<p class="width_125">
|
530 |
+
Nous nous sommes également intéressés à comparer notre modèle face à lui-même, c'est-à-dire que nous avons évalué ses performances sur les tâches en aval toutes les 100 000 steps (~26 Mds de tokens) au cours du pré-entraînement.<br>
|
531 |
+
Dans le tableau ci-dessous, nous avons listés le nombre de <i>tokens</i> équivalents à chaque intervalle de 100 000 steps.<br>
|
532 |
+
</p>
|
533 |
+
|
534 |
+
<table class="width_125">
|
535 |
+
<thead>
|
536 |
+
<tr>
|
537 |
+
<th>Modèle</th>
|
538 |
+
<th>Nombre de <em>tokens</em> ✝</th>
|
539 |
+
</tr>
|
540 |
+
</thead>
|
541 |
+
<tbody>
|
542 |
+
<tr>
|
543 |
+
<td>FAT5-small-100K</td>
|
544 |
+
<td>26 214 400 000 (100 000 × 1024 × 256)</td>
|
545 |
+
</tr>
|
546 |
+
<tr>
|
547 |
+
<td>FAT5-small-200K</td>
|
548 |
+
<td>52 428 800 000 (200 000 × 1024 × 256)</td>
|
549 |
+
</tr>
|
550 |
+
<tr>
|
551 |
+
<td>FAT5-small-300K</td>
|
552 |
+
<td>78 643 200 000 (300 000 × 1024 × 256)</td>
|
553 |
+
</tr>
|
554 |
+
<tr>
|
555 |
+
<td>FAT5-small-400K</td>
|
556 |
+
<td>104 857 600 000 (400 000 × 1024 × 256)</td>
|
557 |
+
</tr>
|
558 |
+
<tr>
|
559 |
+
<td>FAT5-small-500K</td>
|
560 |
+
<td>131 072 000 000 (500 000 × 1024 × 256)</td>
|
561 |
+
</tr>
|
562 |
+
<tr>
|
563 |
+
<td>FAT5-small-600K</td>
|
564 |
+
<td>157 286 400 000 (600 000 × 1024 × 256)</td>
|
565 |
+
</tr>
|
566 |
+
<tr>
|
567 |
+
<td>FAT5-small-700K</td>
|
568 |
+
<td>183 500 800 000 (700 000 × 1024 × 256)</td>
|
569 |
+
</tr>
|
570 |
+
<tr>
|
571 |
+
<td>FAT5-small-800K</td>
|
572 |
+
<td>209 715 200 000 (800 000 × 1024 × 256)</td>
|
573 |
+
</tr>
|
574 |
+
<tr>
|
575 |
+
<td>FAT5-small-900K</td>
|
576 |
+
<td>235 929 600 000 (900 000 × 1024 × 256)</td>
|
577 |
+
</tr>
|
578 |
+
<tr>
|
579 |
+
<td>FAT5-small-1000K</td>
|
580 |
+
<td>262 144 000 000 (1 000 000 × 1024 × 256)</td>
|
581 |
+
</tr>
|
582 |
+
<tr>
|
583 |
+
<td>FAT5-small-1100K</td>
|
584 |
+
<td>288 358 400 000 (1 100 000× 1024 × 256)</td>
|
585 |
+
</tr>
|
586 |
+
<tr>
|
587 |
+
<td>FAT5-small-1200K</td>
|
588 |
+
<td>314 572 800 000 (1 200 000 × 1024 × 256)</td>
|
589 |
+
</tr>
|
590 |
+
<tr>
|
591 |
+
<td>FAT5-small-1300K</td>
|
592 |
+
<td>340 787 200 000 (1 300 000 × 1024 × 256)</td>
|
593 |
+
</tr>
|
594 |
+
<tr>
|
595 |
+
<td>FAT5-small-1400K</td>
|
596 |
+
<td>367 001 600 000 (1 400 000 × 1024 × 256)</td>
|
597 |
+
</tr>
|
598 |
+
<tr>
|
599 |
+
<td>FAT5-small-1500K</td>
|
600 |
+
<td>393 216 000 000 (1 500 000 × 1024 × 256)</td>
|
601 |
+
</tr>
|
602 |
+
<tr>
|
603 |
+
<td>FAT5-small-1600K</td>
|
604 |
+
<td>419 430 400 000 (1 600 000 × 1024 × 256)</td>
|
605 |
+
</tr>
|
606 |
+
<tr>
|
607 |
+
<td><a class="link" href="https://hf.co/almanach/camembert-base">camembert (base ou large)</a></td>
|
608 |
+
<td>419 430 400 000 (100 000 × 512 × 8192)</td>
|
609 |
+
</tr>
|
610 |
+
</tbody>
|
611 |
+
</table>
|
612 |
+
<p class="width_125">✝ équivaut au nombre de steps × la taille de la séquence × la taille du batch</p>
|
613 |
+
|
614 |
+
|
615 |
+
<p><br></p>
|
616 |
+
<h4 id="finetuning">Finetuning</h4>
|
617 |
+
<p class="width_125">Nous nous sommes focalisés sur cinq tâches :<br>
|
618 |
+
• Du résumé de textes pour illustrer un usage de la tête <code>T5ForConditionalGeneration</code>,<br>
|
619 |
+
• De la classification binaire pour illustrer un usage de la tête <code>T5ForSequenceClassification</code>,<br>
|
620 |
+
• De la reconnaissance d’entités nommées pour illustrer un usage de la tête <code>T5ForTokenClassification</code>,<br>
|
621 |
+
• Du question answering pour illustrer un usage de la tête <code>T5ForQuestionAnswering</code>.<br>
|
622 |
+
• De la <i>sentence similarity</i> pour illustrer un usage de la tête <code>T5EncoderModel</code>.</p>
|
623 |
+
|
624 |
+
<p class="width_125"> Les tâches de classification nous semblent être importantes à évaluer car elles sont généralement ignorées par les benchmarks des grands modèles de langue génératifs alors qu’il de tâches fréquemment utilisées en pratique par les entreprises (recherche documentaire, classification pour d'avis clients, anonymisation de données, etc.).
|
625 |
+
En témoigne sûrement le fait que 6 ans et demi après sa sortie, BERT <d-cite bibtex-key="devlin2019bert"></d-cite> est téléchargé plus de fois par mois à lui seul que les <a class="link" href="https://huggingface.co/models?pipeline_tag=text-generation&sort=downloads">30 modèles de génération de textes</a> les plus téléchargés sur Hugging Face au moment où nous écrivons ces lignes : 38,5M contre 31,3M.</p>
|
626 |
+
|
627 |
+
<p class="width_125">Dans les tableaux suivants, nous soulignons pour le FAT5 la ligne obtenant le meilleur résultat pour chacune des tâches. Nous interprétons les résultats de la partie génération après le tableau sur le résumé de texte. Les résultats sur la partie classification sont interprétés après l'ensemble des tableaux de classification binaire, QA, NER et de <i>sentence-similarity</i>.</p>
|
628 |
+
|
629 |
+
<p><br></p>
|
630 |
+
<h5>Résumé de textes</h5>
|
631 |
+
<p class="width_125">Pour cette tâche, nous avons utilisé le jeu de données <a class="link" href="https://huggingface.co/datasets/orange_sum">orange_sum</a><d-cite bibtex-key="eddine2021barthez"></d-cite>.</p>
|
632 |
+
<table class="width_125">
|
633 |
+
<thead>
|
634 |
+
<tr>
|
635 |
+
<th>Modèle</th>
|
636 |
+
<th>ROUGE-1</th>
|
637 |
+
<th>ROUGE-2</th>
|
638 |
+
<th>ROUGE-L</th>
|
639 |
+
</tr>
|
640 |
+
</thead>
|
641 |
+
<tbody>
|
642 |
+
<tr>
|
643 |
+
<td>FAT5-small-100K (147M)</td>
|
644 |
+
<td>28,17</td>
|
645 |
+
<td>10,60</td>
|
646 |
+
<td>20,62</td>
|
647 |
+
</tr>
|
648 |
+
<tr>
|
649 |
+
<td>FAT5-small-200K (147M)</td>
|
650 |
+
<td>28,72</td>
|
651 |
+
<td>10,86</td>
|
652 |
+
<td>20,68</td>
|
653 |
+
</tr>
|
654 |
+
<tr>
|
655 |
+
<td>FAT5-small-300K (147M)</td>
|
656 |
+
<td>28,76</td>
|
657 |
+
<td>10,85</td>
|
658 |
+
<td>20,63</td>
|
659 |
+
</tr>
|
660 |
+
<tr>
|
661 |
+
<td>FAT5-small-400K (147M)</td>
|
662 |
+
<td>28,59</td>
|
663 |
+
<td>10,76</td>
|
664 |
+
<td>20,60</td>
|
665 |
+
</tr>
|
666 |
+
<tr>
|
667 |
+
<td>FAT5-small-500K (147M)</td>
|
668 |
+
<td>28,98</td>
|
669 |
+
<td>10,97</td>
|
670 |
+
<td>20,72</td>
|
671 |
+
</tr>
|
672 |
+
<tr>
|
673 |
+
<td>FAT5-small-600K (147M)</td>
|
674 |
+
<td>29,04</td>
|
675 |
+
<td>11,20</td>
|
676 |
+
<td>20,89</td>
|
677 |
+
</tr>
|
678 |
+
<tr>
|
679 |
+
<td>FAT5-small-700K (147M)</td>
|
680 |
+
<td>28,72</td>
|
681 |
+
<td>10,87</td>
|
682 |
+
<td>20,77</td>
|
683 |
+
</tr>
|
684 |
+
<tr>
|
685 |
+
<td>FAT5-small-800K (147M)</td>
|
686 |
+
<td>29,00</td>
|
687 |
+
<td>10,91</td>
|
688 |
+
<td>20,78</td>
|
689 |
+
</tr>
|
690 |
+
<tr>
|
691 |
+
<td>FAT5-small-900K (147M)</td>
|
692 |
+
<td>29,30</td>
|
693 |
+
<td>11,34</td>
|
694 |
+
<td>21,22</td>
|
695 |
+
</tr>
|
696 |
+
<tr>
|
697 |
+
<td>FAT5-small-1000K (147M)</td>
|
698 |
+
<td>29,10</td>
|
699 |
+
<td>11,21</td>
|
700 |
+
<td>21,08</td>
|
701 |
+
</tr>
|
702 |
+
<tr>
|
703 |
+
<td>FAT5-small-1100K (147M)</td>
|
704 |
+
<td>29,43</td>
|
705 |
+
<td>11,40</td>
|
706 |
+
<td>21,15</td>
|
707 |
+
</tr>
|
708 |
+
<tr>
|
709 |
+
<td>FAT5-small-1200K (147M)</td>
|
710 |
+
<td>29,30</td>
|
711 |
+
<td>11,38</td>
|
712 |
+
<td>21,18</td>
|
713 |
+
</tr>
|
714 |
+
<tr>
|
715 |
+
<td>FAT5-small-1300K (147M)</td>
|
716 |
+
<td>29,38</td>
|
717 |
+
<td>11,38</td>
|
718 |
+
<td>21,18</td>
|
719 |
+
</tr>
|
720 |
+
<tr>
|
721 |
+
<td>FAT5-small-1400K (147M)</td>
|
722 |
+
<td>29,29</td>
|
723 |
+
<td>11,18</td>
|
724 |
+
<td>21,14</td>
|
725 |
+
</tr>
|
726 |
+
<tr>
|
727 |
+
<td>FAT5-small-1500K (147M)</td>
|
728 |
+
<td><u>29,48</u></td>
|
729 |
+
<td><u>11,48</u></td>
|
730 |
+
<td><u>21,22</u></td>
|
731 |
+
</tr>
|
732 |
+
<tr>
|
733 |
+
<td>FAT5-small-1600K (147M)</td>
|
734 |
+
<td>29,30</td>
|
735 |
+
<td>11,27</td>
|
736 |
+
<td>21,10</td>
|
737 |
+
</tr>
|
738 |
+
<tr>
|
739 |
+
<td><a class="link" href="https://huggingface.co/moussaKam/barthez">Barthez<d-cite bibtex-key="eddine2021barthez"></d-cite></a> (165M)</td>
|
740 |
+
<td>31.44</td>
|
741 |
+
<td>12.77</td>
|
742 |
+
<td>22.23</td>
|
743 |
+
</tr>
|
744 |
+
<tr>
|
745 |
+
<td><a class="link" href="https://huggingface.co/moussaKam/mbarthez">mBarthez</a> (458M)</td>
|
746 |
+
<td>32.67</td>
|
747 |
+
<td>13.73</td>
|
748 |
+
<td>23.18</td>
|
749 |
+
</tr>
|
750 |
+
</tbody>
|
751 |
+
</table>
|
752 |
+
|
753 |
+
<p><br></p>
|
754 |
+
<p class="width_125">Nous pouvons constater que notre modèle performe moins bien que le Barthez. Nous pouvons émettre quelques hypothèses à ce sujet. <br>
|
755 |
+
Premièrement, il est vraisemblable que notre processus de génération de texte ne soit pas optimal. Ne connaissant pas celui utilisé par le Barthez, nous avons simplement recouru aux paramètres par défaut de la fonction <a class="link" href="https://github.com/huggingface/transformers/blob/241c04d36867259cdf11dbb4e9d9a60f9cb65ebc/src/transformers/generation/utils.py#L1905">generate</a> de Hugging Face pour ne pas avantager notre modèle avec un processus de génération qui serait plus sophistiqué.<br>
|
756 |
+
Deuxièmement, nous n'avons pas utilisé de <i>prompt</i> pour conditionner la génération, ce qui aurait pu bénéficier à notre modèle puisque le T5 est le modèle ayant introduit ce système.<br>
|
757 |
+
Troisièmement, le Barthez a sûrement vu plus de <i>tokens</i> que notre modèle. Bien que nous n'arrivons pas à déterminer ce nombre d'après la publication des auteurs, il est indiqué que c'est un modèle BART <d-cite bibtex-key="lewis2019bartdenoisingsequencetosequencepretraining"></d-cite> qui a reçu un pré-entraînement supplémentaire sur du français. Or dans le papier de BART, il est indiqué que le modèle a été entraîné sur 500000 steps × une séquence de 1 024 <i>tokens</i> × un batch de taille 8000, soit 4 096 000 000 000 <i>tokens</i>, ce qui 9,76 fois plus que notre modèle.
|
758 |
+
</p>
|
759 |
+
|
760 |
+
<p><br></p>
|
761 |
+
<h5 id="classification">Classification</h5>
|
762 |
+
<p class="width_125">Nous utilisons une version nettoyée du jeu de données allocine <d-cite bibtex-key="allocine"></d-cite> : <a class="link" href="https://huggingface.co/datasets/CATIE-AQ/allocine_clean">allocine_clean</a>. Plus précisément 0,6 % de l'échantillon de test n’était pas fiable car contenait des fuites ou des données dupliquées. Il est probable que le jeu de données obtenu soit encore imparfait avec notamment des problèmes d'annotations nécessitant un travail de relecture/correction plus important.
|
763 |
+
</p>
|
764 |
+
<table class="width_125">
|
765 |
+
<thead>
|
766 |
+
<tr>
|
767 |
+
<th>Modèle</th>
|
768 |
+
<th>Accuracy</th>
|
769 |
+
</tr>
|
770 |
+
</thead>
|
771 |
+
<tbody>
|
772 |
+
<tr>
|
773 |
+
<td>FAT5-small-100K (67,4M)</td>
|
774 |
+
<td>96,05</td>
|
775 |
+
</tr>
|
776 |
+
<tr>
|
777 |
+
<td>FAT5-small-200K (67,4M)</td>
|
778 |
+
<td>96,20</td>
|
779 |
+
</tr>
|
780 |
+
<tr>
|
781 |
+
<td>FAT5-small-300K (67,4M)</td>
|
782 |
+
<td>96,48</td>
|
783 |
+
</tr>
|
784 |
+
<tr>
|
785 |
+
<td>FAT5-small-400K (67,4M)</td>
|
786 |
+
<td>96,60</td>
|
787 |
+
</tr>
|
788 |
+
<tr>
|
789 |
+
<td>FAT5-small-500K (67,4M)</td>
|
790 |
+
<td>96,60</td>
|
791 |
+
</tr>
|
792 |
+
<tr>
|
793 |
+
<td>FAT5-small-600K (67,4M)</td>
|
794 |
+
<td>96,60</td>
|
795 |
+
</tr>
|
796 |
+
<tr>
|
797 |
+
<td>FAT5-small-700K (67,4M)</td>
|
798 |
+
<td>96,68</td>
|
799 |
+
</tr>
|
800 |
+
<tr>
|
801 |
+
<td>FAT5-small-800K (67,4M)</td>
|
802 |
+
<td>96,59</td>
|
803 |
+
</tr>
|
804 |
+
<tr>
|
805 |
+
<td>FAT5-small-900K (67,4M)</td>
|
806 |
+
<td><u>96,75</u></td>
|
807 |
+
</tr>
|
808 |
+
<tr>
|
809 |
+
<td>FAT5-small-1000K (67,4M)</td>
|
810 |
+
<td>96,62</td>
|
811 |
+
</tr>
|
812 |
+
<tr>
|
813 |
+
<td>FAT5-small-1100K (67,4M)</td>
|
814 |
+
<td>96,69</td>
|
815 |
+
</tr>
|
816 |
+
<tr>
|
817 |
+
<td>FAT5-small-1200K (67,4M)</td>
|
818 |
+
<td>96,71</td>
|
819 |
+
</tr>
|
820 |
+
<tr>
|
821 |
+
<td>FAT5-small-1300K (67,4M)</td>
|
822 |
+
<td>96,69</td>
|
823 |
+
</tr>
|
824 |
+
<tr>
|
825 |
+
<td>FAT5-small-1400K (67,4M)</td>
|
826 |
+
<td>96,65</td>
|
827 |
+
</tr>
|
828 |
+
<tr>
|
829 |
+
<td>FAT5-small-1500K (67,4M)</td>
|
830 |
+
<td>96,57</td>
|
831 |
+
</tr>
|
832 |
+
<tr>
|
833 |
+
<td>FAT5-small-1600K (67,4M)</td>
|
834 |
+
<td>96,69</td>
|
835 |
+
</tr>
|
836 |
+
<tr>
|
837 |
+
<td><a class="link" href="">distilcamembert</a> (68,1M)</td>
|
838 |
+
<td>96,74</td>
|
839 |
+
</tr>
|
840 |
+
<tr>
|
841 |
+
<td><a class="link" href="https://huggingface.co/bourdoiscatie/camembert_base_cls">camembert-base</a> (111M)</td>
|
842 |
+
<td>97,27</td>
|
843 |
+
</tr>
|
844 |
+
<tr>
|
845 |
+
<td><a class="link" href="https://huggingface.co/bourdoiscatie/camembert_large_cls">camembert-large</a> (337M)</td>
|
846 |
+
<td>97,15</td>
|
847 |
+
</tr>
|
848 |
+
<tr>
|
849 |
+
</tbody>
|
850 |
+
</table>
|
851 |
+
<p class="width_125">Note : dans le tableau et dans les suivants, distilcamembert se réfère au <a class="link" href="https://huggingface.co/cmarkea/distilcamembert-base">distilcamembert-base</a> <d-cite bibtex-key="delestre2022distilcamembert"></d-cite> que nous avons finetuné.</p>
|
852 |
+
|
853 |
+
<p><br></p>
|
854 |
+
<h5>Reconnaissance d’entités nommées</h5>
|
855 |
+
<p class="width_125">Pour cette tâche, nous avons utilisé frenchNER dans sa configuration <a class="link" href="https://huggingface.co/datasets/CATIE-AQ/frenchNER_4entities">4 entités</a> (PER, LOC, ORG, MISC) <d-cite bibtex-key="frenchNER2024"></d-cite>.</p>
|
856 |
+
<table class="width_125">
|
857 |
+
<thead>
|
858 |
+
<tr>
|
859 |
+
<th>Modèle</th>
|
860 |
+
<th>F1 PER</th>
|
861 |
+
<th>F1 LOC</th>
|
862 |
+
<th>F1 ORG</th>
|
863 |
+
<th>F1 MISC</th>
|
864 |
+
</tr>
|
865 |
+
</thead>
|
866 |
+
<tbody>
|
867 |
+
<tr>
|
868 |
+
<td>FAT5-small-100K (67,1M)</td>
|
869 |
+
<td>96,51</td>
|
870 |
+
<td>94,48</td>
|
871 |
+
<td>87,24</td>
|
872 |
+
<td>75,81</td>
|
873 |
+
</tr>
|
874 |
+
<tr>
|
875 |
+
<td>FAT5-small-200K (67,1M)</td>
|
876 |
+
<td>96,90</td>
|
877 |
+
<td>94,83</td>
|
878 |
+
<td>88,78</td>
|
879 |
+
<td>76,82</td>
|
880 |
+
</tr>
|
881 |
+
<tr>
|
882 |
+
<td>FAT5-small-300K (67,1M)</td>
|
883 |
+
<td>97,25</td>
|
884 |
+
<td>95,11</td>
|
885 |
+
<td>88,86</td>
|
886 |
+
<td><u>77,48</u></td>
|
887 |
+
</tr>
|
888 |
+
<tr>
|
889 |
+
<td>FAT5-small-400K (67,1M)</td>
|
890 |
+
<td>97,18</td>
|
891 |
+
<td>95,08</td>
|
892 |
+
<td>89,11</td>
|
893 |
+
<td>77,42</td>
|
894 |
+
</tr>
|
895 |
+
<tr>
|
896 |
+
<td>FAT5-small-500K (67,1M)</td>
|
897 |
+
<td>97,25</td>
|
898 |
+
<td>95,16</td>
|
899 |
+
<td>89,16</td>
|
900 |
+
<td>76,91</td>
|
901 |
+
</tr>
|
902 |
+
<tr>
|
903 |
+
<td>FAT5-small-600K (67,1M)</td>
|
904 |
+
<td>97,19</td>
|
905 |
+
<td>95,19</td>
|
906 |
+
<td>88,85</td>
|
907 |
+
<td>76,88</td>
|
908 |
+
</tr>
|
909 |
+
<tr>
|
910 |
+
<td>FAT5-small-700K (67,1M)</td>
|
911 |
+
<td>97,17</td>
|
912 |
+
<td>95,14</td>
|
913 |
+
<td>89,39</td>
|
914 |
+
<td>76,82</td>
|
915 |
+
</tr>
|
916 |
+
<tr>
|
917 |
+
<td>FAT5-small-800K (67,1M)</td>
|
918 |
+
<td><u>97,34</u></td>
|
919 |
+
<td>95,20</td>
|
920 |
+
<td>89,18</td>
|
921 |
+
<td>77,27</td>
|
922 |
+
</tr>
|
923 |
+
<tr>
|
924 |
+
<td>FAT5-small-900K (67,1M)</td>
|
925 |
+
<td>97,19</td>
|
926 |
+
<td>95,21</td>
|
927 |
+
<td>89,04</td>
|
928 |
+
<td>76,83</td>
|
929 |
+
</tr>
|
930 |
+
<tr>
|
931 |
+
<td>FAT5-small-1000K (67,1M)</td>
|
932 |
+
<td>97,31</td>
|
933 |
+
<td>95,26</td>
|
934 |
+
<td>89,24</td>
|
935 |
+
<td>76,84</td>
|
936 |
+
</tr>
|
937 |
+
<tr>
|
938 |
+
<td>FAT5-small-1100K (67,1M)</td>
|
939 |
+
<td>97,11</td>
|
940 |
+
<td>94,99</td>
|
941 |
+
<td>88,52</td>
|
942 |
+
<td>76,30</td>
|
943 |
+
</tr>
|
944 |
+
<tr>
|
945 |
+
<td>FAT5-small-1200K (67,1M)</td>
|
946 |
+
<td>97,19</td>
|
947 |
+
<td>95,11</td>
|
948 |
+
<td>88,79</td>
|
949 |
+
<td>76,86</td>
|
950 |
+
</tr>
|
951 |
+
<tr>
|
952 |
+
<td>FAT5-small-1300K (67,1M)</td>
|
953 |
+
<td>97,15</td>
|
954 |
+
<td>95,00</td>
|
955 |
+
<td>88,62</td>
|
956 |
+
<td>76,58</td>
|
957 |
+
</tr>
|
958 |
+
<tr>
|
959 |
+
<td>FAT5-small-1400K (67,1M)</td>
|
960 |
+
<td>97,22</td>
|
961 |
+
<td>95,09</td>
|
962 |
+
<td>89,01</td>
|
963 |
+
<td>77,00</td>
|
964 |
+
</tr>
|
965 |
+
<tr>
|
966 |
+
<td>FAT5-small-1500K (67,1M)</td>
|
967 |
+
<td>97,32</td>
|
968 |
+
<td><u>95,34</u></td>
|
969 |
+
<td><u>89,39</u></td>
|
970 |
+
<td>77,30</td>
|
971 |
+
</tr>
|
972 |
+
<tr>
|
973 |
+
<td>FAT5-small-1600K (67,1M)</td>
|
974 |
+
<td>97,14</td>
|
975 |
+
<td>95,22</td>
|
976 |
+
<td>89,24</td>
|
977 |
+
<td>76,88</td>
|
978 |
+
</tr>
|
979 |
+
<tr>
|
980 |
+
<td><a class="link" href="">distilcamembert</a> (67,5M)</td>
|
981 |
+
<td>97,26</td>
|
982 |
+
<td>95,24</td>
|
983 |
+
<td>89,10</td>
|
984 |
+
<td>79,88</td>
|
985 |
+
</tr>
|
986 |
+
<tr>
|
987 |
+
<td><a class="link" href="https://huggingface.co/CATIE-AQ/NERmembert-base-4entities">camembert-base</a> (110M)</td>
|
988 |
+
<td>97,80</td>
|
989 |
+
<td>95,78</td>
|
990 |
+
<td>90,27</td>
|
991 |
+
<td>81,38</td>
|
992 |
+
</tr>
|
993 |
+
<tr>
|
994 |
+
<td><a class="link" href="https://huggingface.co/CATIE-AQ/NERmembert-large-4entities">camembert-large</a> (336M)</td>
|
995 |
+
<td>98,17</td>
|
996 |
+
<td>96,37</td>
|
997 |
+
<td>91,87</td>
|
998 |
+
<td>83,35</td>
|
999 |
+
</tr>
|
1000 |
+
</tbody>
|
1001 |
+
</table>
|
1002 |
+
|
1003 |
+
<p><br></p>
|
1004 |
+
<h5 id="question-answering">Question Answering</h5>
|
1005 |
+
<p class="width_125">
|
1006 |
+
Nous avons voulu finetuner notre modèle sur cette tâche mais nous nous sommes rendu compte que notre tokenizer a deux problèmes.<br>
|
1007 |
+
Premièrement, nous avons oublié d'ajouter le token de début de phrase.
|
1008 |
+
Deuxièmement, nous avons décidé d'utiliser un fast BPE tokenizer. Nous avons appris après coup que l'argument `add_special_tokens=True` ne fonctionne pas avec ce type de tokenizer.
|
1009 |
+
Corriger ces deux points nécessite de post-traiter les encodages du tokenizer avant d'effectuer notre tâche de finetuning ce qui n'est pas élégant et nécessite du temps que nous n'avons pas dans l'immédiat.
|
1010 |
+
<p><br></p>
|
1011 |
+
|
1012 |
+
<h5><i>Sentence Similarity</i></h5>
|
1013 |
+
<p class="width_125">
|
1014 |
+
Nous invitons le lecteur à prendre les résultats de cette section avec des pincettes.<br>
|
1015 |
+
Nous avons effectué un finetuning sur cette tâche afin de vérifier que la tête <code>T5EncoderModel</code> fonctionnait
|
1016 |
+
mais nous ne nous focalisons pas sur les résultats obtenus car nous nous interrogeons sur la qualité du benchmark sur lequel nous évaluons les modèles,
|
1017 |
+
à savoir MTEB FR <d-cite bibtex-key="ciancone2024mtebfrenchresourcesfrenchsentence"></d-cite>, une version française de MTEB.<br>
|
1018 |
+
|
1019 |
+
En effet, Nils Reimers, créateur du MTEB, a récemment remis en cause dans un <a class="link" href="https://x.com/Nils_Reimers/status/1870812625505849849">tweet</a>
|
1020 |
+
la pertinence de ce benchmark, le déclarant « mort ».
|
1021 |
+
|
1022 |
+
Plus tôt dans l'année, nous avions d'ailleurs observé des fuites de données et des duplications dans ce benchmark
|
1023 |
+
(voir <a class="link" href="https://huggingface.co/datasets/lbourdois/MTEB_leaks_and_duplications">ici</a> et
|
1024 |
+
<a class="link" href="https://github.com/embeddings-benchmark/mteb/issues/1036">ici</a>).
|
1025 |
+
Alexey Vatolin a ensuite étendu ces observations en prenant également en compte les lignes vides (voir <a class="link" href="https://github.com/embeddings-benchmark/mteb/issues/1049#issuecomment-2463095122">ici</a>).
|
1026 |
+
<br>
|
1027 |
+
|
1028 |
+
Dans le tableau ci-dessous, nous finetunons sur une version nettoyée du jeu de données <code>stsb_multi_mt</code> <d-cite bibtex-key="huggingface:dataset:stsb_multi_mt"></d-cite> (0,653 % du test split n'était pas fiable parce qu'il contenait des fuites ou des données dupliquées) avant d'évaluer sur MTEB FR.
|
1029 |
+
<br>
|
1030 |
+
</p>
|
1031 |
+
|
1032 |
+
|
1033 |
+
<table class="width_125">
|
1034 |
+
<thead>
|
1035 |
+
<tr>
|
1036 |
+
<th>Modèle</th>
|
1037 |
+
<th>Moyenne</th>
|
1038 |
+
<th>Classification</th>
|
1039 |
+
<th>Clustering</th>
|
1040 |
+
<th>PairClassification</th>
|
1041 |
+
<th>Reranking</th>
|
1042 |
+
<th>Retrieval</th>
|
1043 |
+
<th>STS</th>
|
1044 |
+
<th>Summary</th>
|
1045 |
+
</tr>
|
1046 |
+
</thead>
|
1047 |
+
<tbody>
|
1048 |
+
<tr>
|
1049 |
+
<td>FAT5-small-400K (67,1M)</td>
|
1050 |
+
<td>52,2</td>
|
1051 |
+
<td>59,8</td>
|
1052 |
+
<td>39,1</td>
|
1053 |
+
<td>77,5</td>
|
1054 |
+
<td>56,1</td>
|
1055 |
+
<td>29,1</td>
|
1056 |
+
<td>74</td>
|
1057 |
+
<td>29,8</td>
|
1058 |
+
</tr>
|
1059 |
+
<tr>
|
1060 |
+
<td>distilcamembert(68,1M)</td>
|
1061 |
+
<td>51,3</td>
|
1062 |
+
<td>60,7</td>
|
1063 |
+
<td>37,4</td>
|
1064 |
+
<td>77</td>
|
1065 |
+
<td>51,1</td>
|
1066 |
+
<td>25,2</td>
|
1067 |
+
<td>76,4</td>
|
1068 |
+
<td>31,3</td>
|
1069 |
+
</tr>
|
1070 |
+
</tbody>
|
1071 |
+
</table>
|
1072 |
+
|
1073 |
+
<p><br><br><br></p>
|
1074 |
+
|
1075 |
+
<p class="width_125">
|
1076 |
+
Nous observons dans le graphique de la convergence de la <i>masked accuracy</i>, que les performances de la partie encodeur du modèle progressent dans un premier temps avant de s'aplatir.
|
1077 |
+
</p>
|
1078 |
+
<p><br></p>
|
1079 |
+
|
1080 |
+
<p class="width_125">
|
1081 |
+
<picture>
|
1082 |
+
<source media="(prefers-color-scheme: dark)" srcset="./assets/convergence_masked_accuracy_FAT5.png" width="100%">
|
1083 |
+
<img alt="Convergence masked accuracy FAT5" src="./assets/convergence_masked_accuracy_FAT5.png" width="100%">
|
1084 |
+
</picture>
|
1085 |
+
</p>
|
1086 |
+
|
1087 |
+
<p><br></p>
|
1088 |
+
|
1089 |
+
<p class="width_125">
|
1090 |
+
Ce phénomène s'observe aussi dans les résultats des finetunings, le FAT5 match les performances du distilcamembert aux alentours de 800 ou 900K steps (à l'exception de l'entité MISC pour la NER) mais ne fait pas mieux au-delà. Cela est néanmoins encourageant en vue d'un passage à l'échelle puisque les modèles distillés issus de modèles plus importants donnent habituellement de meilleurs résultats que les modèles entraînés de zéro.<br>
|
1091 |
+
Notons que cette forme de plateau dans les performances serait à confirmer en effectuant plusieurs exécutions avec des configurations différentes (au niveau de la <i>seed</i> notamment) pour proposer des résultats sous la forme d'un intervalle au lieu d'un résultat unique (pour chaque step évaluée, nous utilisons une <i>seed</i> de 42).<br>
|
1092 |
+
Signalons également que ce plafonnement pour la partie encodeur a déjà été observé par d'autres auteurs. On peut par exemple citer le CamemBERT(a) 2.0 <d-cite bibtex-key="antoun2024camembert20smarterfrench"></d-cite> qui a également été entraîné sur la partie en français de CulturaX. Le CamemBERT 2.0 n'apparaît pas plus performant que le CamemBERT 1.0 alors qu'il a vu davantage de <i>tokens</i>. Les auteurs obtiennent par contre des gains de performances avec le CamemBERTa 2.0, suggérant ainsi que pour les encodeurs, l'importance est de se focaliser en priorité sur l'architecture (le CamemBERTa 2.0 est un DeBERTaV3 <d-cite bibtex-key="he2023debertav3improvingdebertausing"></d-cite> alors que le CamemBERT 2.0 est un RoBERTa <d-cite bibtex-key="liu2019robertarobustlyoptimizedbert"></d-cite>) plutôt que sur les données. Ce résultat nous invite à réfléchir à une actualisation de l'encodeur du T5.<br>
|
1093 |
+
Une dernière observation pouvant être faite, est que si les performances plafonnent, il est possible de se permettre de stopper le pré-entraînement plus tôt et donc réduire les coûts.<br>
|
1094 |
+
|
1095 |
+
Dans le tableau ci-dessous, nous listons des estimations de coûts (en euros) pour le pré-entraînement de notre modèle selon divers <i>cloud providers</i>.
|
1096 |
+
Pour chacun d'eux, nous nous basons sur le prix horaire d'une A 100 80GB proposé le 20 décembre 2024.<br>
|
1097 |
+
Nous indiquons deux cas, un pré-entraînement sur 262 Mds de <i>tokens</i> (seuil où on observe que les performances sur les tâches de classifications commencent à plafonner et que les gains marginaux deviennent alors faibles) sur 419 Mds de <i>tokens</i> (le nombre de <i>tokens</i> vus au maximum par le CamemBERT).
|
1098 |
+
<br>
|
1099 |
+
</p>
|
1100 |
+
|
1101 |
+
<table class="width_125">
|
1102 |
+
<thead>
|
1103 |
+
<tr>
|
1104 |
+
<th>Cloud provider</th>
|
1105 |
+
<th>Prix horaire d'une A 100</th>
|
1106 |
+
<th>Prix pour 262 Mds de tokens</th>
|
1107 |
+
<th>Prix pour 419 Mds de tokens</th>
|
1108 |
+
<th>Note</th>
|
1109 |
+
</tr>
|
1110 |
+
</thead>
|
1111 |
+
<tbody>
|
1112 |
+
<tr>
|
1113 |
+
<td>AWS</td>
|
1114 |
+
<td>1,77</td>
|
1115 |
+
<td>1 616</td>
|
1116 |
+
<td>2 586</td>
|
1117 |
+
<td></td>
|
1118 |
+
</tr>
|
1119 |
+
<tr>
|
1120 |
+
<td>OVH</td>
|
1121 |
+
<td>2,75</td>
|
1122 |
+
<td>2 475</td>
|
1123 |
+
<td>3 960</td>
|
1124 |
+
<td>En optant pour un payement mensuel plutôt qu'horaire, le prix dans les deux cas n'est plus que de 2 200€.</td>
|
1125 |
+
</tr>
|
1126 |
+
<tr>
|
1127 |
+
<td>Azure</td>
|
1128 |
+
<td>3,31</td>
|
1129 |
+
<td>3 021</td>
|
1130 |
+
<td>4 833</td>
|
1131 |
+
<td>Le prix horaire a été calculé à partir du prix mensuel de 8 A100.</td>
|
1132 |
+
</tr>
|
1133 |
+
<tr>
|
1134 |
+
<td>Google Cloud</td>
|
1135 |
+
<td>3,52</td>
|
1136 |
+
<td>3 214</td>
|
1137 |
+
<td>5 143</td>
|
1138 |
+
<td></td>
|
1139 |
+
</tr>
|
1140 |
+
</tbody>
|
1141 |
+
</table>
|
1142 |
+
|
1143 |
+
|
1144 |
+
|
1145 |
+
<br><br>
|
1146 |
+
|
1147 |
+
|
1148 |
+
<p><br><br></p>
|
1149 |
+
<h4>Temps et émissions par pré-entraînement</h4>
|
1150 |
+
<p class="width_125">Les émissions carbones ont été estimées à l’aide du <a class="link" href="https://mlco2.github.io/impact#compute">Machine Learning Impact calculator</a> <d-cite bibtex-key="lacoste2019quantifying"></d-cite>.<br>
|
1151 |
+
Notre modèle a été pré-entraîné sur une A100 PCIe 80GB, sur une infrastructure privée.
|
1152 |
+
Pour l'efficacité carbone, nous nous sommes basés sur les chiffres journaliers indiqués
|
1153 |
+
par <a class="link" href="https://app.electricitymaps.com/zone/FR">electricitymaps</a> pour la France lors de la période de notre pré-entraînement.<br>
|
1154 |
+
Les finetunings ont été effectués pour leur part sur une A100 PCIe 40GB.
|
1155 |
+
Le temps d’exécution se comptant généralement en heures voire en minutes, pour l’efficacité carbone nous nous référons alors au chiffre d’electricitymaps indiqué pour l’heure en question plutôt que pour le chiffre journalier.<br>
|
1156 |
+
Nous estimons ainsi les émissions de notre modèle à 14,084 kg eq. CO2,
|
1157 |
+
dont 13,5 kg eq. CO2 pour le pré-entraînement et 0,584 kg eq. CO2 pour les 49 finetunings.<br>
|
1158 |
+
À ce chiffre, nous devons ajouter des émissions supplémentaires estimées à 6,24 kg eq. CO2.
|
1159 |
+
Elles correspondent au finetuning de modèles pour établir les baselines auxquelles se comparer (0,475 kg eq. CO2), à nos travaux préliminaires en bf16 mixed (4,735 kg eq. CO2 pour le pré-entraînement de trois modèles différents sur 300K steps) et à des tests en bf16 full avant l'entraînement de notre modèle final (1,03 kg eq. en pré-entraînement d'un modèle deux fois plus petit sur 400K steps).<br>
|
1160 |
+
Ainsi, au total, nous estimons l’empreinte carbone de nos travaux à 20,324 kg eq. CO2. </p>
|
1161 |
+
|
1162 |
+
<p class="width_125">Sur la phase de pré-entraînement (nous n’avons pas assez d’informations pour faire des estimations pour les autres phases),
|
1163 |
+
il est alors possible de nous situer vis-à-vis des autres modèles en français pré-entraînés listés précédemment : </p>
|
1164 |
+
<table class="width_125">
|
1165 |
+
<thead>
|
1166 |
+
<tr>
|
1167 |
+
<th>Modèle</th>
|
1168 |
+
<th>Temps (H)</th>
|
1169 |
+
<th>Emissions (kg Co2 eq)</th>
|
1170 |
+
<th>Note</th>
|
1171 |
+
</tr>
|
1172 |
+
</thead>
|
1173 |
+
<tbody>
|
1174 |
+
<tr>
|
1175 |
+
<td>Camembert</td>
|
1176 |
+
<td>6 144</td>
|
1177 |
+
<td>106,91 ✝</td>
|
1178 |
+
<td>24H × 256 Tesla V100-SXM2-32GB à 58g (moyenne sur 2019) <br>Les auteurs ne précisent pas les chiffres pour la version large</td>
|
1179 |
+
</tr>
|
1180 |
+
<tr>
|
1181 |
+
<td>Flaubert base <d-cite bibtex-key="le2020flaubert"></d-cite></td>
|
1182 |
+
<td>13 120</td>
|
1183 |
+
<td>190,24 à 228,29 ✝</td>
|
1184 |
+
<td>410H × 32 V100 à 58g (moyenne sur 2019) <br>Le type de la V100 n’est pas spécifié<br>(V100-SXM2-32GB ? V100-SXM2-16GB ? V100-PCIE-16GB ?)</td>
|
1185 |
+
</tr>
|
1186 |
+
<tr>
|
1187 |
+
<td>Flaubert large <d-cite bibtex-key="le2020flaubert"></d-cite></td>
|
1188 |
+
<td>49 920</td>
|
1189 |
+
<td>723,84 à 868,61 ✝</td>
|
1190 |
+
<td>390H × 128 V100 à 58g (moyenne sur 2019) <br>Le type de la V100 n’est pas spécifié<br>(V100-SXM2-32GB ? V100-SXM2-16GB ? V100-PCIE-16GB ?)</td>
|
1191 |
+
</tr>
|
1192 |
+
<tr>
|
1193 |
+
<td>Barthez</td>
|
1194 |
+
<td>7 680 ★</td>
|
1195 |
+
<td>107,52 à 129,02 ✝</td>
|
1196 |
+
<td>60H × 128 V100 à 56g (moyenne sur 2020) <br>Le type de la V100 n’est pas spécifié<br>(V100-SXM2-32GB ? V100-SXM2-16GB ? V100-PCIE-16GB ?)</td>
|
1197 |
+
</tr>
|
1198 |
+
<tr>
|
1199 |
+
<td>FAT5-small</td>
|
1200 |
+
<td>1 461</td>
|
1201 |
+
<td>13,5</td>
|
1202 |
+
<td>1 461H × 1 A100 à 36,96 g (moyenne entre le 18/10/2024 et le 19/12/2024)</td>
|
1203 |
+
</tr>
|
1204 |
+
</tbody>
|
1205 |
+
</table>
|
1206 |
+
<p class="width_125">✝ les chiffres indiqués sont des estimations à partir des informations fournies par les auteurs dans leur publication<br>
|
1207 |
+
★ nous indiquons uniquement les heures pour le pré-entraînement en français appliqué par dessus le pré-entraînement en anglais initial sur lequel se base le modèle</p>
|
1208 |
+
|
1209 |
+
<p><br></p>
|
1210 |
+
|
1211 |
+
<h3 id="mod-les-en-anglais">Modèles dans d'autres langues</h3>
|
1212 |
+
<p class="width_125">
|
1213 |
+
Notre contribution se focalise sur le français avec l'introduction d'un nouveau modèle. Pour d'autres langues, nous ne pouvons pas nous permettre d’effectuer un travail de la même envergure.<br>
|
1214 |
+
Néanmoins, nous mettons à disposition un <a class="link" href="https://github.com/catie-aq/flashT5/blob/main/convert_huggingface_t5.py">code</a> permettant d'adapter vers notre méthode des poids de (m)T5/FLAN-T5 <d-cite bibtex-key="chung2022scaling"></d-cite> déjà pré-entraînés. Nous espérons ainsi que les utilisateurs pourront poursuivre efficacement le pré-entraînement d'un de ces modèles pour l'adapter à des données plus récentes par exemple.<br>
|
1215 |
+
Notez cependant que cette adaptation est limitée puisque le pré-entraînement supplémentaire devra être effectué dans la précision du modèle original. Par exemple, si les poids du modèle sont en fp32 (ce qui est le cas du FLAN-T5), l'entraînement ne sera pas aussi rapide que le FAT5 qui est en bf16.<br><br>
|
1216 |
+
|
1217 |
+
Pour les anglophones, nous avons déjà adapté les poids des différentes versions du FLAN-T5 à notre méthode. Tous les poids peuvent être trouvés dans cette
|
1218 |
+
<a class="link" href="https://huggingface.co/collections/CATIE-AQ/catie-english-fat5-flan-662b679a8e855c7c0137d69e">collection Hugging Face</a>.<br><br>
|
1219 |
+
|
1220 |
+
Si vous souhaitez pré-entraîner votre propre modèle (pour être spécialisé dans un domaine spécifique par exemple, et ainsi bénéficier d'un <i>tokenizer</i> personnalisé), nous vous renvoyons à nouveau vers le <a class="link" href="https://github.com/catie-aq/flashT5/tree/main/examples/minipile">tutoriel</a> indiquant comment procéder pour pré-entraîner un modèle sur minipile. Notez que nous avons testé et entraîné le modèle du tutoriel sur une A100, cela peut ou non fonctionner avec d'autres GPU.</p>
|
1221 |
+
<p class="width_125"><br><br><br></p>
|
1222 |
+
|
1223 |
+
|
1224 |
+
<h2 id="la-suite">La suite</h2>
|
1225 |
+
<p class="width_125">Terminons cet article en évoquant ce que nous comptons, ou du moins aimerions, donner comme suite à ce travail.<br></p>
|
1226 |
+
|
1227 |
+
<h3>À court terme</h3>
|
1228 |
+
<p class="width_125">Il s'agit ici de choses qui auraient déjà dû être présentes dans cet article mais qui ont pris plus de temps que prévu.
|
1229 |
+
Typiquement, nous avons terminé la conception des jeux de données mais n'avons pas eu le temps d'effectuer les finetunings.<br>
|
1230 |
+
L'objectif est d'effectuer ces tâches prochainement pour pouvoir ajouter les résultats obtenus dans une actualisation de cet article de blog.
|
1231 |
+
</p>
|
1232 |
+
|
1233 |
+
<h4>Corriger le tokenizer</h4>
|
1234 |
+
<p class="width_125">
|
1235 |
+
Le FAT5 actuel est utilisable. Néanmoins, du fait des problèmes avec le <i>tokenizer</i> entraînant des post-traîtement inélégant pour certaines tâches, nous n'excluons pas de ré-entraîner un modèle (sur 1M de steps seulement) avec un nouveau <i>tokenizer</i> permettant un usage plus simple du modèle.
|
1236 |
+
<br><br></p>
|
1237 |
+
|
1238 |
+
<h4>Modèle instruct</h4>
|
1239 |
+
<p class="width_125">Nous souhaiterions tester les capacités de génération de textes du FAT5 de façon plus optimale via notamment l'usage de <i>prompts</i> en développant un modèle instruct.<br>
|
1240 |
+
Pour cela, nous disposons du <a class="link" href="https://huggingface.co/datasets/CATIE-AQ/DFP">DFP</a> (<i>Dataset of French Prompts</i>) <d-cite bibtex-key="centre_aquitain_des_technologies_de_l'information_et_electroniques_2023"></d-cite>, un jeu de données de plus de 100M de lignes portant sur trente tâches de NLP. Il reprend la méthodologie du jeu de données <a class="link" href="https://huggingface.co/datasets/bigscience/xP3">xP3</a> ayant servi au mT0 <d-cite bibtex-key="muennighoff2023crosslingualgeneralizationmultitaskfinetuning"></d-cite>. Nous pourrions à cette occasion également vérifier le "Finding 2" de BigScience <d-cite bibtex-key="wang2022languagemodelarchitecturepretraining"></d-cite> (page 9 de la publication) indiquant que les modèles encodeur-décodeur auraient de meilleures capacités en 0-shot que les modèles décodeur. <br>
|
1241 |
+
Au-delà du NLP, nous possédons aussi plus de 2M de lignes de prompt de type "open QA" qui doivent nous permettre de tester le FAT5 sur des tâches/connaissances plus généralistes.<br><br>
|
1242 |
+
|
1243 |
+
La conception de ce modèle instruct doit en outre nous permettre de travailler sur son alignement, notamment via un jeu de données de 12M de lignes pour effectuer de la DPO en français.<br><br><br></p>
|
1244 |
+
|
1245 |
+
<h4>Longues séquences</h4>
|
1246 |
+
<p class="width_125">
|
1247 |
+
Le pré-entraînement effectué porte sur des séquences de 1 024 <i>tokens</i>. Or, le noyau CUDA que nous avons développé prend en compte des encodages positionnels permettant d'étendre fortement cette taille de contexte ainsi qu'une inférence linéaire.<br>
|
1248 |
+
Dans cette logique, nous avons créé deux jeux de données de longues séquences en français (un de QA, un de résumé de textes) sur lesquels nous souhaitons finetuner notre modèle.<br><br></p>
|
1249 |
+
|
1250 |
+
<h3>À long terme</h3>
|
1251 |
+
<p class="width_125">Les éléments listés ci-dessous portent sur des pistes à plus long terme. C'est-à-dire que leur implémentation prendra du temps et feront l'objet d'un nouvel article de blog le cas échéant.</p>
|
1252 |
+
|
1253 |
+
<h4 id="calcul-lin-aire">Réduction de la mémoire</h4>
|
1254 |
+
<p class="width_125">Bien que déjà satisfaits par les optimisations effectuées sur la mémoire via notre noyau CUDA, nous pensons que nous pouvons pousser ces résultats plus loin via d'autres techniques. Par exemple, nous pouvons citer la méthode CCE (Cut Cross-Entropy) <d-cite bibtex-key="wijmans2024cut"></d-cite> avec laquelle nous avons déjà obtenus des résultats intéressants sur des modèles décodeur.<br>
|
1255 |
+
De plus, alors que nous nous sommes concentrés sur le pré-entraînement, un travail serait à faire sur l'inférence qui en pratique consomme le plus de ressources dans le temps une fois le modèle en production. Nous pensons notamment à utiliser la SageAttention2 <d-cite bibtex-key="zhang2024sageattention2efficientattentionthorough"></d-cite> sortie pendant que notre modèle s'entraînait.
|
1256 |
+
<br><br></p>
|
1257 |
+
|
1258 |
+
<h4 id="calcul-lin-aire">Calcul linéaire</h4>
|
1259 |
+
<p class="width_125">Dans ce travail, nous présentons un modèle à mémoire linéaire.
|
1260 |
+
Une amélioration supplémentaire consisterait à ce qu’en plus de cette mémoire, le modèle opère avec des calculs linéaires.<br>
|
1261 |
+
L’idée est de substituer l’attention quadratique traditionnelle par une autre forme d’attention.<br>
|
1262 |
+
On peut penser à certaines déjà appliquées au T5, comme celle du LongT5 <d-cite bibtex-key="guo2022longt5"></d-cite>.
|
1263 |
+
Il est aussi envisageable de tester des formes plus récentes comme Based <d-cite bibtex-key="arora2024simple"></d-cite>.
|
1264 |
+
Nous sommes également intéressés par effectuer des tests avec Hedgehog <d-cite bibtex-key="zhang2024hedgehog"></d-cite>.
|
1265 |
+
En effet, il est possible de les associer aux noyaux optimisés disponibles dans <a class="link" href="https://github.com/HazyResearch/ThunderKittens/tree/main/kernels">ThunderKittens</a> <d-cite bibtex-key="thunderkittens"></d-cite>.
|
1266 |
+
L’intérêt est qu’il est alors possible de garder le modèle pré-entraîné et, via un finetuning supplémentaire, de remplacer l’attention standard avec softmax par une linéaire avec Hedgehog.<br>
|
1267 |
+
LoLCATs <d-cite bibtex-key="zhang2024lolcatslowranklinearizinglarge"></d-cite> effectue ce finetuning via LoRA <d-cite bibtex-key="hu2021loralowrankadaptationlarge"></d-cite>.
|
1268 |
+
<br><br></p>
|
1269 |
+
|
1270 |
+
<h4 id="passage-l-chelle">Taille des modèles</h4>
|
1271 |
+
<p class="width_125"> Des T5/FLAN-T5 ont été entraînés jusqu'à 11 milliards de paramètres, montrant ainsi que cette architecture peut passer à l'échelle.<br>
|
1272 |
+
Nous aimerions ainsi proposer des modèles de taille plus importante avec un FAT5-base et un FAT5-large de respectivement 305M et 973M de paramètres que nous souhaiterions ensuite distiller. L'objectif est de proposer des modèles consommant le moins possible en routine/inférence.<br>
|
1273 |
+
Nous nous attendons également à ce que les modèles distillés donnent de meilleures performances que des modèles de taille équivalente entraînés de zéro.
|
1274 |
+
<br><br></p>
|
1275 |
+
|
1276 |
+
<h4 id="modeles-specialises">Les données d'entraînement</h4>
|
1277 |
+
<p class="width_125">
|
1278 |
+
Dans le cadre de ce travail, nous avons utilisé des données en français « générique » principalement issues de CulturaX. Pendant l'entraînement de notre modèle,
|
1279 |
+
Hugging Face a introduit le jeu de données FineWeb2 <d-cite bibtex-key="penedo2024fineweb-2"></d-cite> qui comporte du français. Nous aimerions pré-entraîné un nouveau modèle pour pouvoir comparer l'impact des données de pré-entraînement sur les performances des tâches en aval.<br>
|
1280 |
+
|
1281 |
+
Au-delà du français générique, nous souhaitons surtout pouvoir appliquer notre méthodologie à des domaines spécifiques (médecine, variante régionale du français, etc.).<br>
|
1282 |
+
Pour cela, il faudrait entraîner un nouveau <em>tokenizer</em> dédié et effectuer un nouveau pré-entraînement pour chacun des domaines choisis.
|
1283 |
+
L’intérêt des optimisations mises en place et présentées dans cet article de blog est de permettre une réduction importante du coût du pré-entraînement.<br>
|
1284 |
+
Nous souhaiterions ensuite mener une comparaison entre ces petits modèles spécialisés vs. de grands modèles génériques.<br><br></p>
|
1285 |
+
|
1286 |
+
<h4 id="modeles-specialises">Une actualisation de l'architecture du T5</h4>
|
1287 |
+
<p class="width_125">La dernière piste que nous souhaiterions explorer est une actualisation de l'architecture du T5. En effet, les encodeurs-décodeurs ayant été délaissés, ils n'ont pas bénéficié des améliorations qu'ont reçues ces derniers mois les modèles décodeurs (couches d'activation ou de normalisation plus récentes, <i>multi token prediction</i> <d-cite bibtex-key="gloeckle2024betterfasterlarge"></d-cite>, etc.).</p>
|
1288 |
+
|
1289 |
+
|
1290 |
+
<p class="width_125"><br><br><br></p>
|
1291 |
+
<h2 id="conclusion">Conclusion</h2>
|
1292 |
+
<p class="width_125">
|
1293 |
+
Nous avons introduit le modèle FAT5 (Flash Attention T5) en détaillant notre démarche d’optimisation de différents éléments des processus de pré-entraînement et de finetuning.
|
1294 |
+
Celui-ci se base sur des noyaux permettant d'utiliser la Flash Attention avec un T5 et de donner une mémoire linéaire au modèle.
|
1295 |
+
Nous avons notamment appliqué nos travaux au français et fait en sorte qu’il soit aussi utilisable dans n'importe quelle autre langue.
|
1296 |
+
Nous espérons que notre méthode, permettant de pré-entraîner de zéro un modèle de 147M de paramètres pour 1 600€, pourra être utile aux personnes disposant de ressources de calculs limitées.
|
1297 |
+
Elle ouvre également une voie vers un retour à un usage de modèles encodeur-décodeur plutôt qu’uniquement décodeur.<br>
|
1298 |
+
<p class="width_125"><br><br></p>
|
1299 |
+
|
1300 |
+
|
1301 |
+
<style>
|
1302 |
+
d-appendix .citation {
|
1303 |
+
font-size: 11px;
|
1304 |
+
line-height: 15px;
|
1305 |
+
border-left: 1px solid rgba(0, 0, 0, 0.1);
|
1306 |
+
padding-left: 10px;
|
1307 |
+
border: 1px solid rgba(0,0,0,0.1);
|
1308 |
+
background: #0D1117;
|
1309 |
+
padding: 10px 10px;
|
1310 |
+
border-radius: 3px;
|
1311 |
+
color: rgba(150, 150, 150, 1);
|
1312 |
+
overflow: hidden;
|
1313 |
+
margin-top: -12px;
|
1314 |
+
white-space: pre-wrap;
|
1315 |
+
word-wrap: break-word;
|
1316 |
+
}
|
1317 |
+
</style>
|
1318 |
+
|
1319 |
+
<h3 id="citation">Citation</h3>
|
1320 |
+
<pre class="citation long">@misc{FAT5_blogpost,
|
1321 |
+
title={ FAT5: Flash Attention T5 },
|
1322 |
+
author={ Boris ALBAR and Loïck BOURDOIS },
|
1323 |
+
organization={ Centre Aquitain des Technologies de l'Information et Electroniques },
|
1324 |
+
year={2024},
|
1325 |
+
url={ https://huggingface.co/spaces/CATIE-AQ/FAT5-report },
|
1326 |
+
doi={ 10.57967/hf/0821 },
|
1327 |
+
publisher= { Hugging Face }
|
1328 |
+
}</pre>
|
1329 |
+
|
1330 |
+
<d-appendix style="color: #9CA3AF;" >
|
1331 |
+
<d-bibliography src="bibliography.bib"></d-bibliography>
|
1332 |
+
</d-appendix>
|
1333 |
+
</d-article>
|
1334 |
+
|
1335 |
+
<script>
|
1336 |
+
const article = document.querySelector('d-article');
|
1337 |
+
const toc = document.querySelector('d-contents');
|
1338 |
+
if (toc) {
|
1339 |
+
const headings = article.querySelectorAll('h2, h3, h4');
|
1340 |
+
let ToC = `<nav role="navigation" class="l-text figcaption" style="color: #9CA3AF;"><h3>Table des matières</h3>`;
|
1341 |
+
let prevLevel = 0;
|
1342 |
+
for (const el of headings) {
|
1343 |
+
// should element be included in TOC?
|
1344 |
+
const isInTitle = el.parentElement.tagName == 'D-TITLE';
|
1345 |
+
const isException = el.getAttribute('no-toc');
|
1346 |
+
if (isInTitle || isException) continue;
|
1347 |
+
el.setAttribute('id', el.textContent.toLowerCase().replaceAll(" ", "_"))
|
1348 |
+
const link = '<a target="_self" href="' + '#' + el.getAttribute('id') + '">' + el.textContent + '</a>';
|
1349 |
+
const level = el.tagName === 'H2' ? 0 : (el.tagName === 'H3' ? 1 : 2);
|
1350 |
+
while (prevLevel < level) {
|
1351 |
+
ToC += '<ul>'
|
1352 |
+
prevLevel++;
|
1353 |
+
}
|
1354 |
+
while (prevLevel > level) {
|
1355 |
+
ToC += '</ul>'
|
1356 |
+
prevLevel--;
|
1357 |
+
}
|
1358 |
+
if (level === 0)
|
1359 |
+
ToC += '<div>' + link + '</div>';
|
1360 |
+
else
|
1361 |
+
ToC += '<li>' + link + '</li>';
|
1362 |
+
}
|
1363 |
+
while (prevLevel > 0) {
|
1364 |
+
ToC += '</ul>'
|
1365 |
+
prevLevel--;
|
1366 |
+
}
|
1367 |
+
ToC += '</nav>';
|
1368 |
+
toc.innerHTML = ToC;
|
1369 |
+
toc.setAttribute('prerendered', 'true');
|
1370 |
+
const toc_links = document.querySelectorAll('d-contents > nav a');
|
1371 |
+
window.addEventListener('scroll', (_event) => {
|
1372 |
+
if (typeof (headings) != 'undefined' && headings != null && typeof (toc_links) != 'undefined' && toc_links != null) {
|
1373 |
+
// Then iterate forwards, on the first match highlight it and break
|
1374 |
+
find_active: {
|
1375 |
+
for (let i = headings.length - 1; i >= 0; i--) {
|
1376 |
+
if (headings[i].getBoundingClientRect().top - 50 <= 0) {
|
1377 |
+
if (!toc_links[i].classList.contains("active")) {
|
1378 |
+
toc_links.forEach((link, _index) => {
|
1379 |
+
link.classList.remove("active");
|
1380 |
+
});
|
1381 |
+
toc_links[i].classList.add('active');
|
1382 |
+
}
|
1383 |
+
break find_active;
|
1384 |
+
}
|
1385 |
+
}
|
1386 |
+
toc_links.forEach((link, _index) => {
|
1387 |
+
link.classList.remove("active");
|
1388 |
+
});
|
1389 |
+
}
|
1390 |
+
}
|
1391 |
+
});
|
1392 |
+
}
|
1393 |
+
</script>
|
1394 |
+
</body>
|
1395 |
+
</html>
|
dist/main.bundle.js
ADDED
The diff for this file is too large to render.
See raw diff
|
|
dist/main.bundle.js.LICENSE.txt
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* @license
|
2 |
+
Papa Parse
|
3 |
+
v5.4.1
|
4 |
+
https://github.com/mholt/PapaParse
|
5 |
+
License: MIT
|
6 |
+
*/
|
7 |
+
|
8 |
+
/*! For license information please see plotly-basic.min.js.LICENSE.txt */
|
9 |
+
|
10 |
+
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
11 |
+
|
12 |
+
/**
|
13 |
+
* @license
|
14 |
+
* Lodash <https://lodash.com/>
|
15 |
+
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
|
16 |
+
* Released under MIT license <https://lodash.com/license>
|
17 |
+
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
18 |
+
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
19 |
+
*/
|
dist/main.bundle.js.map
ADDED
The diff for this file is too large to render.
See raw diff
|
|
dist/style.css
ADDED
@@ -0,0 +1,349 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* style.css */
|
2 |
+
/* Define colors */
|
3 |
+
/* :root {
|
4 |
+
--distill-gray: rgb(107, 114, 128);
|
5 |
+
--distill-gray-light: rgb(185, 185, 185);
|
6 |
+
--distill-gray-lighter: rgb(228, 228, 228);
|
7 |
+
--distill-gray-lightest: rgb(245, 245, 245);
|
8 |
+
--distill-blue: #007BFF;
|
9 |
+
}
|
10 |
+
*/
|
11 |
+
|
12 |
+
|
13 |
+
/* Begin dark theme */
|
14 |
+
:root {
|
15 |
+
--bg-color: #0B0F19;
|
16 |
+
--text-color: #ffffff;
|
17 |
+
}
|
18 |
+
|
19 |
+
@media (prefers-color-scheme: dark) {
|
20 |
+
:root {
|
21 |
+
--bg-color: #0B0F19;
|
22 |
+
--text-color: #ffffff;
|
23 |
+
}
|
24 |
+
}
|
25 |
+
|
26 |
+
body {
|
27 |
+
background-color: var(--bg-color);
|
28 |
+
color: #9CA3AF;
|
29 |
+
}
|
30 |
+
|
31 |
+
aside {
|
32 |
+
background-color: var(--bg-color);
|
33 |
+
color: #9CA3AF;
|
34 |
+
}
|
35 |
+
|
36 |
+
d-article {
|
37 |
+
color: #9CA3AF;
|
38 |
+
}
|
39 |
+
|
40 |
+
d-bibliography {
|
41 |
+
color: #9CA3AF;
|
42 |
+
}
|
43 |
+
|
44 |
+
d-front-matter {
|
45 |
+
color: #9CA3AF;
|
46 |
+
}
|
47 |
+
|
48 |
+
d-contents {
|
49 |
+
color: #9CA3AF;
|
50 |
+
}
|
51 |
+
|
52 |
+
.active {
|
53 |
+
color: #9CA3AF;
|
54 |
+
}
|
55 |
+
|
56 |
+
.l-text figcaption
|
57 |
+
{
|
58 |
+
color: #9CA3AF;
|
59 |
+
}
|
60 |
+
|
61 |
+
.link {
|
62 |
+
color: #0284C7
|
63 |
+
}
|
64 |
+
|
65 |
+
/* End dark theme */
|
66 |
+
|
67 |
+
|
68 |
+
.width_125 {
|
69 |
+
width: 125%;
|
70 |
+
}
|
71 |
+
|
72 |
+
|
73 |
+
/* Container for the controls */
|
74 |
+
[id^="plot-"] {
|
75 |
+
display: flex;
|
76 |
+
flex-direction: column;
|
77 |
+
align-items: center;
|
78 |
+
gap: 15px; /* Adjust the gap between controls as needed */
|
79 |
+
}
|
80 |
+
[id^="plot-"] figure {
|
81 |
+
margin-bottom: 0px;
|
82 |
+
margin-top: 0px;
|
83 |
+
padding: 0px;
|
84 |
+
}
|
85 |
+
|
86 |
+
.plotly_caption {
|
87 |
+
font-style: italic;
|
88 |
+
margin-top: 10px;
|
89 |
+
}
|
90 |
+
|
91 |
+
.plotly_controls {
|
92 |
+
display: flex;
|
93 |
+
flex-wrap: wrap;
|
94 |
+
flex-direction: row;
|
95 |
+
justify-content: center;
|
96 |
+
align-items: flex-start;
|
97 |
+
gap: 30px;
|
98 |
+
}
|
99 |
+
|
100 |
+
|
101 |
+
.plotly_input_container {
|
102 |
+
display: flex;
|
103 |
+
align-items: center;
|
104 |
+
flex-direction: column;
|
105 |
+
gap: 10px;
|
106 |
+
}
|
107 |
+
|
108 |
+
/* Style for the select dropdown */
|
109 |
+
.plotly_input_container > select {
|
110 |
+
padding: 2px 4px;
|
111 |
+
/* border: 1px solid #ccc; */
|
112 |
+
line-height: 1.5em;
|
113 |
+
text-align: center;
|
114 |
+
border-radius: 4px;
|
115 |
+
font-size: 12px;
|
116 |
+
background-color: var(--distill-gray-lightest);
|
117 |
+
outline: none;
|
118 |
+
}
|
119 |
+
|
120 |
+
|
121 |
+
/* tags */
|
122 |
+
.note {
|
123 |
+
background-color: #0B1826;
|
124 |
+
color: #9CA3AF;
|
125 |
+
border-left: 4px solid #075985;
|
126 |
+
padding: 10px 10px 3px 5px;
|
127 |
+
margin: 10px 0;
|
128 |
+
width: 125%;
|
129 |
+
}
|
130 |
+
|
131 |
+
.tip {
|
132 |
+
background-color: #0A181E;
|
133 |
+
color: #9CA3AF;
|
134 |
+
border-left: 4px solid #065F46;
|
135 |
+
padding: 10px 10px 3px 5px;;
|
136 |
+
margin: 10px 0;
|
137 |
+
width: 125%;
|
138 |
+
}
|
139 |
+
|
140 |
+
.caution {
|
141 |
+
background-color: #1C111A;
|
142 |
+
color: #9CA3AF;
|
143 |
+
border-left: 4px solid #FF474C;
|
144 |
+
padding: 10px 10px 3px 5px;;
|
145 |
+
margin: 10px 0;
|
146 |
+
width: 125%;
|
147 |
+
}
|
148 |
+
|
149 |
+
/* Style for the range input */
|
150 |
+
|
151 |
+
.plotly_slider {
|
152 |
+
display: flex;
|
153 |
+
align-items: center;
|
154 |
+
gap: 10px;
|
155 |
+
}
|
156 |
+
|
157 |
+
.plotly_slider > input[type="range"] {
|
158 |
+
-webkit-appearance: none;
|
159 |
+
height: 2px;
|
160 |
+
background: var(--distill-gray-light);
|
161 |
+
border-radius: 5px;
|
162 |
+
outline: none;
|
163 |
+
}
|
164 |
+
|
165 |
+
.plotly_slider > span {
|
166 |
+
font-size: 14px;
|
167 |
+
line-height: 1.6em;
|
168 |
+
min-width: 16px;
|
169 |
+
}
|
170 |
+
|
171 |
+
.plotly_slider > input[type="range"]::-webkit-slider-thumb {
|
172 |
+
-webkit-appearance: none;
|
173 |
+
appearance: none;
|
174 |
+
width: 18px;
|
175 |
+
height: 18px;
|
176 |
+
border-radius: 50%;
|
177 |
+
background: var(--distill-blue);
|
178 |
+
cursor: pointer;
|
179 |
+
}
|
180 |
+
|
181 |
+
.plotly_slider > input[type="range"]::-moz-range-thumb {
|
182 |
+
width: 18px;
|
183 |
+
height: 18px;
|
184 |
+
border-radius: 50%;
|
185 |
+
background: var(--distill-blue);
|
186 |
+
cursor: pointer;
|
187 |
+
}
|
188 |
+
|
189 |
+
/* Style for the labels */
|
190 |
+
.plotly_input_container > label {
|
191 |
+
font-size: 14px;
|
192 |
+
font-weight: bold;
|
193 |
+
}
|
194 |
+
|
195 |
+
.main-plot-container {
|
196 |
+
margin-top: 21px;
|
197 |
+
margin-bottom: 35px;
|
198 |
+
}
|
199 |
+
|
200 |
+
.main-plot-container > figure {
|
201 |
+
display: block !important;
|
202 |
+
/* Let this be handled by graph-container */
|
203 |
+
margin-bottom: 0px;
|
204 |
+
margin-top: 0px;
|
205 |
+
}
|
206 |
+
.main-plot-container > div {
|
207 |
+
display: none !important;
|
208 |
+
}
|
209 |
+
|
210 |
+
|
211 |
+
@media (min-width: 768px) {
|
212 |
+
.main-plot-container > figure {
|
213 |
+
display: none !important;
|
214 |
+
}
|
215 |
+
.main-plot-container > div {
|
216 |
+
display: flex !important;
|
217 |
+
}
|
218 |
+
}
|
219 |
+
|
220 |
+
d-byline .byline {
|
221 |
+
grid-template-columns: 1fr;
|
222 |
+
grid-column: text;
|
223 |
+
font-size: 0.9rem;
|
224 |
+
line-height: 1.8em;
|
225 |
+
}
|
226 |
+
|
227 |
+
@media (min-width: 768px) {
|
228 |
+
d-byline .byline {
|
229 |
+
grid-template-columns: 4fr 1fr 1fr 1fr;
|
230 |
+
}
|
231 |
+
}
|
232 |
+
|
233 |
+
#title-plot {
|
234 |
+
margin-top: 0px;
|
235 |
+
margin-bottom: 0px;
|
236 |
+
}
|
237 |
+
|
238 |
+
d-contents > nav a.active {
|
239 |
+
text-decoration: underline;
|
240 |
+
}
|
241 |
+
|
242 |
+
@media (max-width: 1199px) {
|
243 |
+
d-contents {
|
244 |
+
display: none;
|
245 |
+
justify-self: start;
|
246 |
+
align-self: start;
|
247 |
+
padding-bottom: 0.5em;
|
248 |
+
margin-bottom: 1em;
|
249 |
+
padding-left: 0.25em;
|
250 |
+
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
251 |
+
border-bottom-width: 1px;
|
252 |
+
border-bottom-style: solid;
|
253 |
+
border-bottom-color: rgba(0, 0, 0, 0.1);
|
254 |
+
}
|
255 |
+
}
|
256 |
+
|
257 |
+
d-contents a {
|
258 |
+
text-decoration: underline;
|
259 |
+
}
|
260 |
+
|
261 |
+
|
262 |
+
@media (min-width: 1200px) {
|
263 |
+
d-article {
|
264 |
+
/* Ensure d-article does not prevent sticky positioning */
|
265 |
+
overflow: visible;
|
266 |
+
}
|
267 |
+
|
268 |
+
d-contents {
|
269 |
+
align-self: start;
|
270 |
+
grid-column-start: 1 !important;
|
271 |
+
grid-column-end: 4 !important;
|
272 |
+
grid-row: auto / span 6;
|
273 |
+
justify-self: end;
|
274 |
+
margin-top: 0em;
|
275 |
+
padding-right: 2em;
|
276 |
+
padding-left: 2em;
|
277 |
+
border-right: 1px solid rgba(0, 0, 0, 0.1);
|
278 |
+
border-right-width: 1px;
|
279 |
+
border-right-style: solid;
|
280 |
+
border-right-color: rgba(0, 0, 0, 0.1);
|
281 |
+
position: -webkit-sticky; /* For Safari */
|
282 |
+
position: sticky;
|
283 |
+
top: 10px; /* Adjust this value if needed */
|
284 |
+
}
|
285 |
+
}
|
286 |
+
|
287 |
+
d-contents nav h3 {
|
288 |
+
margin-top: 0;
|
289 |
+
margin-bottom: 1em;
|
290 |
+
}
|
291 |
+
|
292 |
+
d-contents nav div {
|
293 |
+
color: #9CA3AF;
|
294 |
+
font-weight: bold;
|
295 |
+
}
|
296 |
+
|
297 |
+
d-contents nav a {
|
298 |
+
color: #9CA3AF;
|
299 |
+
border-bottom: none;
|
300 |
+
text-decoration: none;
|
301 |
+
}
|
302 |
+
|
303 |
+
d-contents li {
|
304 |
+
list-style-type: none;
|
305 |
+
}
|
306 |
+
|
307 |
+
d-contents ul, d-article d-contents ul {
|
308 |
+
padding-left: 1em;
|
309 |
+
}
|
310 |
+
|
311 |
+
d-contents nav ul li {
|
312 |
+
margin-bottom: .25em;
|
313 |
+
}
|
314 |
+
|
315 |
+
d-contents nav a:hover {
|
316 |
+
text-decoration: underline solid rgba(0, 0, 0, 0.6);
|
317 |
+
}
|
318 |
+
|
319 |
+
d-contents nav ul {
|
320 |
+
margin-top: 0;
|
321 |
+
margin-bottom: 6px;
|
322 |
+
}
|
323 |
+
|
324 |
+
|
325 |
+
d-contents nav > div {
|
326 |
+
display: block;
|
327 |
+
outline: none;
|
328 |
+
margin-bottom: 0.5em;
|
329 |
+
}
|
330 |
+
|
331 |
+
d-contents nav > div > a {
|
332 |
+
font-size: 13px;
|
333 |
+
font-weight: 600;
|
334 |
+
}
|
335 |
+
|
336 |
+
d-article aside {
|
337 |
+
margin-bottom: 1em;
|
338 |
+
}
|
339 |
+
|
340 |
+
@media (min-width: 768px) {
|
341 |
+
d-article aside {
|
342 |
+
margin-bottom: 0;
|
343 |
+
}
|
344 |
+
}
|
345 |
+
|
346 |
+
d-contents nav > div > a:hover,
|
347 |
+
d-contents nav > ul > li > a:hover {
|
348 |
+
text-decoration: none;
|
349 |
+
}
|
package-lock.json
ADDED
The diff for this file is too large to render.
See raw diff
|
|
package.json
ADDED
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"dependencies": {
|
3 |
+
"lodash": "^4.17.21",
|
4 |
+
"papaparse": "^5.4.1",
|
5 |
+
"plotly.js-basic-dist-min": "^2.33.0"
|
6 |
+
},
|
7 |
+
"name": "blogpost",
|
8 |
+
"version": "1.0.0",
|
9 |
+
"description": "--- title: \"FAT5: Flash Attention T5\" emoji: ⚡ colorFrom: pink colorTo: red sdk: static pinned: false header: mini ---",
|
10 |
+
"main": "index.js",
|
11 |
+
"scripts": {
|
12 |
+
"dev": "webpack serve --open",
|
13 |
+
"build": "NODE_ENV=production webpack"
|
14 |
+
},
|
15 |
+
"author": "",
|
16 |
+
"license": "ISC",
|
17 |
+
"devDependencies": {
|
18 |
+
"@babel/preset-env": "^7.24.6",
|
19 |
+
"babel-loader": "^9.1.3",
|
20 |
+
"clean-webpack-plugin": "^4.0.0",
|
21 |
+
"compression-webpack-plugin": "^11.1.0",
|
22 |
+
"copy-webpack-plugin": "^12.0.2",
|
23 |
+
"css-loader": "^7.1.2",
|
24 |
+
"html-webpack-change-assets-extension-plugin": "^1.3.1",
|
25 |
+
"html-webpack-plugin": "^5.6.0",
|
26 |
+
"style-loader": "^4.0.0",
|
27 |
+
"webpack": "^5.91.0",
|
28 |
+
"webpack-bundle-analyzer": "^4.10.2",
|
29 |
+
"webpack-cli": "^5.1.4",
|
30 |
+
"webpack-dev-server": "^5.0.4"
|
31 |
+
}
|
32 |
+
}
|
webpack.config.js
ADDED
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
const path = require("path");
|
2 |
+
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
|
3 |
+
const CopyPlugin = require("copy-webpack-plugin");
|
4 |
+
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
|
5 |
+
|
6 |
+
const COLOR_KEYS = ["color", "bgColor", "fillcolor"];
|
7 |
+
|
8 |
+
const transformDataColors = async (data, path) => {
|
9 |
+
const {getNamedColor} = await import('./src/colors.mjs');
|
10 |
+
// if not json file, return
|
11 |
+
if (!path.endsWith(".json")) {
|
12 |
+
return data;
|
13 |
+
}
|
14 |
+
const parsedData = JSON.parse(data);
|
15 |
+
// Change the color of the data
|
16 |
+
const deepIterateAndSetColor = (key, val) => {
|
17 |
+
if (val === null) {
|
18 |
+
return null;
|
19 |
+
}
|
20 |
+
if (val == undefined) {
|
21 |
+
return undefined;
|
22 |
+
}
|
23 |
+
if (Array.isArray(val)) {
|
24 |
+
return val.map(item => deepIterateAndSetColor(key, item));
|
25 |
+
}
|
26 |
+
if (typeof val === "object") {
|
27 |
+
return Object.entries(val).reduce((newObj, [key, value]) => {
|
28 |
+
newObj[key] = deepIterateAndSetColor(key, value);
|
29 |
+
return newObj;
|
30 |
+
}, {});
|
31 |
+
}
|
32 |
+
if (COLOR_KEYS.includes(key)) {
|
33 |
+
const [colorName, opacity, ...rest] = val.trim().split(/\s+/);
|
34 |
+
const floatOpacity = parseFloat(opacity);
|
35 |
+
const newColor = getNamedColor(colorName, floatOpacity);
|
36 |
+
if (newColor !== undefined && rest.length === 0 && !isNaN(floatOpacity)) {
|
37 |
+
console.log(`key: ${key} in file ${path} changed from ${val} to ${newColor}`);
|
38 |
+
return newColor;
|
39 |
+
} else {
|
40 |
+
return val;
|
41 |
+
}
|
42 |
+
}
|
43 |
+
return val;
|
44 |
+
};
|
45 |
+
return JSON.stringify(deepIterateAndSetColor(undefined, parsedData))
|
46 |
+
};
|
47 |
+
|
48 |
+
module.exports = {
|
49 |
+
entry: {
|
50 |
+
distill: "./src/distill.js",
|
51 |
+
main: "./src/index.js",
|
52 |
+
},
|
53 |
+
output: {
|
54 |
+
filename: "[name].bundle.js", // The output file
|
55 |
+
path: path.resolve(__dirname, "dist"), // Output directory
|
56 |
+
},
|
57 |
+
module: {
|
58 |
+
rules: [
|
59 |
+
// { test: /\.css$/, use: ["style-loader", "css-loader"] },
|
60 |
+
{
|
61 |
+
test: /\.(js|mjs)$/,
|
62 |
+
exclude: /node_modules/,
|
63 |
+
use: {
|
64 |
+
loader: "babel-loader",
|
65 |
+
options: {
|
66 |
+
presets: ["@babel/preset-env"],
|
67 |
+
},
|
68 |
+
},
|
69 |
+
},
|
70 |
+
],
|
71 |
+
},
|
72 |
+
plugins: [
|
73 |
+
new CleanWebpackPlugin(),
|
74 |
+
new CopyPlugin({
|
75 |
+
patterns: [
|
76 |
+
{
|
77 |
+
from: "assets",
|
78 |
+
to: "assets",
|
79 |
+
transform: transformDataColors,
|
80 |
+
},
|
81 |
+
{ from: "src/style.css", to: "style.css" },
|
82 |
+
{ from: "src/bibliography.bib", to: "bibliography.bib" },
|
83 |
+
{ from: "src/index.html", to: "index.html" },
|
84 |
+
],
|
85 |
+
}),
|
86 |
+
],
|
87 |
+
devtool: process.env.NODE_ENV === 'production' ? 'source-map' : 'eval-source-map',
|
88 |
+
devServer: {
|
89 |
+
static: "./dist", // Serve files from the 'dist' directory
|
90 |
+
open: process.env.NODE_ENV !== 'production', // Automatically open the browser unless in production
|
91 |
+
hot: process.env.NODE_ENV !== 'production', // Enable hot module replacement unless in production
|
92 |
+
},
|
93 |
+
mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
|
94 |
+
};
|
95 |
+
|
96 |
+
console.log(process.env.NODE_ENV)
|