faster-table-recognizer 0.1.0__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/Cargo.lock +32 -21
  2. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/Cargo.toml +1 -1
  3. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/PKG-INFO +2 -2
  4. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/README.md +1 -1
  5. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/src/model.rs +14 -1
  6. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/src/tensors.rs +11 -3
  7. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/.cargo/config.toml +0 -0
  8. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/.github/workflows/CI.yml +0 -0
  9. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/.gitignore +0 -0
  10. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/LICENSE +0 -0
  11. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/examples/service_integration.py +0 -0
  12. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/models/table-transformer-detection/config.json +0 -0
  13. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/models/table-transformer-detection/preprocessor_config.json +0 -0
  14. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/pyproject.toml +0 -0
  15. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/scripts/download_model.sh +0 -0
  16. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/scripts/make_golden.py +0 -0
  17. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/src/download.rs +0 -0
  18. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/src/lib.rs +0 -0
  19. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/src/main.rs +0 -0
  20. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/src/math.rs +0 -0
  21. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/src/postprocess.rs +0 -0
  22. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/src/preprocess.rs +0 -0
  23. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/src/python.rs +0 -0
  24. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/src/winograd.rs +0 -0
  25. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/tests/golden/g_meta.json +0 -0
  26. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/tests/golden/raw_boxes.f32 +0 -0
  27. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/tests/golden/raw_decoder_out.f32 +0 -0
  28. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/tests/golden/raw_encoder_out.f32 +0 -0
  29. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/tests/golden/raw_input_projection.f32 +0 -0
  30. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/tests/golden/raw_logits.f32 +0 -0
  31. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/tests/golden/raw_pixel_values.f32 +0 -0
  32. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/tests/golden/raw_shapes.json +0 -0
  33. {faster_table_recognizer-0.1.0 → faster_table_recognizer-0.2.0}/tests/golden/table_sample.png +0 -0
@@ -40,9 +40,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
40
40
 
41
41
  [[package]]
42
42
  name = "cc"
43
- version = "1.2.67"
43
+ version = "1.3.0"
44
44
  source = "registry+https://github.com/rust-lang/crates.io-index"
