Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f2bcc9127f | ||
|
|
e06daaaec5 | ||
|
|
0183eb0229 |
No files matched your search
+37
-11
@@ -106,6 +106,8 @@ def prepare_xlm_input(args, model, tokenizer, prompt_text):
|
|||||||
language = None
|
language = None
|
||||||
while language not in available_languages:
|
while language not in available_languages:
|
||||||
language = input("Using XLM. Select language in " + str(list(available_languages)) + " >>> ")
|
language = input("Using XLM. Select language in " + str(list(available_languages)) + " >>> ")
|
||||||
|
|
||||||
|
model.config.lang_id = model.config.lang2id[language]
|
||||||
# kwargs["language"] = tokenizer.lang2id[language]
|
# kwargs["language"] = tokenizer.lang2id[language]
|
||||||
|
|
||||||
# TODO fix mask_token_id setup when configurations will be synchronized between models and tokenizers
|
# TODO fix mask_token_id setup when configurations will be synchronized between models and tokenizers
|
||||||
@@ -119,12 +121,12 @@ def prepare_xlm_input(args, model, tokenizer, prompt_text):
|
|||||||
|
|
||||||
def prepare_xlnet_input(args, _, tokenizer, prompt_text):
|
def prepare_xlnet_input(args, _, tokenizer, prompt_text):
|
||||||
prompt_text = (args.padding_text if args.padding_text else PADDING_TEXT) + prompt_text
|
prompt_text = (args.padding_text if args.padding_text else PADDING_TEXT) + prompt_text
|
||||||
return prompt_text, {}
|
return prompt_text
|
||||||
|
|
||||||
|
|
||||||
def prepare_transfoxl_input(args, _, tokenizer, prompt_text):
|
def prepare_transfoxl_input(args, _, tokenizer, prompt_text):
|
||||||
prompt_text = (args.padding_text if args.padding_text else PADDING_TEXT) + prompt_text
|
prompt_text = (args.padding_text if args.padding_text else PADDING_TEXT) + prompt_text
|
||||||
return prompt_text, {}
|
return prompt_text
|
||||||
|
|
||||||
|
|
||||||
PREPROCESSING_FUNCTIONS = {
|
PREPROCESSING_FUNCTIONS = {
|
||||||
@@ -183,6 +185,7 @@ def main():
|
|||||||
|
|
||||||
parser.add_argument("--seed", type=int, default=42, help="random seed for initialization")
|
parser.add_argument("--seed", type=int, default=42, help="random seed for initialization")
|
||||||
parser.add_argument("--no_cuda", action="store_true", help="Avoid using CUDA when available")
|
parser.add_argument("--no_cuda", action="store_true", help="Avoid using CUDA when available")
|
||||||
|
parser.add_argument("--num_return_sequences", type=int, default=1, help="The number of samples to generate.")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
args.device = torch.device("cuda" if torch.cuda.is_available() and not args.no_cuda else "cpu")
|
args.device = torch.device("cuda" if torch.cuda.is_available() and not args.no_cuda else "cpu")
|
||||||
@@ -210,28 +213,51 @@ def main():
|
|||||||
requires_preprocessing = args.model_type in PREPROCESSING_FUNCTIONS.keys()
|
requires_preprocessing = args.model_type in PREPROCESSING_FUNCTIONS.keys()
|
||||||
if requires_preprocessing:
|
if requires_preprocessing:
|
||||||
prepare_input = PREPROCESSING_FUNCTIONS.get(args.model_type)
|
prepare_input = PREPROCESSING_FUNCTIONS.get(args.model_type)
|
||||||
prompt_text = prepare_input(args, model, tokenizer, prompt_text)
|
preprocessed_prompt_text = prepare_input(args, model, tokenizer, prompt_text)
|
||||||
encoded_prompt = tokenizer.encode(prompt_text, add_special_tokens=False, return_tensors="pt")
|
encoded_prompt = tokenizer.encode(preprocessed_prompt_text, add_special_tokens=False, return_tensors="pt")
|
||||||
|
else:
|
||||||
|
encoded_prompt = tokenizer.encode(prompt_text, add_special_tokens=False, return_tensors="pt")
|
||||||
encoded_prompt = encoded_prompt.to(args.device)
|
encoded_prompt = encoded_prompt.to(args.device)
|
||||||
|
|
||||||
output_sequences = model.generate(
|
output_sequences = model.generate(
|
||||||
input_ids=encoded_prompt,
|
input_ids=encoded_prompt,
|
||||||
max_length=args.length,
|
max_length=args.length + len(encoded_prompt[0]),
|
||||||
temperature=args.temperature,
|
temperature=args.temperature,
|
||||||
top_k=args.k,
|
top_k=args.k,
|
||||||
top_p=args.p,
|
top_p=args.p,
|
||||||
repetition_penalty=args.repetition_penalty,
|
repetition_penalty=args.repetition_penalty,
|
||||||
do_sample=True,
|
do_sample=True,
|
||||||
|
num_return_sequences=args.num_return_sequences,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Batch size == 1. to add more examples please use num_return_sequences > 1
|
# Remove the batch dimension when returning multiple sequences
|
||||||
generated_sequence = output_sequences[0].tolist()
|
if len(output_sequences.shape) > 2:
|
||||||
text = tokenizer.decode(generated_sequence, clean_up_tokenization_spaces=True)
|
output_sequences.squeeze_()
|
||||||
text = text[: text.find(args.stop_token) if args.stop_token else None]
|
|
||||||
|
|
||||||
print(text)
|
generated_sequences = []
|
||||||
|
|
||||||
return text
|
for generated_sequence in output_sequences:
|
||||||
|
print("=== GENERATED SEQUENCE ===")
|
||||||
|
generated_sequence = generated_sequence.tolist()
|
||||||
|
|
||||||
|
# Remove "-1" tokens which are used for padding
|
||||||
|
generated_sequence = [token for token in generated_sequence if token != -1]
|
||||||
|
|
||||||
|
# Decode text
|
||||||
|
text = tokenizer.decode(generated_sequence, clean_up_tokenization_spaces=True)
|
||||||
|
|
||||||
|
# Remove all text after the stop token
|
||||||
|
text = text[: text.find(args.stop_token) if args.stop_token else None]
|
||||||
|
|
||||||
|
# Add the prompt at the beginning of the sequence. Remove the excess text that was used for pre-processing
|
||||||
|
total_sequence = (
|
||||||
|
prompt_text + text[len(tokenizer.decode(encoded_prompt[0], clean_up_tokenization_spaces=True)) :]
|
||||||
|
)
|
||||||
|
|
||||||
|
generated_sequences.append(total_sequence)
|
||||||
|
print(total_sequence)
|
||||||
|
|
||||||
|
return generated_sequences if len(generated_sequences) > 1 else generated_sequences[0]
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -75,9 +75,9 @@ class PretrainedConfig(object):
|
|||||||
self.top_k = kwargs.pop("top_k", 50)
|
self.top_k = kwargs.pop("top_k", 50)
|
||||||
self.top_p = kwargs.pop("top_p", 1.0)
|
self.top_p = kwargs.pop("top_p", 1.0)
|
||||||
self.repetition_penalty = kwargs.pop("repetition_penalty", 1.0)
|
self.repetition_penalty = kwargs.pop("repetition_penalty", 1.0)
|
||||||
self.bos_token_id = kwargs.pop("bos_token_id", 0)
|
self.bos_token_id = kwargs.pop("bos_token_id", None)
|
||||||
self.pad_token_id = kwargs.pop("pad_token_id", 0)
|
self.pad_token_id = kwargs.pop("pad_token_id", None)
|
||||||
self.eos_token_ids = kwargs.pop("eos_token_ids", 0)
|
self.eos_token_ids = kwargs.pop("eos_token_ids", None)
|
||||||
self.length_penalty = kwargs.pop("length_penalty", 1.0)
|
self.length_penalty = kwargs.pop("length_penalty", 1.0)
|
||||||
self.num_return_sequences = kwargs.pop("num_return_sequences", 1)
|
self.num_return_sequences = kwargs.pop("num_return_sequences", 1)
|
||||||
|
|
||||||
|
|||||||
@@ -712,10 +712,14 @@ class PreTrainedModel(nn.Module, ModuleUtilsMixin):
|
|||||||
assert isinstance(top_k, int) and top_k >= 0, "`top_k` should be a positive integer."
|
assert isinstance(top_k, int) and top_k >= 0, "`top_k` should be a positive integer."
|
||||||
assert 0 <= top_p <= 1, "`top_p` should be between 0 and 1."
|
assert 0 <= top_p <= 1, "`top_p` should be between 0 and 1."
|
||||||
assert repetition_penalty >= 1.0, "`repetition_penalty` should be >= 1."
|
assert repetition_penalty >= 1.0, "`repetition_penalty` should be >= 1."
|
||||||
assert isinstance(bos_token_id, int) and bos_token_id >= 0, "`bos_token_id` should be a positive integer."
|
assert bos_token_id is None or (
|
||||||
assert isinstance(pad_token_id, int) and pad_token_id >= 0, "`pad_token_id` should be a positive integer."
|
isinstance(bos_token_id, int) and bos_token_id >= 0
|
||||||
assert isinstance(eos_token_ids, (list, tuple)) and (
|
), "`bos_token_id` should be a positive integer."
|
||||||
e >= 0 for e in eos_token_ids
|
assert (
|
||||||
|
pad_token_id is None or isinstance(pad_token_id, int) and pad_token_id >= 0
|
||||||
|
), "`pad_token_id` should be a positive integer."
|
||||||
|
assert (
|
||||||
|
eos_token_ids is None or isinstance(eos_token_ids, (list, tuple)) and (e >= 0 for e in eos_token_ids)
|
||||||
), "`eos_token_ids` should be a positive integer or a list/tuple of positive integers."
|
), "`eos_token_ids` should be a positive integer or a list/tuple of positive integers."
|
||||||
assert length_penalty > 0, "`length_penalty` should be strictely positive."
|
assert length_penalty > 0, "`length_penalty` should be strictely positive."
|
||||||
assert (
|
assert (
|
||||||
@@ -729,6 +733,13 @@ class PreTrainedModel(nn.Module, ModuleUtilsMixin):
|
|||||||
else:
|
else:
|
||||||
assert input_ids.dim() == 2, "Input prompt should be of shape (batch_size, sequence length)."
|
assert input_ids.dim() == 2, "Input prompt should be of shape (batch_size, sequence length)."
|
||||||
|
|
||||||
|
if pad_token_id is None:
|
||||||
|
pad_token_id = -1
|
||||||
|
if eos_token_ids is None:
|
||||||
|
eos_token_ids = [-1]
|
||||||
|
if bos_token_id is None:
|
||||||
|
bos_token_id = -1
|
||||||
|
|
||||||
# current position and vocab size
|
# current position and vocab size
|
||||||
cur_len = input_ids.shape[1]
|
cur_len = input_ids.shape[1]
|
||||||
vocab_size = self.config.vocab_size
|
vocab_size = self.config.vocab_size
|
||||||
|
|||||||
Reference in new issue
Block a user