Skip to content

Commit e6203bf

Browse files
authored
Merge pull request #176 from ausimian/feat/expr-compiler-conformance-native-lanes
Native + fusion compiler lanes for the conformance suites
2 parents 5ccc2ef + 1af3555 commit e6203bf

10 files changed

Lines changed: 173 additions & 34 deletions

test/emily/conformance/distilbert_test.exs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ defmodule Emily.Conformance.DistilbertTest do
3333

3434
use ExUnit.Case, async: false
3535

36-
import Emily.ConformanceHelper, only: [assert_all_close: 2, assert_all_close: 3]
36+
import Emily.ConformanceHelper, only: [assert_all_close: 2, assert_all_close: 3, mode_test: 2]
3737

3838
alias Emily.Bumblebee.FastKernels
3939

@@ -52,7 +52,7 @@ defmodule Emily.Conformance.DistilbertTest do
5252
:ok
5353
end
5454

55-
test ":base" do
55+
mode_test ":base" do
5656
assert {:ok, %{model: model, params: params, spec: spec}} =
5757
Bumblebee.load_model({:hf, "hf-internal-testing/tiny-random-DistilBertModel"})
5858

@@ -63,7 +63,7 @@ defmodule Emily.Conformance.DistilbertTest do
6363
"attention_mask" => Nx.tensor([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0]])
6464
}
6565

66-
outputs = Axon.predict(model, params, inputs)
66+
outputs = Axon.predict(model, params, inputs, predict_opts)
6767

6868
assert Nx.shape(outputs.hidden_state) == {1, 10, 32}
6969

@@ -75,7 +75,7 @@ defmodule Emily.Conformance.DistilbertTest do
7575
)
7676
end
7777

78-
test ":for_masked_language_modeling" do
78+
mode_test ":for_masked_language_modeling" do
7979
assert {:ok, %{model: model, params: params, spec: spec}} =
8080
Bumblebee.load_model({:hf, "hf-internal-testing/tiny-random-DistilBertForMaskedLM"})
8181

@@ -86,7 +86,7 @@ defmodule Emily.Conformance.DistilbertTest do
8686
"attention_mask" => Nx.tensor([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0]])
8787
}
8888

89-
outputs = Axon.predict(model, params, inputs)
89+
outputs = Axon.predict(model, params, inputs, predict_opts)
9090

9191
assert Nx.shape(outputs.logits) == {1, 10, 1124}
9292

@@ -98,7 +98,7 @@ defmodule Emily.Conformance.DistilbertTest do
9898
)
9999
end
100100

101-
test ":for_sequence_classification" do
101+
mode_test ":for_sequence_classification" do
102102
assert {:ok, %{model: model, params: params, spec: spec}} =
103103
Bumblebee.load_model(
104104
{:hf, "hf-internal-testing/tiny-random-DistilBertForSequenceClassification"}
@@ -111,14 +111,14 @@ defmodule Emily.Conformance.DistilbertTest do
111111
"attention_mask" => Nx.tensor([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0]])
112112
}
113113

114-
outputs = Axon.predict(model, params, inputs)
114+
outputs = Axon.predict(model, params, inputs, predict_opts)
115115

116116
assert Nx.shape(outputs.logits) == {1, 2}
117117

118118
assert_all_close(outputs.logits, Nx.tensor([[-0.0047, -0.0103]]))
119119
end
120120

121-
test ":for_token_classification" do
121+
mode_test ":for_token_classification" do
122122
assert {:ok, %{model: model, params: params, spec: spec}} =
123123
Bumblebee.load_model(
124124
{:hf, "hf-internal-testing/tiny-random-DistilBertForTokenClassification"}
@@ -131,7 +131,7 @@ defmodule Emily.Conformance.DistilbertTest do
131131
"attention_mask" => Nx.tensor([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0]])
132132
}
133133

134-
outputs = Axon.predict(model, params, inputs)
134+
outputs = Axon.predict(model, params, inputs, predict_opts)
135135

136136
assert Nx.shape(outputs.logits) == {1, 10, 2}
137137

@@ -141,7 +141,7 @@ defmodule Emily.Conformance.DistilbertTest do
141141
)
142142
end
143143

144-
test ":for_question_answering" do
144+
mode_test ":for_question_answering" do
145145
assert {:ok, %{model: model, params: params, spec: spec}} =
146146
Bumblebee.load_model(
147147
{:hf, "hf-internal-testing/tiny-random-DistilBertForQuestionAnswering"}
@@ -154,7 +154,7 @@ defmodule Emily.Conformance.DistilbertTest do
154154
"attention_mask" => Nx.tensor([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0]])
155155
}
156156

157-
outputs = Axon.predict(model, params, inputs)
157+
outputs = Axon.predict(model, params, inputs, predict_opts)
158158

159159
assert Nx.shape(outputs.start_logits) == {1, 10}
160160
assert Nx.shape(outputs.end_logits) == {1, 10}
@@ -170,7 +170,7 @@ defmodule Emily.Conformance.DistilbertTest do
170170
)
171171
end
172172

