informers 1.1.1 → 1.2.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/README.md +65 -24
- data/lib/informers/backends/onnx.rb +19 -0
- data/lib/informers/model.rb +1 -0
- data/lib/informers/models.rb +96 -13
- data/lib/informers/pipelines.rb +10 -3
- data/lib/informers/tokenizers.rb +2 -1
- data/lib/informers/utils/dtypes.rb +14 -0
- data/lib/informers/utils/hub.rb +11 -7
- data/lib/informers/version.rb +1 -1
- data/lib/informers.rb +2 -0
- metadata +5 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dfeaf81a8a597d5c25d340e38d0f0be665d3737a1cc271ece883e5b83472da31
|
4
|
+
data.tar.gz: 36943e4c472c864e5951a02ea336c47192e77bcc51161113e022675cce552b82
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f6f9a35abcdcb57ddd24c3d81498fa517df554a48b722d7fcee0776e950762ef6412f90916688ca273b95bac79b2441a92a26bcecdc27e2e3c504eafc2b39793
|
7
|
+
data.tar.gz: b85b9a12439001996c4a1580bfdca650ae920791867a3245531b8b13de0b082ebca5ee76be70e8581947e38cf7ebd8c6474d537234ccef4cddb04cc2c6b3dfa5
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
## 1.2.1 (2025-02-01)
|
2
|
+
|
3
|
+
- Fixed error when terminal width is zero
|
4
|
+
|
5
|
+
## 1.2.0 (2024-11-14)
|
6
|
+
|
7
|
+
- Added support for models with external data
|
8
|
+
- Added `device` option
|
9
|
+
- Added `dtype` option
|
10
|
+
- Added `session_options` option
|
11
|
+
|
1
12
|
## 1.1.1 (2024-10-14)
|
2
13
|
|
3
14
|
- Added `audio-classification` pipeline
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Informers
|
2
2
|
|
3
|
-
:fire: Fast [transformer](https://github.com/
|
3
|
+
:fire: Fast [transformer](https://github.com/huggingface/transformers.js) inference for Ruby
|
4
4
|
|
5
5
|
For non-ONNX models, check out [Transformers.rb](https://github.com/ankane/transformers-ruby) :slightly_smiling_face:
|
6
6
|
|
@@ -24,7 +24,9 @@ gem "informers"
|
|
24
24
|
Embedding
|
25
25
|
|
26
26
|
- [sentence-transformers/all-MiniLM-L6-v2](#sentence-transformersall-MiniLM-L6-v2)
|
27
|
-
- [
|
27
|
+
- [sentence-transformers/multi-qa-MiniLM-L6-cos-v1](#sentence-transformersmulti-qa-MiniLM-L6-cos-v1)
|
28
|
+
- [sentence-transformers/all-mpnet-base-v2](#sentence-transformersall-mpnet-base-v2)
|
29
|
+
- [sentence-transformers/paraphrase-MiniLM-L6-v2](#sentence-transformersparaphrase-minilm-l6-v2)
|
28
30
|
- [mixedbread-ai/mxbai-embed-large-v1](#mixedbread-aimxbai-embed-large-v1)
|
29
31
|
- [Supabase/gte-small](#supabasegte-small)
|
30
32
|
- [intfloat/e5-base-v2](#intfloate5-base-v2)
|
@@ -32,13 +34,13 @@ Embedding
|
|
32
34
|
- [BAAI/bge-base-en-v1.5](#baaibge-base-en-v15)
|
33
35
|
- [jinaai/jina-embeddings-v2-base-en](#jinaaijina-embeddings-v2-base-en)
|
34
36
|
- [Snowflake/snowflake-arctic-embed-m-v1.5](#snowflakesnowflake-arctic-embed-m-v15)
|
35
|
-
- [Xenova/all-mpnet-base-v2](#xenovaall-mpnet-base-v2)
|
36
37
|
|
37
38
|
Reranking
|
38
39
|
|
39
40
|
- [mixedbread-ai/mxbai-rerank-base-v1](#mixedbread-aimxbai-rerank-base-v1)
|
40
41
|
- [jinaai/jina-reranker-v1-turbo-en](#jinaaijina-reranker-v1-turbo-en)
|
41
42
|
- [BAAI/bge-reranker-base](#baaibge-reranker-base)
|
43
|
+
- [Xenova/ms-marco-MiniLM-L-6-v2](#xenovams-marco-minilm-l-6-v2)
|
42
44
|
|
43
45
|
### sentence-transformers/all-MiniLM-L6-v2
|
44
46
|
|
@@ -51,13 +53,7 @@ model = Informers.pipeline("embedding", "sentence-transformers/all-MiniLM-L6-v2"
|
|
51
53
|
embeddings = model.(sentences)
|
52
54
|
```
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
-
```ruby
|
57
|
-
model = Informers.pipeline("embedding", "Xenova/all-MiniLM-L6-v2", quantized: true)
|
58
|
-
```
|
59
|
-
|
60
|
-
### Xenova/multi-qa-MiniLM-L6-cos-v1
|
56
|
+
### sentence-transformers/multi-qa-MiniLM-L6-cos-v1
|
61
57
|
|
62
58
|
[Docs](https://huggingface.co/Xenova/multi-qa-MiniLM-L6-cos-v1)
|
63
59
|
|
@@ -65,13 +61,35 @@ model = Informers.pipeline("embedding", "Xenova/all-MiniLM-L6-v2", quantized: tr
|
|
65
61
|
query = "How many people live in London?"
|
66
62
|
docs = ["Around 9 Million people live in London", "London is known for its financial district"]
|
67
63
|
|
68
|
-
model = Informers.pipeline("embedding", "
|
64
|
+
model = Informers.pipeline("embedding", "sentence-transformers/multi-qa-MiniLM-L6-cos-v1")
|
69
65
|
query_embedding = model.(query)
|
70
66
|
doc_embeddings = model.(docs)
|
71
67
|
scores = doc_embeddings.map { |e| e.zip(query_embedding).sum { |d, q| d * q } }
|
72
68
|
doc_score_pairs = docs.zip(scores).sort_by { |d, s| -s }
|
73
69
|
```
|
74
70
|
|
71
|
+
### sentence-transformers/all-mpnet-base-v2
|
72
|
+
|
73
|
+
[Docs](https://huggingface.co/sentence-transformers/all-mpnet-base-v2)
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
sentences = ["This is an example sentence", "Each sentence is converted"]
|
77
|
+
|
78
|
+
model = Informers.pipeline("embedding", "sentence-transformers/all-mpnet-base-v2")
|
79
|
+
embeddings = model.(sentences)
|
80
|
+
```
|
81
|
+
|
82
|
+
### sentence-transformers/paraphrase-MiniLM-L6-v2
|
83
|
+
|
84
|
+
[Docs](https://huggingface.co/sentence-transformers/paraphrase-MiniLM-L6-v2)
|
85
|
+
|
86
|
+
```ruby
|
87
|
+
sentences = ["This is an example sentence", "Each sentence is converted"]
|
88
|
+
|
89
|
+
model = Informers.pipeline("embedding", "sentence-transformers/paraphrase-MiniLM-L6-v2")
|
90
|
+
embeddings = model.(sentences, normalize: false)
|
91
|
+
```
|
92
|
+
|
75
93
|
### mixedbread-ai/mxbai-embed-large-v1
|
76
94
|
|
77
95
|
[Docs](https://huggingface.co/mixedbread-ai/mxbai-embed-large-v1)
|
@@ -180,17 +198,6 @@ model = Informers.pipeline("embedding", "Snowflake/snowflake-arctic-embed-m-v1.5
|
|
180
198
|
embeddings = model.(input, model_output: "sentence_embedding", pooling: "none")
|
181
199
|
```
|
182
200
|
|
183
|
-
### Xenova/all-mpnet-base-v2
|
184
|
-
|
185
|
-
[Docs](https://huggingface.co/Xenova/all-mpnet-base-v2)
|
186
|
-
|
187
|
-
```ruby
|
188
|
-
sentences = ["This is an example sentence", "Each sentence is converted"]
|
189
|
-
|
190
|
-
model = Informers.pipeline("embedding", "Xenova/all-mpnet-base-v2")
|
191
|
-
embeddings = model.(sentences)
|
192
|
-
```
|
193
|
-
|
194
201
|
### mixedbread-ai/mxbai-rerank-base-v1
|
195
202
|
|
196
203
|
[Docs](https://huggingface.co/mixedbread-ai/mxbai-rerank-base-v1)
|
@@ -227,9 +234,21 @@ model = Informers.pipeline("reranking", "BAAI/bge-reranker-base")
|
|
227
234
|
result = model.(query, docs)
|
228
235
|
```
|
229
236
|
|
237
|
+
### Xenova/ms-marco-MiniLM-L-6-v2
|
238
|
+
|
239
|
+
[Docs](https://huggingface.co/Xenova/ms-marco-MiniLM-L-6-v2)
|
240
|
+
|
241
|
+
```ruby
|
242
|
+
query = "How many people live in London?"
|
243
|
+
docs = ["Around 9 Million people live in London", "London is known for its financial district"]
|
244
|
+
|
245
|
+
model = Informers.pipeline("reranking", "Xenova/ms-marco-MiniLM-L-6-v2")
|
246
|
+
result = model.(query, docs)
|
247
|
+
```
|
248
|
+
|
230
249
|
### Other
|
231
250
|
|
232
|
-
The model must include a `.onnx` file ([example](https://huggingface.co/Xenova/all-MiniLM-L6-v2/tree/main/onnx)). If the file is not at `onnx/model.onnx
|
251
|
+
The model must include a `.onnx` file ([example](https://huggingface.co/Xenova/all-MiniLM-L6-v2/tree/main/onnx)). If the file is not at `onnx/model.onnx`, use the `model_file_name` option to specify the location.
|
233
252
|
|
234
253
|
## Pipelines
|
235
254
|
|
@@ -411,9 +430,31 @@ qa = Informers.pipeline("document-question-answering")
|
|
411
430
|
qa.("image.jpg", "What is the invoice number?")
|
412
431
|
```
|
413
432
|
|
433
|
+
## Reference
|
434
|
+
|
435
|
+
Specify a variant of the model if available (`fp32`, `fp16`, `int8`, `uint8`, `q8`, `q4`, `q4f16`, or `bnb4`)
|
436
|
+
|
437
|
+
```ruby
|
438
|
+
Informers.pipeline("embedding", "Xenova/all-MiniLM-L6-v2", dtype: "fp16")
|
439
|
+
```
|
440
|
+
|
441
|
+
Specify a device (`cpu`, `cuda`, or `coreml`)
|
442
|
+
|
443
|
+
```ruby
|
444
|
+
Informers.pipeline("embedding", device: "cuda")
|
445
|
+
```
|
446
|
+
|
447
|
+
Note: Follow [these instructions](https://github.com/ankane/onnxruntime-ruby?tab=readme-ov-file#gpu-support) for `cuda`
|
448
|
+
|
449
|
+
Specify ONNX Runtime [session options](https://github.com/ankane/onnxruntime-ruby?tab=readme-ov-file#session-options)
|
450
|
+
|
451
|
+
```ruby
|
452
|
+
Informers.pipeline("embedding", session_options: {log_severity_level: 2})
|
453
|
+
```
|
454
|
+
|
414
455
|
## Credits
|
415
456
|
|
416
|
-
This library was ported from [Transformers.js](https://github.com/
|
457
|
+
This library was ported from [Transformers.js](https://github.com/huggingface/transformers.js) and is available under the same license.
|
417
458
|
|
418
459
|
## Upgrading
|
419
460
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Informers
|
2
|
+
module Backends
|
3
|
+
module Onnx
|
4
|
+
def self.device_to_execution_providers(device)
|
5
|
+
case device&.to_s
|
6
|
+
when "cpu", nil
|
7
|
+
[]
|
8
|
+
when "cuda"
|
9
|
+
["CUDAExecutionProvider"]
|
10
|
+
when "coreml"
|
11
|
+
["CoreMLExecutionProvider"]
|
12
|
+
else
|
13
|
+
supported_devices = ["cpu", "cuda", "coreml"]
|
14
|
+
raise ArgumentError, "Unsupported device: #{device}. Should be one of: #{supported_devices.join(", ")}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/informers/model.rb
CHANGED
data/lib/informers/models.rb
CHANGED
@@ -22,7 +22,10 @@ module Informers
|
|
22
22
|
cache_dir: nil,
|
23
23
|
local_files_only: false,
|
24
24
|
revision: "main",
|
25
|
-
|
25
|
+
device: nil,
|
26
|
+
dtype: nil,
|
27
|
+
model_file_name: nil,
|
28
|
+
session_options: {}
|
26
29
|
)
|
27
30
|
options = {
|
28
31
|
quantized:,
|
@@ -31,7 +34,10 @@ module Informers
|
|
31
34
|
cache_dir:,
|
32
35
|
local_files_only:,
|
33
36
|
revision:,
|
34
|
-
|
37
|
+
device:,
|
38
|
+
dtype:,
|
39
|
+
model_file_name:,
|
40
|
+
session_options:
|
35
41
|
}
|
36
42
|
config = AutoConfig.from_pretrained(pretrained_model_name_or_path, **options)
|
37
43
|
if options[:config].nil?
|
@@ -109,7 +115,10 @@ module Informers
|
|
109
115
|
cache_dir: nil,
|
110
116
|
local_files_only: false,
|
111
117
|
revision: "main",
|
112
|
-
|
118
|
+
device: nil,
|
119
|
+
dtype: nil,
|
120
|
+
model_file_name: nil,
|
121
|
+
session_options: {}
|
113
122
|
)
|
114
123
|
options = {
|
115
124
|
quantized:,
|
@@ -118,22 +127,25 @@ module Informers
|
|
118
127
|
cache_dir:,
|
119
128
|
local_files_only:,
|
120
129
|
revision:,
|
121
|
-
|
130
|
+
device:,
|
131
|
+
dtype:,
|
132
|
+
model_file_name:,
|
133
|
+
session_options:
|
122
134
|
}
|
123
135
|
|
124
136
|
model_name = MODEL_CLASS_TO_NAME_MAPPING[self]
|
125
137
|
model_type = MODEL_TYPE_MAPPING[model_name]
|
126
138
|
|
139
|
+
config ||= AutoConfig.from_pretrained(pretrained_model_name_or_path, **options)
|
140
|
+
|
127
141
|
if model_type == MODEL_TYPES[:DecoderOnly]
|
128
142
|
info = [
|
129
|
-
AutoConfig.from_pretrained(pretrained_model_name_or_path, **options),
|
130
143
|
construct_session(pretrained_model_name_or_path, options[:model_file_name] || "decoder_model_merged", **options),
|
131
144
|
Utils::Hub.get_model_json(pretrained_model_name_or_path, "generation_config.json", false, **options)
|
132
145
|
]
|
133
146
|
|
134
147
|
elsif model_type == MODEL_TYPES[:Seq2Seq] || model_type == MODEL_TYPES[:Vision2Seq]
|
135
148
|
info = [
|
136
|
-
AutoConfig.from_pretrained(pretrained_model_name_or_path, **options),
|
137
149
|
construct_session(pretrained_model_name_or_path, "encoder_model", **options),
|
138
150
|
construct_session(pretrained_model_name_or_path, "decoder_model_merged", **options),
|
139
151
|
Utils::Hub.get_model_json(pretrained_model_name_or_path, "generation_config.json", false, **options)
|
@@ -141,14 +153,12 @@ module Informers
|
|
141
153
|
|
142
154
|
elsif model_type == MODEL_TYPES[:MaskGeneration]
|
143
155
|
info = [
|
144
|
-
AutoConfig.from_pretrained(pretrained_model_name_or_path, **options),
|
145
156
|
construct_session(pretrained_model_name_or_path, "vision_encoder", **options),
|
146
157
|
construct_session(pretrained_model_name_or_path, "prompt_encoder_mask_decoder", **options)
|
147
158
|
]
|
148
159
|
|
149
160
|
elsif model_type == MODEL_TYPES[:EncoderDecoder]
|
150
161
|
info = [
|
151
|
-
AutoConfig.from_pretrained(pretrained_model_name_or_path, **options),
|
152
162
|
construct_session(pretrained_model_name_or_path, "encoder_model", **options),
|
153
163
|
construct_session(pretrained_model_name_or_path, "decoder_model_merged", **options)
|
154
164
|
]
|
@@ -158,12 +168,11 @@ module Informers
|
|
158
168
|
warn "Model type for '#{model_name || config[:model_type]}' not found, assuming encoder-only architecture. Please report this."
|
159
169
|
end
|
160
170
|
info = [
|
161
|
-
AutoConfig.from_pretrained(pretrained_model_name_or_path, **options),
|
162
171
|
construct_session(pretrained_model_name_or_path, options[:model_file_name] || "model", **options)
|
163
172
|
]
|
164
173
|
end
|
165
174
|
|
166
|
-
new(*info)
|
175
|
+
new(config, *info)
|
167
176
|
end
|
168
177
|
|
169
178
|
def self.construct_session(pretrained_model_name_or_path, file_name, **options)
|
@@ -175,10 +184,27 @@ module Informers
|
|
175
184
|
prefix = ""
|
176
185
|
file_name = file_name[1..]
|
177
186
|
end
|
178
|
-
|
187
|
+
dtype = options[:dtype] || (options[:quantized] ? "q8" : "fp32")
|
188
|
+
suffix = Utils::DEFAULT_DTYPE_SUFFIX_MAPPING[dtype.to_sym]
|
189
|
+
if !suffix
|
190
|
+
raise ArgumentError, "Invalid dtype: #{dtype}. Should be one of: #{Utils::DEFAULT_DTYPE_SUFFIX_MAPPING.keys.join(", ")}"
|
191
|
+
end
|
192
|
+
model_file_name = "#{prefix}#{file_name}#{suffix}.onnx"
|
179
193
|
path = Utils::Hub.get_model_file(pretrained_model_name_or_path, model_file_name, true, **options)
|
180
194
|
|
181
|
-
|
195
|
+
session_options = {
|
196
|
+
providers: Backends::Onnx.device_to_execution_providers(options[:device]),
|
197
|
+
log_severity_level: 4
|
198
|
+
}.merge(options[:session_options] || {})
|
199
|
+
|
200
|
+
begin
|
201
|
+
OnnxRuntime::InferenceSession.new(path, **session_options)
|
202
|
+
rescue OnnxRuntime::Error => e
|
203
|
+
raise e unless e.message.include?("No such file or directory") && e.message.include?(".onnx_data")
|
204
|
+
|
205
|
+
Utils::Hub.get_model_file(pretrained_model_name_or_path, "#{model_file_name}_data", true, **options)
|
206
|
+
OnnxRuntime::InferenceSession.new(path, **session_options)
|
207
|
+
end
|
182
208
|
end
|
183
209
|
|
184
210
|
def call(model_inputs, **kwargs)
|
@@ -783,12 +809,49 @@ module Informers
|
|
783
809
|
end
|
784
810
|
end
|
785
811
|
|
812
|
+
class ModernBertPreTrainedModel < PreTrainedModel
|
813
|
+
end
|
814
|
+
|
815
|
+
class ModernBertModel < ModernBertPreTrainedModel
|
816
|
+
end
|
817
|
+
|
818
|
+
class ModernBertForMaskedLM < ModernBertPreTrainedModel
|
819
|
+
def call(model_inputs)
|
820
|
+
MaskedLMOutput.new(*super(model_inputs))
|
821
|
+
end
|
822
|
+
end
|
823
|
+
|
824
|
+
class ModernBertForSequenceClassification < ModernBertPreTrainedModel
|
825
|
+
def call(model_inputs)
|
826
|
+
SequenceClassifierOutput.new(*super(model_inputs))
|
827
|
+
end
|
828
|
+
end
|
829
|
+
|
830
|
+
class ModernBertForTokenClassification < ModernBertPreTrainedModel
|
831
|
+
def call(model_inputs)
|
832
|
+
TokenClassifierOutput.new(*super(model_inputs))
|
833
|
+
end
|
834
|
+
end
|
835
|
+
|
786
836
|
class NomicBertPreTrainedModel < PreTrainedModel
|
787
837
|
end
|
788
838
|
|
789
839
|
class NomicBertModel < NomicBertPreTrainedModel
|
790
840
|
end
|
791
841
|
|
842
|
+
class ConvBertPreTrainedModel < PreTrainedModel
|
843
|
+
end
|
844
|
+
|
845
|
+
class ConvBertModel < ConvBertPreTrainedModel
|
846
|
+
end
|
847
|
+
|
848
|
+
class ElectraPreTrainedModel < PreTrainedModel
|
849
|
+
end
|
850
|
+
|
851
|
+
# TODO add ElectraForPreTraining
|
852
|
+
class ElectraModel < ElectraPreTrainedModel
|
853
|
+
end
|
854
|
+
|
792
855
|
class DebertaV2PreTrainedModel < PreTrainedModel
|
793
856
|
end
|
794
857
|
|
@@ -939,6 +1002,18 @@ module Informers
|
|
939
1002
|
end
|
940
1003
|
end
|
941
1004
|
|
1005
|
+
class RobertaForTokenClassification < RobertaPreTrainedModel
|
1006
|
+
def call(model_inputs)
|
1007
|
+
TokenClassifierOutput.new(*super(model_inputs))
|
1008
|
+
end
|
1009
|
+
end
|
1010
|
+
|
1011
|
+
class RobertaForSequenceClassification < RobertaPreTrainedModel
|
1012
|
+
def call(model_inputs)
|
1013
|
+
SequenceClassifierOutput.new(*super(model_inputs))
|
1014
|
+
end
|
1015
|
+
end
|
1016
|
+
|
942
1017
|
class XLMRobertaPreTrainedModel < PreTrainedModel
|
943
1018
|
end
|
944
1019
|
|
@@ -1147,7 +1222,10 @@ module Informers
|
|
1147
1222
|
|
1148
1223
|
MODEL_MAPPING_NAMES_ENCODER_ONLY = {
|
1149
1224
|
"bert" => ["BertModel", BertModel],
|
1225
|
+
"modernbert" => ["ModernBertModel", ModernBertModel],
|
1150
1226
|
"nomic_bert" => ["NomicBertModel", NomicBertModel],
|
1227
|
+
"electra" => ["ElectraModel", ElectraModel],
|
1228
|
+
"convbert" => ["ConvBertModel", ConvBertModel],
|
1151
1229
|
"deberta-v2" => ["DebertaV2Model", DebertaV2Model],
|
1152
1230
|
"mpnet" => ["MPNetModel", MPNetModel],
|
1153
1231
|
"distilbert" => ["DistilBertModel", DistilBertModel],
|
@@ -1182,13 +1260,17 @@ module Informers
|
|
1182
1260
|
|
1183
1261
|
MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES = {
|
1184
1262
|
"bert" => ["BertForSequenceClassification", BertForSequenceClassification],
|
1263
|
+
"modernbert" => ["ModernBertForSequenceClassification", ModernBertForSequenceClassification],
|
1185
1264
|
"distilbert" => ["DistilBertForSequenceClassification", DistilBertForSequenceClassification],
|
1265
|
+
"roberta" => ["RobertaForSequenceClassification", RobertaForSequenceClassification],
|
1186
1266
|
"xlm-roberta" => ["XLMRobertaForSequenceClassification", XLMRobertaForSequenceClassification],
|
1187
1267
|
"bart" => ["BartForSequenceClassification", BartForSequenceClassification]
|
1188
1268
|
}
|
1189
1269
|
|
1190
1270
|
MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES = {
|
1191
|
-
"bert" => ["BertForTokenClassification", BertForTokenClassification]
|
1271
|
+
"bert" => ["BertForTokenClassification", BertForTokenClassification],
|
1272
|
+
"modernbert" => ["ModernBertForTokenClassification", ModernBertForTokenClassification],
|
1273
|
+
"roberta" => ["RobertaForTokenClassification", RobertaForTokenClassification]
|
1192
1274
|
}
|
1193
1275
|
|
1194
1276
|
MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES = {
|
@@ -1204,6 +1286,7 @@ module Informers
|
|
1204
1286
|
|
1205
1287
|
MODEL_FOR_MASKED_LM_MAPPING_NAMES = {
|
1206
1288
|
"bert" => ["BertForMaskedLM", BertForMaskedLM],
|
1289
|
+
"modernbert" => ["ModernBertForMaskedLM", ModernBertForMaskedLM],
|
1207
1290
|
"roberta" => ["RobertaForMaskedLM", RobertaForMaskedLM]
|
1208
1291
|
}
|
1209
1292
|
|
data/lib/informers/pipelines.rb
CHANGED
@@ -1336,6 +1336,7 @@ module Informers
|
|
1336
1336
|
stream = $stderr
|
1337
1337
|
tty = stream.tty?
|
1338
1338
|
width = tty ? stream.winsize[1] : 80
|
1339
|
+
width = 80 if width == 0
|
1339
1340
|
|
1340
1341
|
if msg[:status] == "progress" && tty
|
1341
1342
|
stream.print "\r#{Utils::Hub.display_progress(msg[:file], width, msg[:size], msg[:total_size])}"
|
@@ -1360,13 +1361,16 @@ module Informers
|
|
1360
1361
|
cache_dir: nil,
|
1361
1362
|
local_files_only: false,
|
1362
1363
|
revision: "main",
|
1363
|
-
|
1364
|
+
device: nil,
|
1365
|
+
dtype: nil,
|
1366
|
+
model_file_name: nil,
|
1367
|
+
session_options: {}
|
1364
1368
|
)
|
1365
1369
|
# Apply aliases
|
1366
1370
|
task = TASK_ALIASES[task] || task
|
1367
1371
|
|
1368
1372
|
if quantized == NO_DEFAULT
|
1369
|
-
# TODO
|
1373
|
+
# TODO no quantization by default in 2.0
|
1370
1374
|
quantized = ["text-classification", "token-classification", "question-answering", "feature-extraction"].include?(task)
|
1371
1375
|
end
|
1372
1376
|
|
@@ -1389,7 +1393,10 @@ module Informers
|
|
1389
1393
|
cache_dir:,
|
1390
1394
|
local_files_only:,
|
1391
1395
|
revision:,
|
1392
|
-
|
1396
|
+
device:,
|
1397
|
+
dtype:,
|
1398
|
+
model_file_name:,
|
1399
|
+
session_options:
|
1393
1400
|
}
|
1394
1401
|
|
1395
1402
|
classes = {
|
data/lib/informers/tokenizers.rb
CHANGED
@@ -261,7 +261,8 @@ module Informers
|
|
261
261
|
"GPT2Tokenizer" => GPT2Tokenizer,
|
262
262
|
"NllbTokenizer" => NllbTokenizer,
|
263
263
|
"M2M100Tokenizer" => M2M100Tokenizer,
|
264
|
-
"SpeechT5Tokenizer" => SpeechT5Tokenizer
|
264
|
+
"SpeechT5Tokenizer" => SpeechT5Tokenizer,
|
265
|
+
"PreTrainedTokenizer" => PreTrainedTokenizer
|
265
266
|
}
|
266
267
|
|
267
268
|
def self.from_pretrained(
|
data/lib/informers/utils/hub.rb
CHANGED
@@ -81,12 +81,18 @@ module Informers
|
|
81
81
|
file if file.exists
|
82
82
|
end
|
83
83
|
|
84
|
-
def put(request,
|
84
|
+
def put(request, response)
|
85
85
|
output_path = resolve_path(request)
|
86
86
|
|
87
87
|
begin
|
88
|
+
tmp_path = "#{output_path}.incomplete"
|
88
89
|
FileUtils.mkdir_p(File.dirname(output_path))
|
89
|
-
File.
|
90
|
+
File.open(tmp_path, "wb") do |f|
|
91
|
+
while !response.eof?
|
92
|
+
f.write(response.read(1024 * 1024))
|
93
|
+
end
|
94
|
+
end
|
95
|
+
FileUtils.move(tmp_path, output_path)
|
90
96
|
rescue => e
|
91
97
|
warn "An error occurred while writing the file to cache: #{e}"
|
92
98
|
end
|
@@ -189,10 +195,8 @@ module Informers
|
|
189
195
|
to_cache_response = cache && !response.is_a?(FileResponse) && response.status[0] == "200"
|
190
196
|
end
|
191
197
|
|
192
|
-
buffer = response.read
|
193
|
-
|
194
198
|
if to_cache_response && cache_key && cache.match(cache_key).nil?
|
195
|
-
cache.put(cache_key,
|
199
|
+
cache.put(cache_key, response)
|
196
200
|
end
|
197
201
|
|
198
202
|
Utils.dispatch_callback(options[:progress_callback], {
|
@@ -229,8 +233,8 @@ module Informers
|
|
229
233
|
end
|
230
234
|
|
231
235
|
def self.display_progress(filename, width, size, expected_size)
|
232
|
-
bar_width = width - (filename.length + 3)
|
233
|
-
progress = size / expected_size.to_f
|
236
|
+
bar_width = [width - (filename.length + 3), 1].max
|
237
|
+
progress = expected_size && expected_size > 0 ? size / expected_size.to_f : 0
|
234
238
|
done = (progress * bar_width).round
|
235
239
|
not_done = bar_width - done
|
236
240
|
"#{filename} |#{"█" * done}#{" " * not_done}|"
|
data/lib/informers/version.rb
CHANGED
data/lib/informers.rb
CHANGED
@@ -11,8 +11,10 @@ require "stringio"
|
|
11
11
|
require "uri"
|
12
12
|
|
13
13
|
# modules
|
14
|
+
require_relative "informers/backends/onnx"
|
14
15
|
require_relative "informers/utils/audio"
|
15
16
|
require_relative "informers/utils/core"
|
17
|
+
require_relative "informers/utils/dtypes"
|
16
18
|
require_relative "informers/utils/generation"
|
17
19
|
require_relative "informers/utils/ffmpeg"
|
18
20
|
require_relative "informers/utils/hub"
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: informers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 2025-02-01 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: onnxruntime
|
@@ -38,7 +37,6 @@ dependencies:
|
|
38
37
|
- - ">="
|
39
38
|
- !ruby/object:Gem::Version
|
40
39
|
version: 0.5.3
|
41
|
-
description:
|
42
40
|
email: andrew@ankane.org
|
43
41
|
executables: []
|
44
42
|
extensions: []
|
@@ -48,6 +46,7 @@ files:
|
|
48
46
|
- LICENSE.txt
|
49
47
|
- README.md
|
50
48
|
- lib/informers.rb
|
49
|
+
- lib/informers/backends/onnx.rb
|
51
50
|
- lib/informers/configs.rb
|
52
51
|
- lib/informers/env.rb
|
53
52
|
- lib/informers/model.rb
|
@@ -57,6 +56,7 @@ files:
|
|
57
56
|
- lib/informers/tokenizers.rb
|
58
57
|
- lib/informers/utils/audio.rb
|
59
58
|
- lib/informers/utils/core.rb
|
59
|
+
- lib/informers/utils/dtypes.rb
|
60
60
|
- lib/informers/utils/ffmpeg.rb
|
61
61
|
- lib/informers/utils/generation.rb
|
62
62
|
- lib/informers/utils/hub.rb
|
@@ -68,7 +68,6 @@ homepage: https://github.com/ankane/informers
|
|
68
68
|
licenses:
|
69
69
|
- Apache-2.0
|
70
70
|
metadata: {}
|
71
|
-
post_install_message:
|
72
71
|
rdoc_options: []
|
73
72
|
require_paths:
|
74
73
|
- lib
|
@@ -83,8 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
82
|
- !ruby/object:Gem::Version
|
84
83
|
version: '0'
|
85
84
|
requirements: []
|
86
|
-
rubygems_version: 3.
|
87
|
-
signing_key:
|
85
|
+
rubygems_version: 3.6.2
|
88
86
|
specification_version: 4
|
89
87
|
summary: Fast transformer inference for Ruby
|
90
88
|
test_files: []
|