bug in quantization on albert 
Author: LeopoldACC
Pull request: no

The Linear op in albert attention module use the .weight.t() to transpose the weight,but the DynamicQuantizedLinear in forward() do not have the transpose function t()
```python
context_layer = context_layer.permute(0, 2, 1, 3).contiguous()

# Should find a better way to do this
w = (
    self.dense.weight.t()
    .view(self.num_attention_heads, self.attention_head_size, self.hidden_size)
    .to(context_layer.dtype)
)
b = self.dense.bias.to(context_layer.dtype)

projected_context_layer = torch.einsum("bfnd,ndh->bfh", context_layer, w) + b
projected_context_layer_dropout = self.output_dropout(projected_context_layer)
layernormed_context_layer = self.LayerNorm(hidden_states + projected_context_layer_dropout)
return (layernormed_context_layer, attention_probs) if output_attentions else (layernormed_context_layer,)
```
the bug show as below
```python
Traceback (most recent call last):
  File "examples/text-classification/run_glue_tune.py", line 532, in <module>
    main()
  File "examples/text-classification/run_glue_tune.py", line 423, in main
    q_model = quantizer()
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/lpot/quantization.py", line 151, in __call__
    self.strategy.traverse()
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/lpot/strategy/strategy.py", line 289, in traverse
    self.last_tune_result = self._evaluate(self.last_qmodel)
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/lpot/strategy/strategy.py", line 377, in _evaluate
    val = self.objective.evaluate(self.eval_func, model.model)
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/lpot/objective.py", line 193, in evaluate
    acc = eval_func(model)
  File "examples/text-classification/run_glue_tune.py", line 407, in eval_func_for_lpot
    result = trainer.evaluate(eval_dataset=eval_dataset)
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/examples/pytorch/huggingface_models/src/transformers/trainer.py", line 1648, in evaluate
    metric_key_prefix=metric_key_prefix,
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/examples/pytorch/huggingface_models/src/transformers/trainer.py", line 1779, in prediction_loop
    loss, logits, labels = self.prediction_step(model, inputs, prediction_loss_only, ignore_keys=ignore_keys)
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/examples/pytorch/huggingface_models/src/transformers/trainer.py", line 1890, in prediction_step
    loss, outputs = self.compute_loss(model, inputs, return_outputs=True)
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/examples/pytorch/huggingface_models/src/transformers/trainer.py", line 1457, in compute_loss
    outputs = model(**inputs)
  File "/home2/zhenggo1/anaconda3/envs/lpot/lib/python3.7/site-packages/torch/nn/modules/module.py", line 550, in __call__
    result = self.forward(*input, **kwargs)
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/examples/pytorch/huggingface_models/src/transformers/models/albert/modeling_albert.py", line 1012, in forward
    return_dict=return_dict,
  File "/home2/zhenggo1/anaconda3/envs/lpot/lib/python3.7/site-packages/torch/nn/modules/module.py", line 550, in __call__
    result = self.forward(*input, **kwargs)
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/examples/pytorch/huggingface_models/src/transformers/models/albert/modeling_albert.py", line 709, in forward
    return_dict=return_dict,
  File "/home2/zhenggo1/anaconda3/envs/lpot/lib/python3.7/site-packages/torch/nn/modules/module.py", line 550, in __call__
    result = self.forward(*input, **kwargs)
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/examples/pytorch/huggingface_models/src/transformers/models/albert/modeling_albert.py", line 464, in forward
    output_hidden_states,
  File "/home2/zhenggo1/anaconda3/envs/lpot/lib/python3.7/site-packages/torch/nn/modules/module.py", line 550, in __call__
    result = self.forward(*input, **kwargs)
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/examples/pytorch/huggingface_models/src/transformers/models/albert/modeling_albert.py", line 413, in forward
    layer_output = albert_layer(hidden_states, attention_mask, head_mask[layer_index], output_attentions)
  File "/home2/zhenggo1/anaconda3/envs/lpot/lib/python3.7/site-packages/torch/nn/modules/module.py", line 550, in __call__
    result = self.forward(*input, **kwargs)
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/examples/pytorch/huggingface_models/src/transformers/models/albert/modeling_albert.py", line 381, in forward
    attention_output = self.attention(hidden_states, attention_mask, head_mask, output_attentions)
  File "/home2/zhenggo1/anaconda3/envs/lpot/lib/python3.7/site-packages/torch/nn/modules/module.py", line 550, in __call__
    result = self.forward(*input, **kwargs)
  File "/home2/zhenggo1/LowPrecisionInferenceTool0/examples/pytorch/huggingface_models/src/transformers/models/albert/modeling_albert.py", line 352, in forward
    self.dense.weight.t()
AttributeError: 'function' object has no attribute 't'
```
the dynamic quantized model looks like below
```
AlbertForSequenceClassification(
  (albert): AlbertModel(
    (embeddings): AlbertEmbeddings(
      (word_embeddings): Embedding(30000, 128, padding_idx=0)
      (position_embeddings): Embedding(512, 128)
      (token_type_embeddings): Embedding(2, 128)
      (LayerNorm): LayerNorm((128,), eps=1e-12, elementwise_affine=True)
      (dropout): Dropout(p=0.1, inplace=False)
    )
    (encoder): AlbertTransformer(
      (embedding_hidden_mapping_in): DynamicQuantizedLinear(in_features=128, out_features=768, qscheme=torch.per_channel_affine)
      (albert_layer_groups): ModuleList(
        (0): AlbertLayerGroup(
          (albert_layers): ModuleList(
            (0): AlbertLayer(
              (full_layer_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
              (attention): AlbertAttention(
                (query): DynamicQuantizedLinear(in_features=768, out_features=768, qscheme=torch.per_channel_affine)
                (key): DynamicQuantizedLinear(in_features=768, out_features=768, qscheme=torch.per_channel_affine)
                (value): DynamicQuantizedLinear(in_features=768, out_features=768, qscheme=torch.per_channel_affine)
                (attention_dropout): Dropout(p=0.1, inplace=False)
                (output_dropout): Dropout(p=0.1, inplace=False)
                (dense): DynamicQuantizedLinear(in_features=768, out_features=768, qscheme=torch.per_channel_affine)
                (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
              )
              (ffn): DynamicQuantizedLinear(in_features=768, out_features=3072, qscheme=torch.per_channel_affine)
              (ffn_output): DynamicQuantizedLinear(in_features=3072, out_features=768, qscheme=torch.per_channel_affine)
              (dropout): Dropout(p=0.1, inplace=False)
            )
          )
        )
      )
    )
    (pooler): DynamicQuantizedLinear(in_features=768, out_features=768, qscheme=torch.per_channel_affine)
    (pooler_activation): Tanh()
  )
  (dropout): Dropout(p=0.1, inplace=False)
  (classifier): DynamicQuantizedLinear(in_features=768, out_features=2, qscheme=torch.per_channel_affine)
)
```

Comments:
I fix the quantization bug through changing the matrix multiply process as below
the old version
```python
context_layer = context_layer.permute(0, 2, 1, 3).contiguous()

# Should find a better way to do this
w = (
    self.dense.weight.t()
    .view(self.num_attention_heads, self.attention_head_size, self.hidden_size)
    .to(context_layer.dtype)
)
b = self.dense.bias.to(context_layer.dtype)

projected_context_layer = torch.einsum("bfnd,ndh->bfh", context_layer, w) + b
```
my version
```python
b,f,n,d = context_layer.size()[0],context_layer.size()[1],context_layer.size()[2],context_layer.size()[3]
context_layer = context_layer.view(b,f,n*d)
projected_context_layer = self.dense(context_layer)
```