173-
test ":for_multiple_choice" do
173+
mode_test ":for_multiple_choice" do
174174
assert {:ok, %{model: model, params: params, spec: spec}} =
175175
Bumblebee.load_model(
176176
{:hf, "hf-internal-testing/tiny-random-DistilBertForMultipleChoice"}
@@ -183,7 +183,7 @@ defmodule Emily.Conformance.DistilbertTest do
183183
"attention_mask" => Nx.tensor([[[1, 1, 1, 1, 1, 1, 1, 1, 0, 0]]])
184184
}
185185

186-
outputs = Axon.predict(model, params, inputs)
186+
outputs = Axon.predict(model, params, inputs, predict_opts)
187187

188188
assert Nx.shape(outputs.logits) == {1, 1}
189189

test/emily/conformance/modernbert_test.exs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ defmodule Emily.Conformance.ModernBertTest do
3333
@moduletag :conformance
3434
@moduletag capture_log: true
3535

36-
test "ModernBert :base forward on Emily.Backend" do
36+
mode_test "ModernBert :base forward on Emily.Backend" do
3737
spec =
3838
Bumblebee.configure(ModernBert,
3939
architecture: :base,
@@ -47,7 +47,10 @@ defmodule Emily.Conformance.ModernBertTest do
4747
)
4848

4949
model = ModernBert.model(spec)
50-
{init_fn, predict_fn} = Axon.build(model)
50+
# Init on the evaluator (params are random-init, mode-irrelevant);
51+
# gate only the forward pass under `predict_opts`.
52+
{init_fn, _} = Axon.build(model)
53+
{_, predict_fn} = Axon.build(model, predict_opts)
5154

5255
input_template = %{
5356
"input_ids" => Nx.template({1, 8}, :s64),

test/emily/conformance/nomic_embeddings_test.exs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ defmodule Emily.Conformance.NomicEmbeddingsTest do
2727
@moduletag :conformance
2828
@moduletag capture_log: true
2929

30-
test "NomicBert :base forward runs end-to-end on Emily.Backend" do
30+
mode_test "NomicBert :base forward runs end-to-end on Emily.Backend" do
3131
spec =
3232
Bumblebee.configure(NomicBert,
3333
architecture: :base,
@@ -41,7 +41,10 @@ defmodule Emily.Conformance.NomicEmbeddingsTest do
4141
)
4242

4343
model = NomicBert.model(spec)
44-
{init_fn, predict_fn} = Axon.build(model)
44+
# Init on the evaluator (params are random-init, mode-irrelevant);
45+
# gate only the forward pass under `predict_opts`.
46+
{init_fn, _} = Axon.build(model)
47+
{_, predict_fn} = Axon.build(model, predict_opts)
4548

4649
input_template = %{
4750
"input_ids" => Nx.template({1, 8}, :s64),

test/emily/conformance/smollm3_test.exs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ defmodule Emily.Conformance.SmolLm3Test do
3030
@moduletag :conformance
3131
@moduletag capture_log: true
3232

33-
test "SmolLm3 :for_causal_language_modeling forward on Emily.Backend" do
33+
mode_test "SmolLm3 :for_causal_language_modeling forward on Emily.Backend" do
3434
spec =
3535
Bumblebee.configure(SmolLm3,
3636
architecture: :for_causal_language_modeling,
@@ -44,7 +44,10 @@ defmodule Emily.Conformance.SmolLm3Test do
4444
)
4545

4646
model = SmolLm3.model(spec)
47-
{init_fn, predict_fn} = Axon.build(model)
47+
# Init on the evaluator (params are random-init, mode-irrelevant);
48+
# gate only the forward pass under `predict_opts`.
49+
{init_fn, _} = Axon.build(model)
50+
{_, predict_fn} = Axon.build(model, predict_opts)
4851

4952
input_template = %{"input_ids" => Nx.template({1, 8}, :s64)}
5053
params = init_fn.(input_template, Axon.ModelState.empty())

test/emily/conformance/vit_full_test.exs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ defmodule Emily.Conformance.VitFullTest do
3030
@moduletag capture_log: true
3131
@moduletag timeout: 600_000
3232

33-
test "google/vit-base-patch16-224 forward pass matches pinned logits slice" do
33+
mode_test "google/vit-base-patch16-224 forward pass matches pinned logits slice",
34+
lane_tags: false do
3435
{:ok, %{model: model, params: params, spec: spec}} =
3536
Bumblebee.load_model({:hf, "google/vit-base-patch16-224"})
3637

@@ -42,7 +43,7 @@ defmodule Emily.Conformance.VitFullTest do
4243
"pixel_values" => Nx.broadcast(Nx.tensor(0.5, type: :f32), {1, 224, 224, 3})
4344
}
4445

45-
outputs = Axon.predict(model, params, inputs)
46+
outputs = Axon.predict(model, params, inputs, predict_opts)
4647

4748
assert Nx.shape(outputs.logits) == {1, 1000}
4849

test/emily/conformance/vit_test.exs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ defmodule Emily.Conformance.VitTest do
3131
@moduletag capture_log: true
3232
@moduletag timeout: 120_000
3333

34-
test ":base" do
34+
mode_test ":base" do
3535
assert {:ok, %{model: model, params: params, spec: spec}} =
3636
Bumblebee.load_model({:hf, "hf-internal-testing/tiny-random-ViTModel"})
3737

@@ -41,7 +41,7 @@ defmodule Emily.Conformance.VitTest do
4141
"pixel_values" => Nx.broadcast(0.5, {1, 30, 30, 3})
4242
}
4343

