{"id":9108,"date":"2023-08-04T04:49:09","date_gmt":"2023-08-04T02:49:09","guid":{"rendered":"https:\/\/myoceane.fr\/?p=9108"},"modified":"2023-09-23T03:15:46","modified_gmt":"2023-09-23T01:15:46","slug":"ml-fine-tune-spark-nlp-qa-model","status":"publish","type":"post","link":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/","title":{"rendered":"[ML] Fine Tune Spark NLP QA model"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p style=\"text-align: justify;\">\u4f7f\u7528 Spark NLP \u53bb\u57f7\u884c Question Answering \u7684\u7bc4\u4f8b\uff0c\u53ef\u4ee5\u53c3\u8003 JohnSnowLabs \u88e1\u9762\u5f88\u591a\u7684 Question Answering \u6a21\u578b\uff0c\u4f8b\u5982 <a href=\"https:\/\/sparknlp.org\/2022\/12\/02\/roberta_qa_deepset_base_squad2_en.html\">Roberta QA Model<\/a>\uff0c\u81f3\u65bc\u8981\u600e\u9ebc\u53bb Fine Tune QA \u6a21\u578b\uff1f\u5728 Spark NLP \u88e1\u9762\u4e26\u6c92\u6709\u8b1b\u89e3\u5f97\u5f88\u6e05\u695a\uff0c\u672c\u7bc7\u60f3\u8981\u8a18\u9304\u5982\u4f55 Fine Tune \u4e00\u500b\u81ea\u5df1\u7684 QA \u6a21\u578b\u4f9b Spark NLP \u4f86\u4f7f\u7528\uff1f<\/p>\n<h4>\u7cbe\u795e\uff1a\u5229\u7528 HuggingFace transformer \u5957\u4ef6\u505a Fine Tune \u7d50\u675f\u5f8c\u4f9b SparkNLP \u4f7f\u7528<\/h4>\n<p style=\"text-align: justify;\">\u95dc\u65bc Fine Tune \u4e00\u500b QA \u7684\u6a21\u578b\uff0c\u5728<a href=\"https:\/\/speech.ee.ntu.edu.tw\/~hylee\/ml\/2023-spring.php\">\u53f0\u5927\u674e\u5b8f\u6bc5\u6559\u6388\u958b\u8a2d\u7684\u6a5f\u5668\u5b78\u7fd2\u8ab2\u7a0b<\/a>\u88e1\uff0c<a href=\"https:\/\/colab.research.google.com\/drive\/1m0fQjJfkK9vAovxPj9Nd3-hQuxezB2w1\">HW7<\/a> \u5229\u7528 Pytorch \u53bb Fine Tune QA \u6a21\u578b \uff0c\u6211\u5011\u5be6\u4f5c\u7684\u7d93\u9a57\u5728\u4e00\u53f0\u5b89\u88dd\u597d Nvidia Driver \u8ddf nvidia-util-515 \u7684 VM \u7684 docker \u88e1\u9762\uff0cPytorch \u7684\u7a0b\u5f0f\u53ef\u4ee5\u5f88\u8f15\u6613\u5229\u7528 GPU \u505a\u8a13\u7df4\uff0c\u6709\u95dc QA model \u7684 Fine Tuning\uff0c<a href=\"https:\/\/huggingface.co\/learn\/nlp-course\/chapter7\/7?fw=pt#a-custom-training-loop\">Hugging Face \u7684\u7db2\u7ad9\u4e0a\u9762\u6709\u4e00\u4e9b\u7bc4\u4f8b<\/a>\uff0c\u4e3b\u8981\u5206\u6210\u5229\u7528 Trainer \u6216\u8005\u662f\u81ea\u5df1\u5b9a\u7fa9\u5ba2\u88fd\u5316\u7684 Optimizer \u4f86\u505a\u8a13\u7df4\uff0c\u4ee5\u4e0b\u6211\u5011\u6574\u7406\u4e86\u5169\u500b\u5229\u7528 Pytorch \u5fae\u8abf\u6a21\u578b\u7684\u65b9\u6cd5\u3002<\/p>\n<h4>Fine Tune in PyTorch using TrainingArguments :<\/h4>\n<p>\u9996\u5148\u5148\u8f09\u5165\u5df2\u7d93\u8a13\u7df4\u597d\u7684 Tokenizer \u8207 Question Answering \u6a21\u578b\uff1a<\/p>\n<pre class=\"lang:python\">from transformers import AutoTokenizer \n\nmodel_checkpoint = \"bert-base-cased\" \ntokenizer = AutoTokenizer.from_pretrained(model_checkpoint) \nmodel = AutoModelForQuestionAnswering.from_pretrained(model_checkpoint)<\/pre>\n<p>\u63a5\u8457\u5229\u7528 transformers \u5167\u90e8\u63d0\u4f9b\u7684 TrainingArguments \u8a2d\u5b9a\u8a13\u7df4\u7684\u53c3\u6578<\/p>\n<pre class=\"lang:python\">from transformers import TrainingArguments\nargs = TrainingArguments(\n    \"bert-finetuned-squad\",\n    evaluation_strategy=\"no\",\n    save_strategy=\"epoch\",\n    learning_rate=2e-5,\n    num_train_epochs=3,\n    weight_decay=0.01,\n    fp16=True,\n    push_to_hub=True,\n)<\/pre>\n<p>\u547c\u53eb Trainer \u5c0d model \u505a\u8a13\u7df4\uff1a<\/p>\n<pre class=\"lang:python\">from transformers import Trainer\n\ntrainer = Trainer(\n    model=model,\n    args=args,\n    train_dataset=train_dataset,\n    eval_dataset=validation_dataset,\n    tokenizer=tokenizer,\n)\ntrainer.train()<\/pre>\n<h5>Customizing Fine Tune (\u674e\u5b8f\u6bc5\u6559\u6388 HW7 \u7684\u7bc4\u4f8b)<\/h5>\n<p>\u53e6\u5916\u4e5f\u53ef\u4ee5\u81ea\u5df1\u5ba2\u88fd\u5316\u60f3\u8981\u7684\u5fae\u8abf\u65b9\u6cd5\uff0c\u4f8b\u5982\u4e0d\u540c Optimizer \u7684\u9078\u64c7\uff0c\u9019\u500b\u65b9\u6cd5\u63d0\u4f9b\u66f4\u591a\u7684\u5f48\u6027\uff0c\u4f46\u662f\u4e5f\u76f8\u5c0d\u6bd4\u8f03\u56f0\u96e3\u3002<\/p>\n<div>\n<div>\n<pre class=\"lang:python\">from accelerate import Accelerator<br \/>\nmodel = AutoModelForQuestionAnswering.from_pretrained(model_checkpoint)\n\n!! hyperparameters\nnum_epoch = 1\nvalidation = True\nlogging_step = 100\nlearning_rate = 1e-5\noptimizer = AdamW(model.parameters(), lr=learning_rate)\ntrain_batch_size = 8\n\n!!!! TODO: gradient_accumulation (optional) !!!!\n! Note: train_batch_size * gradient_accumulation_steps = effective batch size\n! If CUDA out of memory, you can make train_batch_size lower and gradient_accumulation_steps upper\n! Doc: https:\/\/huggingface.co\/docs\/accelerate\/usage_guides\/gradient_accumulation\ngradient_accumulation_steps = 16\n\n! dataloader\n! Note: Do NOT change batch size of dev_loader \/ test_loader !\n! Although batch size=1, it is actually a batch consisting of several windows from the same QA pair\ntrain_loader = DataLoader(train_set, batch_size=train_batch_size, shuffle=True, pin_memory=True)\ndev_loader = DataLoader(dev_set, batch_size=1, shuffle=False, pin_memory=True)\ntest_loader = DataLoader(test_set, batch_size=1, shuffle=False, pin_memory=True)\n\n! Change \"fp16_training\" to True to support automatic mixed\n! precision training (fp16)\nfp16_training = True\nif fp16_training:\naccelerator = Accelerator(mixed_precision=\"fp16\")\nelse:\naccelerator = Accelerator()\n\n! Documentation for the toolkit: https:\/\/huggingface.co\/docs\/accelerate\/\nmodel, optimizer, train_loader = accelerator.prepare(model, optimizer, train_loader)\nmodel.train()\n\nprint(\"Start Training ...\")\n\nfor epoch in range(num_epoch):\nstep = 1\ntrain_loss = train_acc = 0\n\nfor data in tqdm(train_loader):\n! Load all data into GPU\ndata = [i.to(device) for i in data]\n\n! Model inputs: input_ids, token_type_ids, attention_mask, start_positions, end_positions (Note: only \"input_ids\" is mandatory)\n! Model outputs: start_logits, end_logits, loss (return when start_positions\/end_positions are provided)\noutput = model(input_ids=data[0], token_type_ids=data[1], attention_mask=data[2], start_positions=data[3], end_positions=data[4])\n! Choose the most probable start position \/ end position\nstart_index = torch.argmax(output.start_logits, dim=1)\nend_index = torch.argmax(output.end_logits, dim=1)\n\n! Prediction is correct only if both start_index and end_index are correct\ntrain_acc += ((start_index == data[3]) &amp; (end_index == data[4])).float().mean()\ntrain_loss += output.loss\naccelerator.backward(output.loss)\n\nstep += 1\noptimizer.step()\noptimizer.zero_grad()\n\nif step % logging_step == 0:\nprint(f\"Epoch {epoch + 1}| Step {step}| loss = {train_loss.item() \/ logging_step:.3f}, acc = {train_acc \/ logging_step:.3f}\")\ntrain_loss = train_acc = 0<\/pre>\n<\/div>\n<\/div>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\u5099\u8a3b\uff1a\u4ee5\u4e0a\u6211\u5011\u63d0\u4f9b\u7684\u662f\u5229\u7528 HuggingFace \u5167\u7684 Pytorch \u4f86\u505a\u8a13\u7df4\uff0c\u5982\u679c\u4e4b\u5f8c\u8981\u80fd\u5920\u7d66 SparkNLP \u8f09\u5165\u7684\u8a71\u5fc5\u9808\u8981\u7528\u4f7f\u7528 HuggingFace \u63d0\u4f9b\u7684 Tensorflow \u7bc4\u4f8b\u3002<\/p><\/blockquote>\n\n\n<div>\n<h5>\u9023\u63a5 HuggingFace \u8207 Spark NLP<\/h5>\n<p style=\"text-align: justify;\">HuggingFace \u4e5f\u7d66\u51fa\u8a31\u591a\u7bc4\u4f8b\u53ef\u4ee5\u5c07 pytorch \u8a13\u7df4\u597d\u7684\u6a21\u578b\u5b58\u5728\u4e3b\u6a5f\u7aef\uff0c\u7136\u5f8c\u5728\u5229\u7528 Spark NLP \u88e1\u9762\u7684 loadSavedModel \u51fd\u5f0f\u5c07\u6a21\u578b\u8f09\u5165\uff0c\u4ee5\u4e0b\u653e\u4e0a <a href=\"https:\/\/colab.research.google.com\/github\/JohnSnowLabs\/spark-nlp\/blob\/master\/examples\/python\/transformers\/HuggingFace%20in%20Spark%20NLP%20-%20BERT.ipynb#scrollTo=87sasavdX754\">BertEmbeddings<\/a> \u8207 <a href=\"https:\/\/colab.research.google.com\/github\/JohnSnowLabs\/spark-nlp\/blob\/master\/examples\/python\/transformers\/HuggingFace%20in%20Spark%20NLP%20-%20BertForQuestionAnswering.ipynb#scrollTo=ncod8mOioQ4b\">BertForQuestionAnswering<\/a> \u7684\u7bc4\u4f8b\u8f49\u63db\uff0c\u66f4\u591a\u7bc4\u4f8b\u53ef\u4ee5<a href=\"https:\/\/github.com\/JohnSnowLabs\/spark-nlp\/tree\/master\/examples\/python\/transformers\">\u53c3\u8003\u9023\u7d50<\/a>\u3002<\/p>\n<h4>\u6bd4\u8f03\u8a13\u7df4\u524d\u8207\u8a13\u7df4\u5f8c\u7684 QA \u6a21\u578b\u6548\u80fd<\/h4>\n<p>\u6211\u5011\u5148\u5229\u7528 SparkNLP \u6f14\u793a\u8a13\u7df4\u524d\u5f8c\u7684 QA model \u6548\u80fd\uff0c\u6211\u5011\u4f7f\u7528 bert-base-cased \u6a21\u578b\u7576\u4f5c\u8a13\u7df4\u524d\u7684\u6a21\u578b\uff0c\u57fa\u672c\u4e0a\u9019\u500b\u6a21\u578b\u4e26\u6c92\u6709\u7d93\u904e QA \u7684\u8a13\u7df4\u6240\u4ee5\u6548\u679c\u5f88\u5dee\uff0c\u53c3\u8003 HuggingFace \u7684\u7a0b\u5f0f\u78bc\uff1a<\/p>\n<h6>\u6b65\u9a5f\u4e00\uff1a\u5148\u8f09\u5165 Tokenizer \u8207 QA \u6a21\u578b<\/h6>\n<pre class=\"lang:python\">from transformers import AutoTokenizer \nfrom transformers import TFBertForQuestionAnswering\n\nMODEL_NAME = 'bert-base-cased'\n\ntokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)\ntokenizer.save_pretrained('\/mnt\/{}_tokenizer\/'.format(MODEL_NAME))\n\nmodel = TFBertForQuestionAnswering.from_pretrained(MODEL_NAME)<\/pre>\n<h6>\u6b65\u9a5f\u4e8c\uff1a\u63a5\u8457\u5c07 HuggingFace \u4e0a\u9762\u7684 model \u8f38\u51fa\u5230 \/mnt\/bert-base-cased \u7684\u8def\u5f91\u4e0b\u9762<\/h6>\n<pre class=\"lang:python\">import tensorflow as tf\n@tf.function(\n  input_signature=[\n      {\n          \"input_ids\": tf.TensorSpec((None, None), tf.int32, name=\"input_ids\"),\n          \"attention_mask\": tf.TensorSpec((None, None), tf.int32, name=\"attention_mask\"),\n          \"token_type_ids\": tf.TensorSpec((None, None), tf.int32, name=\"token_type_ids\"),\n      }\n  ]\n)\ndef serving_fn(input):\n    return model(input)\n\nmodel.save_pretrained(\"\/mnt\/{}\".format(MODEL_NAME), saved_model=True, signatures={\"serving_default\": serving_fn})<\/pre>\n<h6>\u6b65\u9a5f\u4e09\uff1a\u7136\u5f8c\u5229\u7528 SparkNLP \u7684\u7a0b\u5f0f\u78bc\u505a QA \u56de\u7b54\uff0c\u9996\u5148\u5148\u521d\u59cb\u5316 SparkNLP<\/h6>\n<pre class=\"lang:python\">import sparknlp\nspark = sparknlp.start()<\/pre>\n<\/div>\n<h6>\u6b65\u9a5f\u56db\uff1a\u5132\u5b58\u6210 SparkNLP \u53ef\u4ee5\u770b\u5f97\u61c2\u7684\u6a21\u578b<\/h6>\n<pre class=\"lang:python\">from sparknlp.annotator import *\nfrom sparknlp.base import *\n\nspanClassifier = BertForQuestionAnswering.loadSavedModel(\n     '\/mnt\/{}\/saved_model\/1'.format(MODEL_NAME),\n     spark\n )\\\n  .setInputCols([\"document_question\",'document_context'])\\\n  .setOutputCol(\"answer\")\\\n  .setCaseSensitive(False)\\\n  .setMaxSentenceLength(512)\n\nspanClassifier.write().overwrite().save(\"file:\/\/\/mnt\/{}_spark_nlp\".format(MODEL_NAME))<\/pre>\n<h6>\u6b65\u9a5f\u4e94\uff1a\u63a5\u8457\u57f7\u884c\u9810\u6e2c<\/h6>\n<pre class=\"lang:python\">from sparknlp.annotator import *\nfrom sparknlp.base import *\n\ndocument_assembler = MultiDocumentAssembler() \\\n    .setInputCols([\"question\", \"context\"]) \\\n    .setOutputCols([\"document_question\", \"document_context\"])\n\nspanClassifier_loaded = BertForQuestionAnswering.load(\"file:\/\/\/mnt\/{}_spark_nlp\".format(MODEL_NAME))\\\n  .setInputCols([\"document_question\", 'document_context'])\\\n  .setOutputCol(\"answer\")\n\npipeline = Pipeline().setStages([\n    document_assembler,\n    spanClassifier_loaded\n])\n\nexample = spark.createDataFrame([[\"Where do I live?\", \"My name is Sarah and I live in London.\"]]).toDF(\"question\", \"context\")\nresult = pipeline.fit(example).transform(example)\n\nresult.select(\"answer.result\").show(1, False)<\/pre>\n<p style=\"text-align: justify;\">\u4f46\u662f\u6548\u679c\u4e0d\u597d\uff0c\u7576\u554f\u984c\u662f My name is Sarah and I live in London. \u554f\u984c\u662f Where do I live ? \u7684\u6642\u5019\u6703\u627e\u4e0d\u5230\u7b54\u6848\uff0c\u5982\u4e0b\u5716\u6240\u793a\u3002<\/p>\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/PredictionWoFineTune-1024x425.png\" alt=\"\" class=\"wp-image-9164\" width=\"880\" height=\"365\" srcset=\"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/PredictionWoFineTune-1024x425.png 1024w, https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/PredictionWoFineTune-300x125.png 300w, https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/PredictionWoFineTune-768x319.png 768w, https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/PredictionWoFineTune.png 1327w\" sizes=\"auto, (max-width: 880px) 100vw, 880px\" \/><figcaption>\u6c92\u6709 Fine Tune \u5229\u7528 bert-base-cased \u7121\u6cd5\u6b63\u78ba\u56de\u7b54\u554f\u984c<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/PredictionWithFineTune-1024x399.png\" alt=\"\" class=\"wp-image-9169\" width=\"880\" height=\"342\" srcset=\"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/PredictionWithFineTune-1024x399.png 1024w, https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/PredictionWithFineTune-300x117.png 300w, https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/PredictionWithFineTune-768x299.png 768w, https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/PredictionWithFineTune.png 1325w\" sizes=\"auto, (max-width: 880px) 100vw, 880px\" \/><figcaption>\u5229\u7528 SQUAD \u8cc7\u6599\u96c6 Fine Tune \u5b8c bert-base-cased \u5c31\u53ef\u4ee5\u56de\u7b54\u6b63\u78ba\u7b54\u6848<\/figcaption><\/figure>\n\n\n<h4>\u5229\u7528 Squad \u8cc7\u6599\u96c6\u8a13\u7df4 model<\/h4>\n<p>Fine Tune \u8207\u5426\u7684\u5dee\u5225\u5c31\u662f\u5728\u4e0a\u8ff0\u6b65\u9a5f\u4e00\u5c07 model \u8f09\u5165\u4e4b\u5f8c\uff0c\u65bc\u6b65\u9a5f\u4e8c\u57f7\u884c\u4e4b\u524d\u5229\u7528 Squad \u8cc7\u6599\u53ca\u9032\u884c\u8a13\u7df4\uff0c\u6b64\u8655\u7684\u7a0b\u5f0f\u78bc\u662f\u53c3\u8003 HuggingFace \u91dd\u5c0d QA model \u8a13\u7df4\u7684\u6559\u5b78\uff0c\u9996\u5148\u5148\u8f09\u5165 Squad \u8cc7\u6599\u96c6\u3002<\/p>\n<pre class=\"lang:python\">from datasets import load_dataset\nraw_datasets = load_dataset(\"squad\")<\/pre>\n<p>\u63a5\u8457\u5b9a\u7fa9\u524d\u8655\u7406\u51fd\u6578<\/p>\n<pre class=\"lang:python\">max_length = 384\nstride = 128\n\ndef preprocess_training_examples(examples):\n    questions = [q.strip() for q in examples[\"question\"]]\n    inputs = tokenizer(\n        questions,\n        examples[\"context\"],\n        max_length=max_length,\n        truncation=\"only_second\",\n        stride=stride,\n        return_overflowing_tokens=True,\n        return_offsets_mapping=True,\n        padding=\"max_length\",\n    )\n\n    offset_mapping = inputs.pop(\"offset_mapping\")\n    sample_map = inputs.pop(\"overflow_to_sample_mapping\")\n    answers = examples[\"answers\"]\n    start_positions = []\n    end_positions = []\n\n    for i, offset in enumerate(offset_mapping):\n        sample_idx = sample_map[i]\n        answer = answers[sample_idx]\n        start_char = answer[\"answer_start\"][0]\n        end_char = answer[\"answer_start\"][0] + len(answer[\"text\"][0])\n        sequence_ids = inputs.sequence_ids(i)\n\n        idx = 0\n        while sequence_ids[idx] != 1:\n            idx += 1\n        context_start = idx\n        while sequence_ids[idx] == 1:\n            idx += 1\n        context_end = idx - 1\n\n        if offset[context_start][0] &gt; start_char or offset[context_end][1] &lt; end_char:\n            start_positions.append(0)\n            end_positions.append(0)\n        else:\n            idx = context_start\n            while idx &lt;= context_end and offset[idx][0] &lt;= start_char:\n                idx += 1\n            start_positions.append(idx - 1)\n\n            idx = context_end\n            while idx &gt;= context_start and offset[idx][1] &gt;= end_char:\n                idx -= 1\n            end_positions.append(idx + 1)\n\n    inputs[\"start_positions\"] = start_positions\n    inputs[\"end_positions\"] = end_positions\n    return inputs<\/pre>\n<p style=\"text-align: justify;\">\u524d\u8655\u7406 Training \u8207 Validation \u7684\u8cc7\u6599\uff0c\u4ee5\u4e0b\u7d50\u679c\u53ef\u4ee5\u770b\u51fa Squad \u7684\u8a13\u7df4\u554f\u7b54\u96c6\u7e3d\u5171\u6709 87599 \u500b\uff0c\u9a57\u8b49\u8cc7\u6599\u96c6\u7e3d\u5171\u6709 10570 \u500b\u3002<\/p>\n<pre class=\"lang:python\">train_dataset = raw_datasets[\"train\"].map(\n    preprocess_training_examples,\n    batched=True,\n    remove_columns=raw_datasets[\"train\"].column_names,\n)\nlen(raw_datasets[\"train\"]), len(train_dataset)\n\n(87599, 88729)<br><br>validation_dataset = raw_datasets[\"validation\"].map(<br>    preprocess_training_examples,<br>    batched=True,<br>    remove_columns=raw_datasets[\"validation\"].column_names,<br>)<br>len(raw_datasets[\"validation\"]), len(validation_dataset)<br><br>(10570, 10822)<\/pre>\n<p>\u5c07\u8cc7\u6599\u96c6\u8f49\u63db\u6210 TensorFlow \u7684\u683c\u5f0f\uff0c\u9019\u908a\u6211\u5011\u53ea\u9078\u64c7\u4e86 2000 \u7b46\u8cc7\u6599\u505a\u8a13\u7df4\u5c31\u80fd\u5920\u9054\u5230\u4e0d\u932f\u7684\u6548\u679c\u3002<\/p>\n<pre class=\"lang:python\">tf_train_set = train_dataset.select(range(2000)).to_tf_dataset(\n    columns=[\"attention_mask\", \"input_ids\", \"start_positions\", \"end_positions\"],\n    shuffle=True,\n    batch_size=16,\n    collate_fn=data_collator,\n)\n\ntf_validation_set = validation_dataset.select(range(2000)).to_tf_dataset(\n    columns=[\"attention_mask\", \"input_ids\", \"start_positions\", \"end_positions\"],\n    shuffle=False,\n    batch_size=16,\n    collate_fn=data_collator,\n)<\/pre>\n<p>\u5275\u5efa optimizer \u4e26\u4e14\u8a2d\u5b9a\u8a13\u7df4\u53c3\u6578<\/p>\n<pre class=\"lang:python\">from transformers import create_optimizer\n\nbatch_size = 16\nnum_epochs = 2\ntotal_train_steps = (len(train_dataset) \/\/ batch_size) * num_epochs\noptimizer, schedule = create_optimizer(\n    init_lr=2e-5, \n    num_warmup_steps=0, \n    num_train_steps=total_train_steps,\n)\nmodel.compile(optimizer=optimizer)<\/pre>\n<p>\u958b\u59cb\u8a13\u7df4<\/p>\n<pre class=\"lang:python\">from tensorflow import keras\nmodel.fit(\n    tf_train_set,\n    validation_data=tf_validation_set,\n    epochs=num_epochs\n)<\/pre>\n<p>\u6b64\u8655\u6211\u5011\u5229\u7528 Azure \u4e0a\u7684 VM \u914d\u5408 Nvidia T4 GPU<\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"257\" src=\"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/Training-1024x257.png\" alt=\"\" class=\"wp-image-9178\" srcset=\"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/Training-1024x257.png 1024w, https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/Training-300x75.png 300w, https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/Training-768x193.png 768w, https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/Training.png 1380w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n<p>\u63a5\u7e8c\u5229\u7528\u6b65\u9a5f\u4e8c\u4e09\u56db\u4e94\u5c31\u53ef\u4ee5\u628a\u8a13\u7df4\u597d\u7684\u6a21\u578b\u5c0e\u51fa\u7d66 SparkNLP \u4f7f\u7528<\/p>\n<h5>\u5176\u4ed6\uff1a\u5982\u4f55\u76f4\u63a5\u5728 Spark NLP \u4e0a\u9762 Fine Tune ?\u00a0<a href=\"https:\/\/sparknlp.org\/api\/com\/johnsnowlabs\/nlp\/annotators\/classifier\/dl\/index.html\">\u53c3\u8003<\/a><\/h5>","protected":false},"excerpt":{"rendered":"<p>\u4f7f\u7528 Spark NLP \u53bb\u57f7\u884c Question Answering \u7684\u7bc4\u4f8b\uff0c\u53ef\u4ee5\u53c3\u8003 JohnSnowLabs \u88e1\u9762\u5f88\u591a\u7684 Question Answering \u6a21\u578b\uff0c\u4f8b\u5982 Roberta QA Model\uff0c\u81f3\u65bc\u8981\u600e\u9ebc\u53bb Fine Tune QA \u6a21\u578b\uff1f\u5728 Spark NLP \u88e1\u9762\u4e26\u6c92\u6709\u8b1b\u89e3\u5f97\u5f88\u6e05\u695a\uff0c\u672c\u7bc7\u60f3\u8981\u8a18\u9304\u5982\u4f55 Fine Tune \u4e00\u500b\u81ea\u5df1\u7684 QA \u6a21\u578b\u4f9b Spark NLP \u4f86\u4f7f\u7528\uff1f<\/p>\n","protected":false},"author":1,"featured_media":9184,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[1674,1673],"class_list":["post-9108","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bigdata-ml","tag-machine-learning","tag-nlp"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>[ML] Fine Tune Spark NLP QA model - \u60f3\u65b9\u6d89\u6cd5 - \u91cf\u74f6\u5916\u7684\u5929\u7a7a M-Y-Oceane<\/title>\n<meta name=\"description\" content=\"\u4f7f\u7528 Spark NLP \u53bb\u57f7\u884c Question Answering \u7684\u7bc4\u4f8b\uff0c\u53ef\u4ee5\u53c3\u8003 JohnSnowLabs \u88e1\u9762\u5f88\u591a\u7684 Question Answering \u6a21\u578b\uff0c\u4f8b\u5982 Roberta QA Model\uff0c\u81f3\u65bc\u8981\u600e\u9ebc\u53bb Fine Tune QA \u6a21\u578b\uff1f\u5728 Spark NLP \u88e1\u9762\u4e26\u6c92\u6709\u8b1b\u89e3\u5f97\u5f88\u6e05\u695a\uff0c\u672c\u7bc7\u60f3\u8981\u8a18\u9304\u5982\u4f55 Fine Tune \u4e00\u500b\u81ea\u5df1\u7684 QA \u6a21\u578b\u4f9b Spark NLP \u4f86\u4f7f\u7528\uff1f\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[ML] Fine Tune Spark NLP QA model - \u60f3\u65b9\u6d89\u6cd5 - \u91cf\u74f6\u5916\u7684\u5929\u7a7a M-Y-Oceane\" \/>\n<meta property=\"og:description\" content=\"\u4f7f\u7528 Spark NLP \u53bb\u57f7\u884c Question Answering \u7684\u7bc4\u4f8b\uff0c\u53ef\u4ee5\u53c3\u8003 JohnSnowLabs \u88e1\u9762\u5f88\u591a\u7684 Question Answering \u6a21\u578b\uff0c\u4f8b\u5982 Roberta QA Model\uff0c\u81f3\u65bc\u8981\u600e\u9ebc\u53bb Fine Tune QA \u6a21\u578b\uff1f\u5728 Spark NLP \u88e1\u9762\u4e26\u6c92\u6709\u8b1b\u89e3\u5f97\u5f88\u6e05\u695a\uff0c\u672c\u7bc7\u60f3\u8981\u8a18\u9304\u5982\u4f55 Fine Tune \u4e00\u500b\u81ea\u5df1\u7684 QA \u6a21\u578b\u4f9b Spark NLP \u4f86\u4f7f\u7528\uff1f\" \/>\n<meta property=\"og:url\" content=\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/\" \/>\n<meta property=\"og:site_name\" content=\"\u60f3\u65b9\u6d89\u6cd5 - \u91cf\u74f6\u5916\u7684\u5929\u7a7a M-Y-Oceane\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-04T02:49:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-23T01:15:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/JohnSnowLabs.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"640\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"\u6ab8\u6aac\u7238\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6ab8\u6aac\u7238\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/\"},\"author\":{\"name\":\"\u6ab8\u6aac\u7238\",\"@id\":\"https:\/\/myoceane.fr\/#\/schema\/person\/4a4552fb8c27693083d465e12db7658b\"},\"headline\":\"[ML] Fine Tune Spark NLP QA model\",\"datePublished\":\"2023-08-04T02:49:09+00:00\",\"dateModified\":\"2023-09-23T01:15:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/\"},\"wordCount\":151,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/myoceane.fr\/#\/schema\/person\/4a4552fb8c27693083d465e12db7658b\"},\"image\":{\"@id\":\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/JohnSnowLabs.png\",\"keywords\":[\"Machine Learning\",\"NLP\"],\"articleSection\":[\"Big Data &amp; Machine Learning\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/\",\"url\":\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/\",\"name\":\"[ML] Fine Tune Spark NLP QA model - \u60f3\u65b9\u6d89\u6cd5 - \u91cf\u74f6\u5916\u7684\u5929\u7a7a M-Y-Oceane\",\"isPartOf\":{\"@id\":\"https:\/\/myoceane.fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/JohnSnowLabs.png\",\"datePublished\":\"2023-08-04T02:49:09+00:00\",\"dateModified\":\"2023-09-23T01:15:46+00:00\",\"description\":\"\u4f7f\u7528 Spark NLP \u53bb\u57f7\u884c Question Answering \u7684\u7bc4\u4f8b\uff0c\u53ef\u4ee5\u53c3\u8003 JohnSnowLabs \u88e1\u9762\u5f88\u591a\u7684 Question Answering \u6a21\u578b\uff0c\u4f8b\u5982 Roberta QA Model\uff0c\u81f3\u65bc\u8981\u600e\u9ebc\u53bb Fine Tune QA \u6a21\u578b\uff1f\u5728 Spark NLP \u88e1\u9762\u4e26\u6c92\u6709\u8b1b\u89e3\u5f97\u5f88\u6e05\u695a\uff0c\u672c\u7bc7\u60f3\u8981\u8a18\u9304\u5982\u4f55 Fine Tune \u4e00\u500b\u81ea\u5df1\u7684 QA \u6a21\u578b\u4f9b Spark NLP \u4f86\u4f7f\u7528\uff1f\",\"breadcrumb\":{\"@id\":\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#primaryimage\",\"url\":\"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/JohnSnowLabs.png\",\"contentUrl\":\"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/JohnSnowLabs.png\",\"width\":1280,\"height\":640},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/myoceane.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[ML] Fine Tune Spark NLP QA model\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/myoceane.fr\/#website\",\"url\":\"https:\/\/myoceane.fr\/\",\"name\":\"M-Y-Oceane \u60f3\u65b9\u6d89\u6cd5\u3002\u91cf\u74f6\u5916\u7684\u5929\u7a7a\",\"description\":\"\u60f3\u65b9\u6d89\u6cd5, France, Taiwan, Health, Information Technology\",\"publisher\":{\"@id\":\"https:\/\/myoceane.fr\/#\/schema\/person\/4a4552fb8c27693083d465e12db7658b\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/myoceane.fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/myoceane.fr\/#\/schema\/person\/4a4552fb8c27693083d465e12db7658b\",\"name\":\"\u6ab8\u6aac\u7238\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/myoceane.fr\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6cc678684664f8ad45a8d56a6630b183?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6cc678684664f8ad45a8d56a6630b183?s=96&d=mm&r=g\",\"caption\":\"\u6ab8\u6aac\u7238\"},\"logo\":{\"@id\":\"https:\/\/myoceane.fr\/#\/schema\/person\/image\/\"},\"url\":\"https:\/\/myoceane.fr\/index.php\/author\/johnny5584767gmail-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[ML] Fine Tune Spark NLP QA model - \u60f3\u65b9\u6d89\u6cd5 - \u91cf\u74f6\u5916\u7684\u5929\u7a7a M-Y-Oceane","description":"\u4f7f\u7528 Spark NLP \u53bb\u57f7\u884c Question Answering \u7684\u7bc4\u4f8b\uff0c\u53ef\u4ee5\u53c3\u8003 JohnSnowLabs \u88e1\u9762\u5f88\u591a\u7684 Question Answering \u6a21\u578b\uff0c\u4f8b\u5982 Roberta QA Model\uff0c\u81f3\u65bc\u8981\u600e\u9ebc\u53bb Fine Tune QA \u6a21\u578b\uff1f\u5728 Spark NLP \u88e1\u9762\u4e26\u6c92\u6709\u8b1b\u89e3\u5f97\u5f88\u6e05\u695a\uff0c\u672c\u7bc7\u60f3\u8981\u8a18\u9304\u5982\u4f55 Fine Tune \u4e00\u500b\u81ea\u5df1\u7684 QA \u6a21\u578b\u4f9b Spark NLP \u4f86\u4f7f\u7528\uff1f","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/","og_locale":"en_US","og_type":"article","og_title":"[ML] Fine Tune Spark NLP QA model - \u60f3\u65b9\u6d89\u6cd5 - \u91cf\u74f6\u5916\u7684\u5929\u7a7a M-Y-Oceane","og_description":"\u4f7f\u7528 Spark NLP \u53bb\u57f7\u884c Question Answering \u7684\u7bc4\u4f8b\uff0c\u53ef\u4ee5\u53c3\u8003 JohnSnowLabs \u88e1\u9762\u5f88\u591a\u7684 Question Answering \u6a21\u578b\uff0c\u4f8b\u5982 Roberta QA Model\uff0c\u81f3\u65bc\u8981\u600e\u9ebc\u53bb Fine Tune QA \u6a21\u578b\uff1f\u5728 Spark NLP \u88e1\u9762\u4e26\u6c92\u6709\u8b1b\u89e3\u5f97\u5f88\u6e05\u695a\uff0c\u672c\u7bc7\u60f3\u8981\u8a18\u9304\u5982\u4f55 Fine Tune \u4e00\u500b\u81ea\u5df1\u7684 QA \u6a21\u578b\u4f9b Spark NLP \u4f86\u4f7f\u7528\uff1f","og_url":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/","og_site_name":"\u60f3\u65b9\u6d89\u6cd5 - \u91cf\u74f6\u5916\u7684\u5929\u7a7a M-Y-Oceane","article_published_time":"2023-08-04T02:49:09+00:00","article_modified_time":"2023-09-23T01:15:46+00:00","og_image":[{"width":1280,"height":640,"url":"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/JohnSnowLabs.png","type":"image\/png"}],"author":"\u6ab8\u6aac\u7238","twitter_card":"summary_large_image","twitter_misc":{"Written by":"\u6ab8\u6aac\u7238","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#article","isPartOf":{"@id":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/"},"author":{"name":"\u6ab8\u6aac\u7238","@id":"https:\/\/myoceane.fr\/#\/schema\/person\/4a4552fb8c27693083d465e12db7658b"},"headline":"[ML] Fine Tune Spark NLP QA model","datePublished":"2023-08-04T02:49:09+00:00","dateModified":"2023-09-23T01:15:46+00:00","mainEntityOfPage":{"@id":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/"},"wordCount":151,"commentCount":0,"publisher":{"@id":"https:\/\/myoceane.fr\/#\/schema\/person\/4a4552fb8c27693083d465e12db7658b"},"image":{"@id":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#primaryimage"},"thumbnailUrl":"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/JohnSnowLabs.png","keywords":["Machine Learning","NLP"],"articleSection":["Big Data &amp; Machine Learning"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/","url":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/","name":"[ML] Fine Tune Spark NLP QA model - \u60f3\u65b9\u6d89\u6cd5 - \u91cf\u74f6\u5916\u7684\u5929\u7a7a M-Y-Oceane","isPartOf":{"@id":"https:\/\/myoceane.fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#primaryimage"},"image":{"@id":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#primaryimage"},"thumbnailUrl":"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/JohnSnowLabs.png","datePublished":"2023-08-04T02:49:09+00:00","dateModified":"2023-09-23T01:15:46+00:00","description":"\u4f7f\u7528 Spark NLP \u53bb\u57f7\u884c Question Answering \u7684\u7bc4\u4f8b\uff0c\u53ef\u4ee5\u53c3\u8003 JohnSnowLabs \u88e1\u9762\u5f88\u591a\u7684 Question Answering \u6a21\u578b\uff0c\u4f8b\u5982 Roberta QA Model\uff0c\u81f3\u65bc\u8981\u600e\u9ebc\u53bb Fine Tune QA \u6a21\u578b\uff1f\u5728 Spark NLP \u88e1\u9762\u4e26\u6c92\u6709\u8b1b\u89e3\u5f97\u5f88\u6e05\u695a\uff0c\u672c\u7bc7\u60f3\u8981\u8a18\u9304\u5982\u4f55 Fine Tune \u4e00\u500b\u81ea\u5df1\u7684 QA \u6a21\u578b\u4f9b Spark NLP \u4f86\u4f7f\u7528\uff1f","breadcrumb":{"@id":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#primaryimage","url":"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/JohnSnowLabs.png","contentUrl":"https:\/\/myoceane.fr\/wp-content\/uploads\/2023\/08\/JohnSnowLabs.png","width":1280,"height":640},{"@type":"BreadcrumbList","@id":"https:\/\/myoceane.fr\/index.php\/ml-fine-tune-spark-nlp-qa-model\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/myoceane.fr\/"},{"@type":"ListItem","position":2,"name":"[ML] Fine Tune Spark NLP QA model"}]},{"@type":"WebSite","@id":"https:\/\/myoceane.fr\/#website","url":"https:\/\/myoceane.fr\/","name":"M-Y-Oceane \u60f3\u65b9\u6d89\u6cd5\u3002\u91cf\u74f6\u5916\u7684\u5929\u7a7a","description":"\u60f3\u65b9\u6d89\u6cd5, France, Taiwan, Health, Information Technology","publisher":{"@id":"https:\/\/myoceane.fr\/#\/schema\/person\/4a4552fb8c27693083d465e12db7658b"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/myoceane.fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/myoceane.fr\/#\/schema\/person\/4a4552fb8c27693083d465e12db7658b","name":"\u6ab8\u6aac\u7238","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/myoceane.fr\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6cc678684664f8ad45a8d56a6630b183?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6cc678684664f8ad45a8d56a6630b183?s=96&d=mm&r=g","caption":"\u6ab8\u6aac\u7238"},"logo":{"@id":"https:\/\/myoceane.fr\/#\/schema\/person\/image\/"},"url":"https:\/\/myoceane.fr\/index.php\/author\/johnny5584767gmail-com\/"}]}},"amp_enabled":false,"_links":{"self":[{"href":"https:\/\/myoceane.fr\/index.php\/wp-json\/wp\/v2\/posts\/9108","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/myoceane.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/myoceane.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/myoceane.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/myoceane.fr\/index.php\/wp-json\/wp\/v2\/comments?post=9108"}],"version-history":[{"count":83,"href":"https:\/\/myoceane.fr\/index.php\/wp-json\/wp\/v2\/posts\/9108\/revisions"}],"predecessor-version":[{"id":9284,"href":"https:\/\/myoceane.fr\/index.php\/wp-json\/wp\/v2\/posts\/9108\/revisions\/9284"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/myoceane.fr\/index.php\/wp-json\/wp\/v2\/media\/9184"}],"wp:attachment":[{"href":"https:\/\/myoceane.fr\/index.php\/wp-json\/wp\/v2\/media?parent=9108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/myoceane.fr\/index.php\/wp-json\/wp\/v2\/categories?post=9108"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/myoceane.fr\/index.php\/wp-json\/wp\/v2\/tags?post=9108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}