{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":67121,"databundleVersionId":7806901,"sourceType":"competition"},{"sourceId":50947,"databundleVersionId":5741538,"sourceType":"competition"},{"sourceId":11359,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":8749}],"dockerImageVersionId":30664,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Published on February 27, 2024. By Marília Prata, mpwolke","metadata":{}},{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\npd.set_option('display.max_colwidth', None)\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-02-27T22:30:58.085099Z","iopub.execute_input":"2024-02-27T22:30:58.085432Z","iopub.status.idle":"2024-02-27T22:30:59.071359Z","shell.execute_reply.started":"2024-02-27T22:30:58.085402Z","shell.execute_reply":"2024-02-27T22:30:59.070216Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Competition Citation:\n\n@misc{llm-prompt-recovery,\n\n    author = {Will Lifferth, Paul Mooney, Sohier Dane, Ashley Chow},\n    \n    title = {LLM Prompt Recovery},\n    \n    publisher = {Kaggle},\n    year = {2024},\n    url = {https://kaggle.com/competitions/llm-prompt-recovery}\n}","metadata":{}},{"cell_type":"markdown","source":"#You can't hold a Google/Gemma man down.\n\nBest Sea Shanty ever written? You can't hold a Good man down. Cornwalls' own Pirateers\n\n<iframe width=\"520\" height=\"390\" src=\"https://www.youtube.com/embed/rAP5OJsfQPw\" title=\"Best Sea Shanty ever written? You can&#39;t hold a good man down. Cornwalls&#39; own Pirateers\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen></iframe>https://www.youtube.com/watch?v=rAP5OJsfQPw","metadata":{}},{"cell_type":"code","source":"# Import Dataset \ntrain = pd.read_csv(\"/kaggle/input/llm-prompt-recovery/train.csv\")\ntrain.tail()","metadata":{"execution":{"iopub.status.busy":"2024-02-27T21:51:27.425620Z","iopub.execute_input":"2024-02-27T21:51:27.426007Z","iopub.status.idle":"2024-02-27T21:51:27.452850Z","shell.execute_reply.started":"2024-02-27T21:51:27.425979Z","shell.execute_reply":"2024-02-27T21:51:27.451747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Sea Shanties\n\n\"Singing has been a part of life at sea for centuries. But sea shanties traditionally take a very particular form:\"\n\n\"They are generally 'call and response' songs, with one singer (known as a 'shantyman') leading and everyone else replying with the chorus. They have a regular, heavy rhythm. There may be dozens of versions and verses, but the tune and tempo remain constant.\"\n\nSEA SHANTIES and other SAILOR SONGS\n\nWhat's the difference between sea shanties and other sailor songs?\n\n\"Sea shanties were work songs, devised to accompany particular actions or tasks on board ship.\"\n\n\"They could help keep time among groups of sailors, coordinate physical movements like hauling ropes and raising sails, and relieve the boredom of long, repetitive tasks.\"\n\nhttps://www.rmg.co.uk/stories/topics/sea-shanty-facts-history-meaning#:~:text=Sea%20shanties%20were%20work%20songs,boredom%20of%20long%2C%20repetitive%20tasks.","metadata":{}},{"cell_type":"code","source":"# Import Dataset \ntest = pd.read_csv(\"/kaggle/input/llm-prompt-recovery/test.csv\")\ntest.tail()","metadata":{"execution":{"iopub.status.busy":"2024-02-27T21:52:13.473173Z","iopub.execute_input":"2024-02-27T21:52:13.474116Z","iopub.status.idle":"2024-02-27T21:52:13.489313Z","shell.execute_reply.started":"2024-02-27T21:52:13.474077Z","shell.execute_reply":"2024-02-27T21:52:13.488542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#The prompt provided to Gemma: rewrite_prompt - The target column. ","metadata":{}},{"cell_type":"code","source":"# Import Dataset \nsub = pd.read_csv(\"/kaggle/input/llm-prompt-recovery/sample_submission.csv\")\nsub.tail()","metadata":{"execution":{"iopub.status.busy":"2024-02-27T21:58:12.256890Z","iopub.execute_input":"2024-02-27T21:58:12.257273Z","iopub.status.idle":"2024-02-27T21:58:12.277661Z","shell.execute_reply.started":"2024-02-27T21:58:12.257246Z","shell.execute_reply":"2024-02-27T21:58:12.276530Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('../input/2023-kaggle-ai-report/kaggle_writeups_20230510.csv', nrows =1000)\ndf.head(2)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-02-27T22:31:08.416903Z","iopub.execute_input":"2024-02-27T22:31:08.417358Z","iopub.status.idle":"2024-02-27T22:31:08.528807Z","shell.execute_reply.started":"2024-02-27T22:31:08.417328Z","shell.execute_reply":"2024-02-27T22:31:08.527910Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Generating original_text\n\n\"While we don't know too much about the original text used in the competition test set, the meta-kaggle dataset provides a corpus of forum messages on kaggle that we can use as a simple example.\"","metadata":{}},{"cell_type":"code","source":"##By William Lifferth https://www.kaggle.com/code/wlifferth/starter-notebook-generating-more-data-with-gemma\n\n# Let's grab the first 5 messages to test our generation pipeline:\n\noriginal_texts = df['Writeup'][:5]","metadata":{"execution":{"iopub.status.busy":"2024-02-27T22:31:22.345088Z","iopub.execute_input":"2024-02-27T22:31:22.345830Z","iopub.status.idle":"2024-02-27T22:31:22.351465Z","shell.execute_reply.started":"2024-02-27T22:31:22.345798Z","shell.execute_reply":"2024-02-27T22:31:22.350526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Generating rewrite_prompt","metadata":{}},{"cell_type":"code","source":"#By William Lifferth https://www.kaggle.com/code/wlifferth/starter-notebook-generating-more-data-with-gemma\n\nrewrite_prompts = [\n    'Explain this to me like I could code',\n    'Convert this into a sailor song.',\n    'Make this fun.',\n]","metadata":{"execution":{"iopub.status.busy":"2024-02-27T22:31:38.484573Z","iopub.execute_input":"2024-02-27T22:31:38.484924Z","iopub.status.idle":"2024-02-27T22:31:38.489476Z","shell.execute_reply.started":"2024-02-27T22:31:38.484895Z","shell.execute_reply":"2024-02-27T22:31:38.488527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"![](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRuElSlPc5BbYQRXdGqQfKLmgOIis3qtLVbplvrZlqvX1sQ2C1CteLIdsg-iyERQFKzU7Q&usqp=CAU)Reddit","metadata":{}},{"cell_type":"markdown","source":"#Started 19:31 till 19:33","metadata":{}},{"cell_type":"code","source":"#By William Lifferth https://www.kaggle.com/code/wlifferth/starter-notebook-generating-more-data-with-gemma\n\n!pip install -q -U immutabledict sentencepiece \n!git clone https://github.com/google/gemma_pytorch.git\n!mkdir /kaggle/working/gemma/\n!mv /kaggle/working/gemma_pytorch/gemma/* /kaggle/working/gemma/\n\nimport sys \nsys.path.append(\"/kaggle/working/gemma_pytorch/\") \nfrom gemma.config import GemmaConfig, get_config_for_7b, get_config_for_2b\nfrom gemma.model import GemmaForCausalLM\nfrom gemma.tokenizer import Tokenizer\nimport contextlib\nimport os\nimport torch\n\n# Load the model\nVARIANT = \"7b-it-quant\" \nMACHINE_TYPE = \"cuda\" \nweights_dir = '/kaggle/input/gemma/pytorch/7b-it-quant/2' \n\n@contextlib.contextmanager\ndef _set_default_tensor_type(dtype: torch.dtype):\n  \"\"\"Sets the default torch dtype to the given dtype.\"\"\"\n  torch.set_default_dtype(dtype)\n  yield\n  torch.set_default_dtype(torch.float)\n\n# Model Config.\nmodel_config = get_config_for_2b() if \"2b\" in VARIANT else get_config_for_7b()\nmodel_config.tokenizer = os.path.join(weights_dir, \"tokenizer.model\")\nmodel_config.quant = \"quant\" in VARIANT\n\n# Model.\ndevice = torch.device(MACHINE_TYPE)\nwith _set_default_tensor_type(model_config.get_dtype()):\n  model = GemmaForCausalLM(model_config)\n  ckpt_path = os.path.join(weights_dir, f'gemma-{VARIANT}.ckpt')\n  model.load_weights(ckpt_path)\n  model = model.to(device).eval()","metadata":{"execution":{"iopub.status.busy":"2024-02-27T22:31:45.588078Z","iopub.execute_input":"2024-02-27T22:31:45.588959Z","iopub.status.idle":"2024-02-27T22:33:04.522630Z","shell.execute_reply.started":"2024-02-27T22:31:45.588920Z","shell.execute_reply":"2024-02-27T22:33:04.521707Z"},"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Started 19:34 till 19:38","metadata":{}},{"cell_type":"code","source":"#By William Lifferth https://www.kaggle.com/code/wlifferth/starter-notebook-generating-more-data-with-gemma\n\n# Now we can loop through our input texts, randomly select a rewrite prompt, and see Gemma in action:\n\nimport random\nrandom.seed(0)\n# This is the prompt format the model expects\nUSER_CHAT_TEMPLATE = \"<start_of_turn>user\\n{prompt}<end_of_turn>\\n<start_of_turn>model\\n\"\n\nrewrite_data = []\n\nfor original_text in original_texts:\n    rewrite_prompt = random.choice(rewrite_prompts)\n    prompt = f'{rewrite_prompt}\\n{original_text}'\n    rewritten_text = model.generate(\n        USER_CHAT_TEMPLATE.format(prompt=prompt),\n        device=device,\n        output_len=100,\n    )\n    rewrite_data.append({\n        'original_text': original_text,\n        'rewrite_prompt': rewrite_prompt,\n        'rewritten_text': rewritten_text,\n    })","metadata":{"execution":{"iopub.status.busy":"2024-02-27T22:33:17.081591Z","iopub.execute_input":"2024-02-27T22:33:17.082124Z","iopub.status.idle":"2024-02-27T22:37:03.639660Z","shell.execute_reply.started":"2024-02-27T22:33:17.082087Z","shell.execute_reply":"2024-02-27T22:37:03.638804Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#By William Lifferth https://www.kaggle.com/code/wlifferth/starter-notebook-generating-more-data-with-gemma\n\n# Let's turn our generated data into a dataframe, and spot check the first rewrite to see if it makes sense.\nrewrite_data_df = pd.DataFrame(rewrite_data)\nrewrite_data_df[:1].values","metadata":{"execution":{"iopub.status.busy":"2024-02-27T22:37:42.149548Z","iopub.execute_input":"2024-02-27T22:37:42.150382Z","iopub.status.idle":"2024-02-27T22:37:42.158260Z","shell.execute_reply.started":"2024-02-27T22:37:42.150350Z","shell.execute_reply":"2024-02-27T22:37:42.157399Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Maybe Kaggle team will change the Kaggle merchandise to that Shirt : )","metadata":{}},{"cell_type":"code","source":"#codes from Rodrigo Lima  @rodrigolima82\nfrom IPython.display import Image\nImage(url = 'data:image/jpeg;base64,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',width=400,height=400)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-27T22:55:03.693227Z","iopub.execute_input":"2024-02-27T22:55:03.693924Z","iopub.status.idle":"2024-02-27T22:55:03.735013Z","shell.execute_reply.started":"2024-02-27T22:55:03.693862Z","shell.execute_reply":"2024-02-27T22:55:03.733974Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Acknowledgements:\n\nWilliam Lifferth, Paul Mooney and Sohier Dane https://www.kaggle.com/code/wlifferth/starter-notebook-generating-more-data-with-gemma","metadata":{}}]}