Current section

Files

Jump to
viva_tensor src viva_tensor@models@bert.erl
Raw

src/viva_tensor@models@bert.erl

-module(viva_tensor@models@bert).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/viva_tensor/models/bert.gleam").
-export([bert_embedding_init/4, bert_embedding_forward/3, bert_block_init/3, bert_block_forward/2, bert_model_init/6, bert_model_forward/3]).
-export_type([bert_embedding/0, bert_block/0, bert_model/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type bert_embedding() :: {bert_embedding,
viva_tensor@nn@embedding:embedding(),
viva_tensor@nn@embedding:learned_positional_encoding(),
viva_tensor@nn@embedding:embedding(),
viva_tensor@nn@norm:layer_norm()}.
-type bert_block() :: {bert_block, viva_tensor@nn@transformer:encoder_block()}.
-type bert_model() :: {bert_model, bert_embedding(), list(bert_block())}.
-file("src/viva_tensor/models/bert.gleam", 68).
?DOC(false).
-spec bert_embedding_init(integer(), integer(), integer(), integer()) -> bert_embedding().
bert_embedding_init(Vocab_size, Embed_dim, Max_position, Num_token_types) ->
{bert_embedding,
viva_tensor@nn@embedding:embedding_init(Vocab_size, Embed_dim),
viva_tensor@nn@embedding:learned_positional_init(
Max_position,
Embed_dim
),
viva_tensor@nn@embedding:embedding_init(Num_token_types, Embed_dim),
viva_tensor@nn@norm:layer_norm_init(Embed_dim)}.
-file("src/viva_tensor/models/bert.gleam", 88).
?DOC(false).
-spec bert_embedding_forward(
bert_embedding(),
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor()
) -> {ok, viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
bert_embedding_forward(Layer, Token_ids, Token_type_ids) ->
gleam@result:'try'(
viva_tensor@nn@embedding:embedding_forward(
erlang:element(2, Layer),
Token_ids
),
fun(Word) ->
Seq_len = case erlang:element(3, Word) of
[S, _] ->
S;
_ ->
0
end,
gleam@result:'try'(
viva_tensor@nn@embedding:learned_positional_forward(
erlang:element(3, Layer),
Seq_len
),
fun(Pos) ->
gleam@result:'try'(
viva_tensor@nn@embedding:embedding_forward(
erlang:element(4, Layer),
Token_type_ids
),
fun(Tt) ->
gleam@result:'try'(
viva_tensor@tensor:add(Word, Pos),
fun(Sum1) ->
gleam@result:'try'(
viva_tensor@tensor:add(Sum1, Tt),
fun(Sum2) ->
viva_tensor@nn@norm:layer_norm_forward(
erlang:element(5, Layer),
Sum2
)
end
)
end
)
end
)
end
)
end
).
-file("src/viva_tensor/models/bert.gleam", 130).
?DOC(false).
-spec bert_block_init(integer(), integer(), integer()) -> {ok, bert_block()} |
{error, viva_tensor@core@error:tensor_error()}.
bert_block_init(Embed_dim, Num_heads, Ffn_hidden_dim) ->
gleam@result:'try'(
viva_tensor@nn@transformer:encoder_block_init(
Embed_dim,
Num_heads,
Ffn_hidden_dim,
gelu_act
),
fun(Enc) -> {ok, {bert_block, Enc}} end
).
-file("src/viva_tensor/models/bert.gleam", 148).
?DOC(false).
-spec bert_block_forward(bert_block(), viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
bert_block_forward(Block, Input) ->
viva_tensor@nn@transformer:encoder_block_forward(
erlang:element(2, Block),
Input,
false
).
-file("src/viva_tensor/models/bert.gleam", 173).
?DOC(false).
-spec bert_model_init(
integer(),
integer(),
integer(),
integer(),
integer(),
integer()
) -> {ok, bert_model()} | {error, viva_tensor@core@error:tensor_error()}.
bert_model_init(
Num_layers,
Vocab_size,
Embed_dim,
Num_heads,
Ffn_hidden_dim,
Max_position
) ->
gleam@result:'try'(
begin
_pipe = gleam@list:repeat(nil, Num_layers),
gleam@list:try_map(
_pipe,
fun(_) ->
bert_block_init(Embed_dim, Num_heads, Ffn_hidden_dim)
end
)
end,
fun(Blocks) ->
{ok,
{bert_model,
bert_embedding_init(Vocab_size, Embed_dim, Max_position, 2),
Blocks}}
end
).
-file("src/viva_tensor/models/bert.gleam", 198).
?DOC(false).
-spec bert_model_forward(
bert_model(),
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor()
) -> {ok, viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
bert_model_forward(Model, Token_ids, Token_type_ids) ->
gleam@result:'try'(
bert_embedding_forward(
erlang:element(2, Model),
Token_ids,
Token_type_ids
),
fun(H0) ->
gleam@list:try_fold(
erlang:element(3, Model),
H0,
fun(Acc, Block) -> bert_block_forward(Block, Acc) end
)
end
).