[InstructBLIP] Fix bos token of LLaMa checkpoints
# What does this PR do?

This PR adds a fix for InstructBLIP as discussed offline with @gante.

The InstructBLIP models trained with Vicuna (LLaMa) checkpoints used inconsistent model/tokenizer files during training, hence the authors include [this line](https://github.com/salesforce/LAVIS/blob/4a85b17846ee62f09c40f37cc955dd33c2abec68/lavis/models/blip2_models/blip2_vicuna_instruct.py#L372) to fix this. This is not required for the models that use Flan-T5 checkpoints. cc @ArthurZucker 

However this made me wonder, let's say someone trains a new InstructBLIP model with LLaMa as language model, and which has the tokenizer and model's config properly set. Then the line introduced in this PR might not be what we want? cc @gante  


_The documentation is not available anymore as the PR was closed or merged._<|||||>> However this made me wonder, let's say someone trains a new InstructBLIP model with LLaMa as language model, and which has the tokenizer and model's config properly set. Then the line introduced in this PR might not be what we want? cc @gante

@NielsRogge I don't think there's much more we can do: the model was probably trained with the incorrect assumption that `0` is the BOS token, in which case a post-generation fix is the only way to stay consistent with the original repo. 

(Have we double-checked that the results do change if we change the config's BOS token in the InstructBLIP config? If they don't, then we can simply update the config.)<|||||>I tried that but that doesn't fix it. Guess this is the only solution.<|||||>Just so I understand this fix, why doesn't updating the checkpoint's tokenizer's BOS token ID to resolve this? <|||||>> why doesn't updating the checkpoint's tokenizer's BOS token ID to resolve this?

@amyeroberts TL;DR it's impossible to keep the same behavior as the original model with a config fix 💔 

### Full story

Here's what happens when we use InstructBLIP:
1. the tokenized prompt (starting with token = 2, from the [tokenizer BOS token](https://huggingface.co/Salesforce/instructblip-vicuna-7b/blob/main/tokenizer_config.json#L2)) is being passed to the custom `InstructBlipForConditionalGeneration.generate`. 
2. We compute its embeddings from `input_ids` and we pass it to the default `generate`. We do not pass `input_ids` to `generate`.
3. If we don't pass `input_ids` to `InstructBlipForConditionalGeneration.generate`, it is initialized with the default BOS token (from the model config) before embedding it.
4. The default BOS token in the model config is 0 ([source](https://huggingface.co/Salesforce/instructblip-vicuna-7b/blob/main/config.json#L97)), and not 2

As a result:
- If we fix the tokenizer such that BOS is 0 -> prompted input will diverge from the main repo, the first token is now 0 instead of 2 = different embeddings = different generation
- If we fix the model config such that the BOS is 2 -> unprompted input will diverge from the main repo, the first token is now 2 instead of 0 = different embeddings = different generation
<|||||>Feel free to merge :)