44-
outputs = Axon.predict(model, params, inputs)
44+
outputs = Axon.predict(model, params, inputs, predict_opts)
4545

4646
assert Nx.shape(outputs.hidden_state) == {1, 226, 32}
4747
assert Nx.shape(outputs.pooled_state) == {1, 32}
@@ -59,7 +59,7 @@ defmodule Emily.Conformance.VitTest do
5959
)
6060
end
6161

62-
test ":for_image_classification" do
62+
mode_test ":for_image_classification" do
6363
assert {:ok, %{model: model, params: params, spec: spec}} =
6464
Bumblebee.load_model(
6565
{:hf, "hf-internal-testing/tiny-random-ViTForImageClassification"}
@@ -71,7 +71,7 @@ defmodule Emily.Conformance.VitTest do
7171
"pixel_values" => Nx.broadcast(0.5, {1, 30, 30, 3})
7272
}
7373

74-
outputs = Axon.predict(model, params, inputs)
74+
outputs = Axon.predict(model, params, inputs, predict_opts)
7575

7676
assert Nx.shape(outputs.logits) == {1, 2}
7777

@@ -81,7 +81,7 @@ defmodule Emily.Conformance.VitTest do
8181
)
8282
end
8383

84-
test ":for_masked_image_modeling" do
84+
mode_test ":for_masked_image_modeling" do
8585
assert {:ok, %{model: model, params: params, spec: spec}} =
8686
Bumblebee.load_model(
8787
{:hf, "hf-internal-testing/tiny-random-ViTForMaskedImageModeling"}
@@ -93,7 +93,7 @@ defmodule Emily.Conformance.VitTest do
9393
"pixel_values" => Nx.broadcast(0.5, {1, 30, 30, 3})
9494
}
9595

96-
outputs = Axon.predict(model, params, inputs)
96+
outputs = Axon.predict(model, params, inputs, predict_opts)
9797

9898
assert Nx.shape(outputs.pixel_values) == {1, 30, 30, 3}
9999

test/emily/conformance/whisper_full_test.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ defmodule Emily.Conformance.WhisperFullTest do
3131
@moduletag capture_log: true
3232
@moduletag timeout: 600_000
3333

34-
test "openai/whisper-tiny forward pass matches pinned logits slice" do
34+
mode_test "openai/whisper-tiny forward pass matches pinned logits slice", lane_tags: false do
3535
{:ok, %{model: model, params: params, spec: spec}} =
3636
Bumblebee.load_model({:hf, "openai/whisper-tiny"})
3737

@@ -58,7 +58,7 @@ defmodule Emily.Conformance.WhisperFullTest do
5858
"decoder_attention_mask" => decoder_attention_mask
5959
}
6060

61-
outputs = Axon.predict(model, params, inputs)
61+
outputs = Axon.predict(model, params, inputs, predict_opts)
6262

6363
assert Nx.shape(outputs.logits) == {1, 6, 51_865}
6464

test/emily/conformance/whisper_test.exs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ defmodule Emily.Conformance.WhisperTest do
3131
@moduletag capture_log: true
3232
@moduletag timeout: 300_000
3333

34-
test ":base" do
34+
mode_test ":base" do
3535
assert {:ok, %{model: model, params: params, spec: spec}} =
3636
Bumblebee.load_model({:hf, "hf-internal-testing/tiny-random-WhisperModel"})
3737

@@ -43,7 +43,7 @@ defmodule Emily.Conformance.WhisperTest do
4343
"decoder_attention_mask" => Nx.tensor([[1, 1, 1, 1, 1, 1, 0, 0]])
4444
}
4545

46-
outputs = Axon.predict(model, params, inputs)
46+
outputs = Axon.predict(model, params, inputs, predict_opts)
4747

4848
assert Nx.shape(outputs.hidden_state) == {1, 8, 16}
4949

@@ -55,7 +55,7 @@ defmodule Emily.Conformance.WhisperTest do
5555
)
5656
end
5757

58-
test ":for_conditional_generation" do
58+
mode_test ":for_conditional_generation" do
5959
assert {:ok, %{model: model, params: params, spec: spec}} =
6060
Bumblebee.load_model(
6161
{:hf, "hf-internal-testing/tiny-random-WhisperForConditionalGeneration"}
@@ -69,7 +69,7 @@ defmodule Emily.Conformance.WhisperTest do
6969
"decoder_attention_mask" => Nx.tensor([[1, 1, 1, 1, 1, 1, 0, 0]])
7070
}
7171

72-
outputs = Axon.predict(model, params, inputs)
72+
outputs = Axon.predict(model, params, inputs, predict_opts)
7373

7474
assert Nx.shape(outputs.logits) == {1, 8, 50_257}
7575

0 commit comments

Comments
 (0)