Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,16 @@
from ...modeling_layers import GradientCheckpointingLayer
from ...modeling_outputs import BaseModelOutputWithPastAndCrossAttentions
from ...modeling_utils import ALL_ATTENTION_FUNCTIONS, PreTrainedModel
from ...processing_utils import Unpack
from ...pytorch_utils import Conv1D
from ...utils import (
ModelOutput,
TransformersKwargs,
auto_docstring,
logging,
)
from ...utils.generic import maybe_autocast
from ...utils.generic import maybe_autocast, merge_with_config_defaults
from ...utils.output_capturing import OutputRecorder, capture_outputs
from .configuration_decision_transformer import DecisionTransformerConfig


Expand Down Expand Up @@ -278,18 +281,16 @@ def forward(
encoder_hidden_states: torch.Tensor | None = None,
encoder_attention_mask: torch.FloatTensor | None = None,
use_cache: bool | None = False,
output_attentions: bool | None = False,
**kwargs,
) -> tuple[torch.Tensor] | tuple[torch.Tensor, tuple[torch.FloatTensor, ...]] | None:
) -> torch.Tensor:
residual = hidden_states
hidden_states = self.ln_1(hidden_states)
attn_output, self_attn_weights = self.attn(
attn_output, _ = self.attn(
hidden_states,
past_key_values=past_key_values,
cache_position=cache_position,
attention_mask=attention_mask,
use_cache=use_cache,
output_attentions=output_attentions,
**kwargs,
)
# residual connection
Expand All @@ -304,13 +305,12 @@ def forward(
)
residual = hidden_states
hidden_states = self.ln_cross_attn(hidden_states)
cross_attn_output, cross_attn_weights = self.crossattention(
cross_attn_output, _ = self.crossattention(
hidden_states,
past_key_values=past_key_values,
attention_mask=attention_mask,
encoder_hidden_states=encoder_hidden_states,
encoder_attention_mask=encoder_attention_mask,
output_attentions=output_attentions,
)
# residual connection
hidden_states = residual + cross_attn_output
Expand All @@ -321,13 +321,7 @@ def forward(
# residual connection
hidden_states = residual + feed_forward_hidden_states

outputs = (hidden_states,)
if output_attentions:
outputs += (self_attn_weights,)
if encoder_hidden_states is not None:
outputs += (cross_attn_weights,)

return outputs
return hidden_states


@auto_docstring
Expand All @@ -336,6 +330,11 @@ class DecisionTransformerGPT2PreTrainedModel(PreTrainedModel):
base_model_prefix = "transformer"
supports_gradient_checkpointing = True
_can_compile_fullgraph = False
_can_record_outputs = {
"hidden_states": DecisionTransformerGPT2Block,
"attentions": OutputRecorder(DecisionTransformerGPT2Attention, layer_name=".attn", index=1),
"cross_attentions": OutputRecorder(DecisionTransformerGPT2Attention, layer_name=".crossattention", index=1),
}

# No longer used as we directly use our masks instead
_keys_to_ignore_on_load_unexpected = ["attn.bias", "crossattention.bias"]
Expand Down Expand Up @@ -384,6 +383,8 @@ def get_input_embeddings(self):
def set_input_embeddings(self, new_embeddings):
self.wte = new_embeddings

@merge_with_config_defaults
@capture_outputs
def forward(
self,
input_ids: torch.LongTensor | None = None,
Expand All @@ -396,18 +397,8 @@ def forward(
encoder_hidden_states: torch.Tensor | None = None,
encoder_attention_mask: torch.FloatTensor | None = None,
use_cache: bool | None = None,
output_attentions: bool | None = None,
output_hidden_states: bool | None = None,
return_dict: bool | None = None,
**kwargs,
) -> tuple | BaseModelOutputWithPastAndCrossAttentions:
output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
output_hidden_states = (
output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
)
use_cache = use_cache if use_cache is not None else self.config.use_cache
return_dict = return_dict if return_dict is not None else self.config.use_return_dict

**kwargs: Unpack[TransformersKwargs],
) -> BaseModelOutputWithPastAndCrossAttentions:
if input_ids is not None and inputs_embeds is not None:
raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time")
elif input_ids is not None:
Expand Down Expand Up @@ -476,50 +467,26 @@ def forward(
"`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..."
)
use_cache = False

all_self_attentions = () if output_attentions else None
all_cross_attentions = () if output_attentions and self.config.add_cross_attention else None
all_hidden_states = () if output_hidden_states else None
for block in self.h:
outputs = block(
hidden_states = block(
hidden_states,
past_key_values if not (self.gradient_checkpointing and self.training) else None,
cache_position,
attention_mask,
encoder_hidden_states, # as a positional argument for gradient checkpointing
encoder_attention_mask=encoder_attention_mask,
use_cache=use_cache,
output_attentions=output_attentions,
**kwargs,
)

hidden_states = outputs[0]

if output_attentions:
all_self_attentions = all_self_attentions + (outputs[1],)
if self.config.add_cross_attention:
all_cross_attentions = all_cross_attentions + (outputs[2],)

hidden_states = self.ln_f(hidden_states)

hidden_states = hidden_states.view(output_shape)
# Add last hidden state
if output_hidden_states:
all_hidden_states = all_hidden_states + (hidden_states,)

past_key_values = past_key_values if use_cache else None
if not return_dict:
return tuple(
v
for v in [hidden_states, past_key_values, all_hidden_states, all_self_attentions, all_cross_attentions]
if v is not None
)

return BaseModelOutputWithPastAndCrossAttentions(
last_hidden_state=hidden_states,
past_key_values=past_key_values,
hidden_states=all_hidden_states,
attentions=all_self_attentions,
cross_attentions=all_cross_attentions,
)


Expand Down
Loading