pub struct Tokenizer { /* private fields */ }Expand description
解码用的分词表。
Implementations§
Source§impl Tokenizer
impl Tokenizer
Sourcepub fn load(dir: &Path) -> Result<Tokenizer, String>
pub fn load(dir: &Path) -> Result<Tokenizer, String>
读模型目录下的 tokenizer.json。
Examples found in repository?
examples/formula_check.rs (line 54)
40fn main() {
41 let a: Vec<String> = std::env::args().skip(1).collect();
42 let dir = Path::new(&a[0]);
43 let t = Instant::now();
44 let cfg = json(dir, "config.json");
45 let w = Weights::from_bytes(&std::fs::read(dir.join("model.safetensors")).unwrap()).unwrap();
46 let dec = Decoder::from_weights(
47 &w,
48 &cfg["text_config"],
49 &json(dir, "generation_config.json"),
50 )
51 .unwrap();
52 let enc = Encoder::from_weights(&w, Config::from_json(&cfg).unwrap()).unwrap();
53 drop(w);
54 let tok = Tokenizer::load(dir).unwrap();
55 println!("载入 {:.0} ms", t.elapsed().as_secs_f64() * 1e3);
56
57 if a.len() == 1 {
58 // 固定种子的随机 memory
59 let mut s = 0x9E37_79B9_7F4A_7C15u64;
60 let data = (0..144 * 512)
61 .map(|_| {
62 s ^= s << 13;
63 s ^= s >> 7;
64 s ^= s << 17;
65 (s >> 40) as f32 / (1u64 << 23) as f32 - 1.0
66 })
67 .collect();
68 let mem = Tensor::new(vec![144, 512], data);
69 let t = Instant::now();
70 let ids = dec.generate(&mem, 200).unwrap();
71 let ms = t.elapsed().as_secs_f64() * 1e3;
72 println!(
73 "随机 memory:{} 个 token,{ms:.0} ms,{:.1} ms/token",
74 ids.len(),
75 ms / (ids.len() + 1) as f64
76 );
77 println!("{}", to_latex(&tok.decode(&ids)));
78 return;
79 }
80
81 for p in &a[1..] {
82 let img = read_ppm(p);
83 let t = Instant::now();
84 let x = preprocess(&img);
85 let t_pre = t.elapsed().as_secs_f64() * 1e3;
86 let t = Instant::now();
87 let mem = enc.encode(&x).unwrap();
88 let t_enc = t.elapsed().as_secs_f64() * 1e3;
89 let t = Instant::now();
90 let ids = dec.generate(&mem, dec.max_length()).unwrap();
91 let t_dec = t.elapsed().as_secs_f64() * 1e3;
92 let name = Path::new(p).file_name().unwrap().to_string_lossy();
93 println!(
94 "{name}\t预处理 {t_pre:.0} ms\t编码 {t_enc:.0} ms\t解码 {t_dec:.0} ms({} 个 token,{:.1} ms/token)",
95 ids.len(),
96 t_dec / (ids.len() + 1) as f64
97 );
98 println!(" 原始:{}", tok.decode(&ids));
99 println!(" LaTeX:{}", to_latex(&tok.decode(&ids)));
100 }
101 // 内存峰值(Linux 才有这个文件)
102 if let Ok(s) = std::fs::read_to_string("/proc/self/status")
103 && let Some(l) = s.lines().find(|l| l.starts_with("VmHWM"))
104 {
105 println!("{l}");
106 }
107}pub fn from_json(j: &Value) -> Result<Tokenizer, String>
pub fn is_empty(&self) -> bool
Sourcepub fn decode(&self, ids: &[u32]) -> String
pub fn decode(&self, ids: &[u32]) -> String
id 序列 → 文本,跳过特殊 token 和未知 id。
Examples found in repository?
examples/formula_check.rs (line 77)
40fn main() {
41 let a: Vec<String> = std::env::args().skip(1).collect();
42 let dir = Path::new(&a[0]);
43 let t = Instant::now();
44 let cfg = json(dir, "config.json");
45 let w = Weights::from_bytes(&std::fs::read(dir.join("model.safetensors")).unwrap()).unwrap();
46 let dec = Decoder::from_weights(
47 &w,
48 &cfg["text_config"],
49 &json(dir, "generation_config.json"),
50 )
51 .unwrap();
52 let enc = Encoder::from_weights(&w, Config::from_json(&cfg).unwrap()).unwrap();
53 drop(w);
54 let tok = Tokenizer::load(dir).unwrap();
55 println!("载入 {:.0} ms", t.elapsed().as_secs_f64() * 1e3);
56
57 if a.len() == 1 {
58 // 固定种子的随机 memory
59 let mut s = 0x9E37_79B9_7F4A_7C15u64;
60 let data = (0..144 * 512)
61 .map(|_| {
62 s ^= s << 13;
63 s ^= s >> 7;
64 s ^= s << 17;
65 (s >> 40) as f32 / (1u64 << 23) as f32 - 1.0
66 })
67 .collect();
68 let mem = Tensor::new(vec![144, 512], data);
69 let t = Instant::now();
70 let ids = dec.generate(&mem, 200).unwrap();
71 let ms = t.elapsed().as_secs_f64() * 1e3;
72 println!(
73 "随机 memory:{} 个 token,{ms:.0} ms,{:.1} ms/token",
74 ids.len(),
75 ms / (ids.len() + 1) as f64
76 );
77 println!("{}", to_latex(&tok.decode(&ids)));
78 return;
79 }
80
81 for p in &a[1..] {
82 let img = read_ppm(p);
83 let t = Instant::now();
84 let x = preprocess(&img);
85 let t_pre = t.elapsed().as_secs_f64() * 1e3;
86 let t = Instant::now();
87 let mem = enc.encode(&x).unwrap();
88 let t_enc = t.elapsed().as_secs_f64() * 1e3;
89 let t = Instant::now();
90 let ids = dec.generate(&mem, dec.max_length()).unwrap();
91 let t_dec = t.elapsed().as_secs_f64() * 1e3;
92 let name = Path::new(p).file_name().unwrap().to_string_lossy();
93 println!(
94 "{name}\t预处理 {t_pre:.0} ms\t编码 {t_enc:.0} ms\t解码 {t_dec:.0} ms({} 个 token,{:.1} ms/token)",
95 ids.len(),
96 t_dec / (ids.len() + 1) as f64
97 );
98 println!(" 原始:{}", tok.decode(&ids));
99 println!(" LaTeX:{}", to_latex(&tok.decode(&ids)));
100 }
101 // 内存峰值(Linux 才有这个文件)
102 if let Ok(s) = std::fs::read_to_string("/proc/self/status")
103 && let Some(l) = s.lines().find(|l| l.starts_with("VmHWM"))
104 {
105 println!("{l}");
106 }
107}Auto Trait Implementations§
impl Forget for Tokenizer
impl Freeze for Tokenizer
impl RefUnwindSafe for Tokenizer
impl Send for Tokenizer
impl Sync for Tokenizer
impl Unpin for Tokenizer
impl UnsafeUnpin for Tokenizer
impl UnwindSafe for Tokenizer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more