45
- checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38"
45
+ checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8"
46
46
  dependencies = [
47
47
  "find-msvc-tools",
48
48
  "shlex",
@@ -102,7 +102,7 @@ checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
102
102
  dependencies = [
103
103
  "proc-macro2",
104
104
  "quote",
105
- "syn",
105
+ "syn 2.0.119",
106
106
  ]
107
107
 
108
108
  [[package]]
@@ -113,7 +113,7 @@ checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
113
113
 
114
114
  [[package]]
115
115
  name = "faster-table-recognizer"
116
- version = "0.1.0"
116
+ version = "0.2.0"
117
117
  dependencies = [
118
118
  "base64",
119
119
  "image",
@@ -511,7 +511,7 @@ dependencies = [
511
511
  "proc-macro2",
512
512
  "pyo3-macros-backend",
513
513
  "quote",
514
- "syn",
514
+ "syn 2.0.119",
515
515
  ]
516
516
 
517
517
  [[package]]
@@ -524,7 +524,7 @@ dependencies = [
524
524
  "proc-macro2",
525
525
  "pyo3-build-config",
526
526
  "quote",
527
- "syn",
527
+ "syn 2.0.119",
528
528
  ]
529
529
 
530
530
  [[package]]
@@ -629,9 +629,9 @@ dependencies = [
629
629
 
630
630
  [[package]]
631
631
  name = "serde"
632
- version = "1.0.228"
632
+ version = "1.0.229"
633
633
  source = "registry+https://github.com/rust-lang/crates.io-index"
634
- checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
634
+ checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
635
635
  dependencies = [
636
636
  "serde_core",
637
637
  "serde_derive",
@@ -639,22 +639,22 @@ dependencies = [
639
639
 
640
640
  [[package]]
641
641
  name = "serde_core"
642
- version = "1.0.228"
642
+ version = "1.0.229"
643
643
  source = "registry+https://github.com/rust-lang/crates.io-index"
644
- checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
644
+ checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
645
645
  dependencies = [
646
646
  "serde_derive",
647
647
  ]
648
648
 
649
649
  [[package]]
650
650
  name = "serde_derive"
651
- version = "1.0.228"
651
+ version = "1.0.229"
652
652
  source = "registry+https://github.com/rust-lang/crates.io-index"
653
- checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
653
+ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
654
654
  dependencies = [
655
655
  "proc-macro2",
656
656
  "quote",
657
- "syn",
657
+ "syn 3.0.0",
658
658
  ]
659
659
 
660
660
  [[package]]
@@ -711,6 +711,17 @@ dependencies = [
711
711
  "unicode-ident",
712
712
  ]
713
713
 
714
+ [[package]]
715
+ name = "syn"
716
+ version = "3.0.0"
717
+ source = "registry+https://github.com/rust-lang/crates.io-index"
718
+ checksum = "f2fac314a64dc9a36e61a9eb4261a5e9bbfbc922b27e518af97bc32b926cf967"
719
+ dependencies = [
720
+ "proc-macro2",
721
+ "quote",
722
+ "unicode-ident",
723
+ ]
724
+
714
725
  [[package]]
715
726
  name = "synstructure"
716
727
  version = "0.13.2"
@@ -719,7 +730,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
719
730
  dependencies = [
720
731
  "proc-macro2",
721
732
  "quote",
722
- "syn",
733
+ "syn 2.0.119",
723
734
  ]
724
735
 
725
736
  [[package]]
@@ -816,14 +827,14 @@ version = "0.26.11"
816
827
  source = "registry+https://github.com/rust-lang/crates.io-index"
817
828
  checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9"
818
829
  dependencies = [
819
- "webpki-roots 1.0.8",
830
+ "webpki-roots 1.0.9",
820
831
  ]
821
832
 
822
833
  [[package]]
823
834
  name = "webpki-roots"
824
- version = "1.0.8"
835
+ version = "1.0.9"
825
836
  source = "registry+https://github.com/rust-lang/crates.io-index"
826
- checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf"
837
+ checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a"
827
838
  dependencies = [
828
839
  "rustls-pki-types",
829
840
  ]
@@ -932,7 +943,7 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
932
943
  dependencies = [
933
944
  "proc-macro2",
934
945
  "quote",
935
- "syn",
946
+ "syn 2.0.119",
936
947
  "synstructure",
937
948
  ]
938
949
 
@@ -953,7 +964,7 @@ checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5"
953
964
  dependencies = [
954
965
  "proc-macro2",
955
966
  "quote",
956
- "syn",
967
+ "syn 2.0.119",
957
968
  ]
958
969
 
959
970
  [[package]]
@@ -973,7 +984,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
973
984
  dependencies = [
974
985
  "proc-macro2",
975
986
  "quote",
976
- "syn",
987
+ "syn 2.0.119",
977
988
  "synstructure",
978
989
  ]
979
990
 
@@ -1013,7 +1024,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
1013
1024
  dependencies = [
1014
1025
  "proc-macro2",
1015
1026
  "quote",
1016
- "syn",
1027
+ "syn 2.0.119",
1017
1028
  ]
1018
1029
 
1019
1030
  [[package]]
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "faster-table-recognizer"
3
- version = "0.1.0"
3
+ version = "0.2.0"
4
4
  edition = "2021"
5
5
  description = "From-scratch, dependency-light CPU inference engine for microsoft/table-transformer-detection (DETR table detection). A fast drop-in replacement for HuggingFace transformers."
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: faster-table-recognizer
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -154,7 +154,7 @@ page, steady-state medians, full pipeline (decode + preprocess + inference):
154
154
  | Best multi-thread inference | ~189 ms (8 threads) | **~196 ms** (all cores) — parity |
155
155
  | As deployed (`torch.set_num_threads(1)`) | ~699 ms | **~196 ms** (3.5× faster) |
156
156
  | Cold start (import + load model) | ~5.5 s | **~0.3 s** (~19×) |
157
- | Peak RSS | 761 MB | 539 MB |
157
+ | Steady RSS (weights loaded) | 761 MB | **~246 MB** (0.2: drops mmap + redundant f32 copies) |
158
158
  | Install | torch + transformers + timm (~2–3 GB) | one ~1.8 MB wheel |
159
159
  | Detection output | — | **identical** (max abs logit Δ ≈ 1e-5) |
160
160
 
@@ -135,7 +135,7 @@ page, steady-state medians, full pipeline (decode + preprocess + inference):
135
135
  | Best multi-thread inference | ~189 ms (8 threads) | **~196 ms** (all cores) — parity |
136
136
  | As deployed (`torch.set_num_threads(1)`) | ~699 ms | **~196 ms** (3.5× faster) |
137
137
  | Cold start (import + load model) | ~5.5 s | **~0.3 s** (~19×) |
138
- | Peak RSS | 761 MB | 539 MB |
138
+ | Steady RSS (weights loaded) | 761 MB | **~246 MB** (0.2: drops mmap + redundant f32 copies) |
139
139
  | Install | torch + transformers + timm (~2–3 GB) | one ~1.8 MB wheel |
140
140
  | Detection output | — | **identical** (max abs logit Δ ≈ 1e-5) |
141
141
 
@@ -42,7 +42,7 @@ pub struct RawOutput {
42
42
  }
43
43
 
44
44
  impl Model {
45
- pub fn new(w: Weights) -> Self {
45
+ pub fn new(mut w: Weights) -> Self {
46
46
  let mut folded = HashMap::new();
47
47
  // (conv weight name, bn prefix) pairs across the ResNet-18 backbone.
48
48
  let bb = "model.backbone.conv_encoder.model";
@@ -76,6 +76,19 @@ impl Model {
76
76
  wt.insert(name.clone(), (tr, k, n));
77
77
  }
78
78
  }
79
+ // Free the redundant f32 source copies: every folded backbone conv and every
80
+ // 2-D linear now lives (folded / transposed) in `folded` / `wt`. Forward only
81
+ // still reads `query_position_embeddings.weight` raw among the 2-D tensors, plus
82
+ // small 1-D biases/layernorms and the 4-D input_projection conv (neither in wt).
83
+ let drop_names: Vec<String> = wt
84
+ .keys()
85
+ .filter(|n| n.as_str() != "model.query_position_embeddings.weight")
86
+ .chain(folded.keys())
87
+ .cloned()
88
+ .collect();
89
+ for n in drop_names {
90
+ w.remove(&n);
91
+ }
79
92
  Model { w, folded, wt }
80
93
  }
81
94
 
@@ -23,8 +23,6 @@ impl Tensor {
23
23
 
24
24
  pub struct Weights {
25
25
  map: HashMap<String, Tensor>,
26
- // Keep the mmap alive for the lifetime of loading; data is copied to Vec<f32>.
27
- _mmap: Mmap,
28
26
  }
29
27
 
30
28
  fn f16_to_f32(bits: u16) -> f32 {
@@ -81,7 +79,17 @@ impl Weights {
81
79
  };
82
80
  map.insert(name, Tensor { data, shape });
83
81
  }
84
- Ok(Weights { map, _mmap: mmap })
82
+ // Everything is copied into owned Vec<f32>, so the mmap (and the f32 file
83
+ // it maps) is dropped here instead of staying resident for the process life.
84
+ drop(st);
85
+ drop(mmap);
86
+ Ok(Weights { map })
87
+ }
88
+
89
+ /// Drop a tensor once its data has been folded/transposed elsewhere, freeing
90
+ /// the redundant f32 source copy.
91
+ pub fn remove(&mut self, name: &str) {
92
+ self.map.remove(name);
85
93
  }
86
94
 
87
95
  pub fn get(&self, name: &str) -> &Tensor {