code: def make_bitransformer(
      input_vocab_size=gin.REQUIRED,
      output_vocab_size=gin.REQUIRED,
      layout=None,
      mesh_shape=None):
    
    with gin.config_scope("encoder"):
      encoder = Unitransformer(
          layer_stack=make_layer_stack(),
          input_vocab_size=input_vocab_size,
          output_vocab_size=None,
          autoregressive=False,
          name="encoder",
          layout=layout,
          mesh_shape=mesh_shape)
    with gin.config_scope("decoder"):
      decoder = Unitransformer(
          layer_stack=make_layer_stack(),
          input_vocab_size=output_vocab_size,
          output_vocab_size=output_vocab_size,
          autoregressive=True,
          name="decoder",
          layout=layout,
          mesh_shape=mesh_shape)
    return Bitransformer(encoder, decoder)
docs: Gin-configurable bitransformer constructor.
  
    In your config file you need to set the encoder and decoder layers like this:
    encoder/make_layer_stack.layers = [
      @transformer_layers.SelfAttention,
      @transformer_layers.DenseReluDense,
    ]
    decoder/make_layer_stack.layers = [
      @transformer_layers.SelfAttention,
      @transformer_layers.EncDecAttention,
      @transformer_layers.DenseReluDense,
    ]
  
    Args:
      input_vocab_size: a integer
      output_vocab_size: an integer
      layout: optional - an input to mtf.convert_to_layout_rules
        Some layers (e.g. MoE layers) cheat by looking at layout and mesh_shape
      mesh_shape: optional - an input to mtf.convert_to_shape
        Some layers (e.g. MoE layers) cheat by looking at layout and mesh_shape
    Returns:
      a Bitransformer