From c85a6b8319609a3a82f1c10cef549477927f6e77 Mon Sep 17 00:00:00 2001 From: rickyx Date: Tue, 24 Sep 2024 00:53:36 +0000 Subject: [PATCH 1/6] update ipython --- templates/batch-llm/README.ipynb | 1617 ++++++++++++----- .../batch-llm/assets/configure-a10g-1.png | Bin 0 -> 72970 bytes .../batch-llm/assets/configure-a10g-2.png | Bin 0 -> 44859 bytes .../batch-llm/configs/llama-3.1-8b-a10g.yaml | 19 + templates/batch-llm/util/utils.py | 37 - 5 files changed, 1202 insertions(+), 471 deletions(-) create mode 100644 templates/batch-llm/assets/configure-a10g-1.png create mode 100644 templates/batch-llm/assets/configure-a10g-2.png create mode 100644 templates/batch-llm/configs/llama-3.1-8b-a10g.yaml diff --git a/templates/batch-llm/README.ipynb b/templates/batch-llm/README.ipynb index 049cb8556..c8df2156b 100644 --- a/templates/batch-llm/README.ipynb +++ b/templates/batch-llm/README.ipynb @@ -1,183 +1,89 @@ { "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# LLM offline batch inference with Ray Data and vLLM\n", - "\n", - "**⏱️ Time to complete**: 10 min\n", - "\n", - "This template shows you how to:\n", - "1. Read in data from in-memory samples or files on cloud storage. \n", - "2. Use Ray Data and vLLM to run batch inference of a LLM.\n", - "3. Write the inference outputs to cloud storage.\n", - "\n", - "For a Python script version of the code in this workspace template, refer to `main.py`.\n", - "\n", - "**Note:** This tutorial runs within a workspace. Review the `Introduction to Workspaces` template before this tutorial.\n", - "\n", - "### How to decide between online vs offline inference for LLM\n", - "Online LLM inference (e.g. Anyscale Endpoint) should be used when you want to get real-time response for prompt or to interact with the LLM. Use online inference when you want to optimize latency of inference to be as quick as possible.\n", - "\n", - "On the other hand, offline LLM inference (also referred to as batch inference) should be used when you want to get reponses for a large number of prompts within some time frame, but not required to be real-time (minutes to hours granularity). Use offline inference when you want to:\n", - "1. Scale your workload to large-scale datasets\n", - "2. Optimize inference throughput and resource usage (for example, maximizing GPU utilization).\n", - "\n", - "In this tutorial, we will focus on the latter, using offline LLM inference for a sentence completion task." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Step 1: Set up model configs\n", - "\n", - "First, import the dependencies used in this template." - ] - }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "import os\n", - "from typing import Dict\n", + "from rayllm_batch.workload import ChatWorkloadBase\n", + "from typing import Optional, Dict, Any\n", + "import ray \n", + "from ray.data.dataset import Dataset\n", + "from dataclasses import dataclass, field\n", "\n", - "import numpy as np\n", - "import ray\n", - "from vllm import LLM, SamplingParams\n", "\n", - "from util.utils import (\n", - " generate_output_path,\n", - " get_a10g_or_equivalent_accelerator_type,\n", - " prompt_for_hugging_face_token,\n", - ")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Set up values that will be used in the batch inference workflow:\n", - "* The model to use for inference ([see the list of vLLM models](https://docs.vllm.ai/en/latest/models/supported_models.html)).\n", - " * This workspace template has been tested and verified with the following models:\n", - " * [`meta-llama/Meta-Llama-3-8B-Instruct`](https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct)\n", - " * [`meta-llama/Llama-2-7b-chat-hf`](https://huggingface.co/meta-llama/Llama-2-7b-chat-hf)\n", - " * [`mistralai/Mistral-7B-Instruct-v0.1`](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.1)\n", - " * [`google/gemma-7b-it`](https://huggingface.co/google/gemma-7b-it)\n", - " * [`mlabonne/NeuralHermes-2.5-Mistral-7B`](https://huggingface.co/mlabonne/NeuralHermes-2.5-Mistral-7B)\n", - " * Support for the following larger models are actively a work-in-progress, and will be supported very soon:\n", - " * [`meta-llama/Meta-Llama-3-70B-Instruct`](https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct)\n", - " * [`meta-llama/Llama-2-13b-chat-hf`](https://huggingface.co/meta-llama/Llama-2-13b-chat-hf)\n", - " * [`mistralai/Mixtral-8x7B-Instruct-v0.1`](https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1)\n", - " * [`meta-llama/Llama-2-70b-chat-hf`](https://huggingface.co/meta-llama/Llama-2-70b-chat-hf)\n", - " * [`codellama/CodeLlama-70b-Instruct-hf`](https://huggingface.co/codellama/CodeLlama-70b-Instruct-hf)\n", - "* The [sampling parameters object](https://github.com/vllm-project/vllm/blob/main/vllm/sampling_params.py) used by vLLM.\n", - "* The output path where results will be written as parquet files." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Set to the name of the Hugging Face model that you wish to use from the preceding list.\n", - "# Note that using the Llama models will prompt you to set your Hugging Face user token.\n", - "HF_MODEL = \"mistralai/Mistral-7B-Instruct-v0.1\"\n", + "@dataclass\n", + "class CNNDailySummary(ChatWorkloadBase):\n", + " \"\"\"The CNN/DailyMail summarization workload.\"\"\"\n", "\n", - "# Create a sampling params object.\n", - "sampling_params = SamplingParams(n=1, temperature=0, max_tokens=2048, stop=[\"<|eot_id|>\", \"<|end_of_text|>\"])\n", + " # We directly load the dataset from Hugging Face.\n", + " dataset_file: Optional[str] = None\n", + " # We will load only a portion of the dataset to run inference faster for the tutorial.\n", + " dataset_fraction: float = 0.0005 # 0.2% of the 300K entries.\n", + " # The sampling params for the LLM inference workload.\n", + " sampling_params: Dict[str, Any] = field(default_factory=lambda: {\"max_tokens\": 200})\n", "\n", - "# Output path to write output result. You can also change this to any cloud storage path,\n", - "# e.g. a specific S3 bucket.\n", - "output_path = generate_output_path(\n", - " # `ANYSCALE_ARTIFACT_STORAGE` is the URI to the pre-generated folder for storing\n", - " # your artifacts while keeping them separate them from Anyscale-generated ones.\n", - " # See: https://docs.anyscale.com/workspaces/storage#object-storage-s3-or-gcs-buckets\n", - " os.environ.get(\"ANYSCALE_ARTIFACT_STORAGE\"),\n", - " HF_MODEL,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Some models will require you to input your [Hugging Face user access token](https://huggingface.co/docs/hub/en/security-tokens). This will be used to authenticate/download the model and **is required for official LLaMA, Mistral, and Gemma models**. You can use one of the other models which don't require a token if you don't have access to this model (for example, `mlabonne/NeuralHermes-2.5-Mistral-7B`).\n", + " def load_dataset(self) -> Dataset:\n", + " # Load the dataset from Hugging Face into Ray Data.\n", + " import datasets # type: ignore\n", + "\n", + " df = datasets.load_dataset(\"cnn_dailymail\", \"3.0.0\")\n", + " return ray.data.from_huggingface(df[\"train\"])\n", "\n", - "Run the following cell to start the authentication flow. A VS Code overlay will appear and prompt you to enter your Hugging Face token if your selected model requires authentication. The token will be cached to a file in the workspace so it can be used to launch an Anyscale Job later without needing to re-authenticate." + " def parse_row(self, row: dict[str, Any]) -> dict[str, Any]:\n", + " # Parse the row into the format expected by the model.\n", + " # We will use the article as the user prompt, and ask the model to \n", + " # generate a summary with the system prompt.\n", + " return {\n", + " \"messages\": [\n", + " {\n", + " \"role\": \"system\",\n", + " \"content\": \"You are a commentator. Your task is to \"\n", + " \"summarize highlights from article.\",\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": f\"# Article:\\n{row['article']}\\n\\n\"\n", + " \"#Instructions:\\nIn clear and concise language, \"\n", + " \"summarize the highlights presented in the article.\",\n", + " },\n", + " ]\n", + " }" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Successfully read cached token at huggingface_token.txt.\n" + ] + } + ], "source": [ "# Prompts the user for Hugging Face token if required by the model.\n", - "HF_TOKEN = prompt_for_hugging_face_token(HF_MODEL)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Start up Ray, using the Hugging Face token as an environment variable so that it's made available to all nodes in the cluster." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if ray.is_initialized():\n", - " ray.shutdown()\n", - "ray.init(\n", - " runtime_env={\n", - " \"env_vars\": {\"HF_TOKEN\": HF_TOKEN},\n", - " }\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Step 2: Read input data with Ray Data\n", - "Use Ray Data to read in your input data from some sample prompts." + "from util.utils import prompt_for_hugging_face_token\n", + "HF_TOKEN = prompt_for_hugging_face_token(\"meta-llama/Meta-Llama-3.1-8B-Instruct\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "# Create some sample sentences, and use Ray Data to create a dataset for it.\n", - "prompts = [\n", - " \"I always wanted to be a ...\",\n", - " \"The best way to learn a new language is ...\",\n", - " \"The biggest challenge facing our society today is ...\",\n", - " \"One thing I would change about my past is ...\",\n", - " \"The key to a happy life is ...\",\n", - "]\n", - "ds = ray.data.from_items(prompts)\n", + "from rayllm_batch import init_engine_from_config\n", + "# Read the model configs from the path.\n", + "model_config_path = \"configs/llama-3.1-8b-a10g.yaml\"\n", "\n", - "# View one row of the Dataset.\n", - "ds.take(1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Construct the input prompts for your model using the format required by the specific model. Run the cell below to apply this prompt construction to each row in the Dataset with Ray Data's [`map`](https://docs.ray.io/en/latest/data/api/doc/ray.data.Dataset.map.html) method." + "# One could potentially override the engine configs by passing in a dictionary here.\n", + "override = {\"runtime_env\": {\"env_vars\": {\"HF_TOKEN\": HF_TOKEN}}} # Override Ray's runtime env to include the Hugging Face token. Ray is being used under the hood to orchestrate the inference pipeline.\n", + "engine_config = init_engine_from_config(config=model_config_path, override=override)\n" ] }, { @@ -185,285 +91,1152 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "model_name_to_input_prompt_format = {\n", - " \"meta-llama/Llama-2-7b-chat-hf\": \"[INST] {} [/INST]\",\n", - " \"mistralai/Mistral-7B-Instruct-v0.1\": \"[INST] {} [/INST]\",\n", - " \"google/gemma-7b-it\": \"model\\n{}\\n\",\n", - " \"mlabonne/NeuralHermes-2.5-Mistral-7B\": \"<|im_start|>system\\nYou are a helpful assistant that will complete the sentence in the given input prompt.<|im_end|>\\n<|im_start|>user{}<|im_end|>\\n<|im_start|>assistant\",\n", - " \"meta-llama/Meta-Llama-3-8B-Instruct\": (\n", - " \"<|start_header_id|>system<|end_header_id|>\\n\\nYou are a helpful assistant. Complete the given prompt in several concise sentences.<|eot_id|>\\n\"\n", - " \"<|start_header_id|>user<|end_header_id|>\\n\\n{}<|eot_id|>\\n\"\n", - " \"<|start_header_id|>assistant<|end_header_id|>\\n\\n\"\n", - " ),\n", - "}\n", - "\n", - "def construct_input_prompt(row, text_column):\n", - " \"\"\"Given the input row with raw text in `text_column` column,\n", - " construct the input prompt for the model.\"\"\"\n", - " prompt_format = model_name_to_input_prompt_format.get(HF_MODEL)\n", - " if prompt_format:\n", - " row[text_column] = prompt_format.format(row[text_column])\n", - " return row\n", - "\n", - "ds = ds.map(construct_input_prompt, fn_kwargs={\"text_column\": \"item\"})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So far, we have defined two operations of the Dataset (`from_items()`, `map()`), but have not executed the Dataset yet and don't see any results. Why is that?\n", - "\n", - "Ray Data uses [lazy, streaming execution](https://docs.ray.io/en/latest/data/data-internals.html#execution) by default, which means that:\n", - "- Datasets and any associated transformations are not executed until you call a consuming operation such as [`ds.take()`](https://docs.ray.io/en/latest/data/api/doc/ray.data.Dataset.take.html), [`ds.take_all()`](https://docs.ray.io/en/latest/data/api/doc/ray.data.Dataset.take_all.html), [`ds.iter_batches()`](https://docs.ray.io/en/latest/data/api/doc/ray.data.DataIterator.iter_batches.html), or [`Dataset.write_parquet()`](https://docs.ray.io/en/latest/data/api/doc/ray.data.Dataset.write_parquet.html).\n", - "- The entire Dataset is not stored in memory, but rather, the Dataset is executed incrementally on parts of data while overlapping execution of various operations in the Dataset. This allows Ray Data to execute batch transformations without needing to load the entire dataset into memory and overlap data preprocessing and model training steps during ML training.\n", - "\n", - "We will trigger Dataset execution after the next step, which is applying the vLLM model to the formatted input prompts." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Step 3: Run Batch Inference with vLLM\n", - "\n", - "Create a class to define batch inference logic." - ] + "source": [] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-09-24 00:44:00,222\tINFO worker.py:1601 -- Connecting to existing Ray cluster at address: 10.0.27.195:6379...\n", + "2024-09-24 00:44:00,230\tINFO worker.py:1777 -- Connected to Ray cluster. View the dashboard at \u001b[1m\u001b[32mhttps://session-5abw5nxh2chqdlhxiklnw6cu1k.i.anyscaleuserdata.com \u001b[39m\u001b[22m\n", + "2024-09-24 00:44:00,233\tINFO packaging.py:359 -- Pushing file package 'gcs://_ray_pkg_0fa039546672a8668c01da562dca2994d8a900a9.zip' (0.65MiB) to Ray cluster...\n", + "2024-09-24 00:44:00,240\tINFO packaging.py:372 -- Successfully pushed file package 'gcs://_ray_pkg_0fa039546672a8668c01da562dca2994d8a900a9.zip'.\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6a2da2d3906046e990a8022911824d7d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Parquet Files Sample 0: 0%| | 0.00/2.00 [00:00 TaskPoolMapOperator[ReadParquet] -> TaskPoolMapOperator[MapBatches(random_sample)->Map(CNNDailySummary.parse_row)] -> LimitOperator[limit=1]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7c4978315d74428e92e24e8bbd62866f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Running 0: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7bea3d3deeed4aa786d1a04cb1b37873", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- ReadParquet->SplitBlocks(11) 1: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3ef40f88fa404097ae6a74a4452b61e1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- MapBatches(random_sample)->Map(CNNDailySummary.parse_row) 2: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6972c4c396994be48d6a28c919f4c9cc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- limit=1 3: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-09-24 00:44:06,026\tWARNING progress_bar.py:122 -- Truncating long operator name to 100 characters.To disable this behavior, set `ray.data.DataContext.get_current().DEFAULT_ENABLE_PROGRESS_BAR_NAME_TRUNCATION = False`.\n", + "/home/ray/anaconda3/lib/python3.11/site-packages/rayllm_batch/main.py:59: UserWarning: The dataset must have an 'id' column to support Ray Data checkpoint. Please use the 'generate_id' method to generate the 'id' column.\n", + " ds = self.workload.load_dataset_and_process()\n", + "2024-09-24 00:44:13,738\tINFO streaming_executor.py:108 -- Starting execution of Dataset. Full logs are in /tmp/ray/session_2024-09-24_00-28-42_051202_2516/logs/ray-data\n", + "2024-09-24 00:44:13,739\tINFO streaming_executor.py:109 -- Execution plan of Dataset: InputDataBuffer[Input] -> TaskPoolMapOperator[ReadParquet] -> TaskPoolMapOperator[MapBatches(random_sample)->Map(CNNDailySummary.parse_row)] -> AllToAllOperator[Repartition] -> ActorPoolMapOperator[MapBatches(ChatTemplateTokenizer)]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "24f6b01339c0487cac8dfe13b6314942", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Running 0: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "def0af2022914ae380cc15c55f119c0e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- ReadParquet->SplitBlocks(11) 1: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5bf31b53d17149318a712c3c071788eb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- MapBatches(random_sample)->Map(CNNDailySummary.parse_row) 2: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7ba421437f154ebe840291ce84921d06", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- Repartition 3: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "770f1adc4d2b48a5abff5304d122aa45", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Split Repartition 4: 0%| | 0.00/1.00 [00:00 AllToAllOperator[Repartition]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "33a9572a0ef2415ab50552b6e58782da", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Running 0: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "389e955f646348f6bd04fe9bb0c68ef2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- Repartition 1: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d3c6cba6ab21436f979350e312c306d6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Split Repartition 2: 0%| | 0.00/1.00 [00:00 AllToAllOperator[Aggregate] -> LimitOperator[limit=1]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "af8ab901881c44dba944852dfdf4c242", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Running 0: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bbd5616aab024236a5956b48944526ac", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- Aggregate 1: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1afa0b8a5e3549ca99e26e013b084a34", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Sort Sample 2: 0%| | 0.00/1.00 [00:00 AllToAllOperator[Aggregate] -> LimitOperator[limit=1]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "758f92a707eb4fc4b4ffd834f9b7f225", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Running 0: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "48a99a31d1944cbd82bdf279aa63f6ab", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- Aggregate 1: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7ad0133687b8415d96f7885b849128ea", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Sort Sample 2: 0%| | 0.00/1.00 [00:00 AllToAllOperator[Aggregate] -> LimitOperator[limit=1]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "06ec4d143bf142cbaf8ffecc6103e7a6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Running 0: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d290146e9a974eff9a337a23aa05d512", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- Aggregate 1: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "de254d90f2814caebc9292c6de80d184", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Sort Sample 2: 0%| | 0.00/1.00 [00:00 AllToAllOperator[Aggregate] -> LimitOperator[limit=1]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b8e7ed02a15b4b1196e8b000bda32b77", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Running 0: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "73441e539cca44abbe689d2f596b1b12", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- Aggregate 1: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b07b21b615d24963b14a168cb93d762b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Sort Sample 2: 0%| | 0.00/1.00 [00:00 ActorPoolMapOperator[MapBatches(AsyncLLMPredictor)] -> ActorPoolMapOperator[MapBatches(Detokenizer)]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a442fdab1fb64a2b9877cb85072aa662", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Running 0: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[36m(_MapWorker pid=29524)\u001b[0m GPU memory used (GB): 0=0.50\n", + "\u001b[36m(_MapWorker pid=29524)\u001b[0m Done waiting for free GPU memory on devices [0] (0.98 GB) 0.01 s\n", + "\u001b[36m(_MapWorker pid=29524)\u001b[0m Max pending requests is set to 71\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[36m(_MapWorker pid=29524)\u001b[0m INFO 09-24 00:44:25 llm_engine.py:223] Initializing an LLM engine (v0.6.1.post1) with config: model='meta-llama/Meta-Llama-3.1-8B-Instruct', speculative_config=None, tokenizer='meta-llama/Meta-Llama-3.1-8B-Instruct', skip_tokenizer_init=False, tokenizer_mode=auto, revision=None, override_neuron_config=None, rope_scaling=None, rope_theta=None, tokenizer_revision=None, trust_remote_code=False, dtype=torch.bfloat16, max_seq_len=2380, download_dir=None, load_format=LoadFormat.AUTO, tensor_parallel_size=1, pipeline_parallel_size=1, disable_custom_all_reduce=False, quantization=None, enforce_eager=False, kv_cache_dtype=auto, quantization_param_path=None, device_config=cuda, decoding_config=DecodingConfig(guided_decoding_backend='outlines'), observability_config=ObservabilityConfig(otlp_traces_endpoint=None, collect_model_forward_time=False, collect_model_execute_time=False), seed=0, served_model_name=meta-llama/Meta-Llama-3.1-8B-Instruct, use_v2_block_manager=True, num_scheduler_steps=1, enable_prefix_caching=False, use_async_output_proc=True)\n", + "\u001b[36m(_MapWorker pid=29524)\u001b[0m INFO 09-24 00:44:26 model_runner.py:997] Starting to load model meta-llama/Meta-Llama-3.1-8B-Instruct...\n", + "\u001b[36m(_MapWorker pid=29524)\u001b[0m INFO 09-24 00:44:27 weight_utils.py:242] Using model weights format ['*.safetensors']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading safetensors checkpoint shards: 0% Completed | 0/4 [00:00 AllToAllOperator[Aggregate] -> LimitOperator[limit=1]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7e35d71dc7e54b59aa7de6f1941d8b35", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Running 0: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0f2a096477bd456c90ba3525ce1edc43", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- Aggregate 1: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8e5196c0d0554778b1436beccb703ff8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Sort Sample 2: 0%| | 0.00/1.00 [00:00 AllToAllOperator[Aggregate] -> LimitOperator[limit=1]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "caf0d8f6064149ea9d316dd63930a3e7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Running 0: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "64fa32b75ab74d8eb66300654fe53cb2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- Aggregate 1: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "529589d6cafb4e1581ae41a40e0b37b3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Sort Sample 2: 0%| | 0.00/1.00 [00:00 LimitOperator[limit=1]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "47831c9f1f8845e987e66c3d1761e07b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Running 0: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ca3cd72b1f034178b597e0089aaa5d49", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "- limit=1 1: 0.00 row [00:00, ? row/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\"In Kabul, Afghanistan, over 1,000 bottles of alcohol were destroyed as part of a crackdown on smuggling and sales. The bottles were confiscated from Afghan sources over a two-year period, mostly from international hotels and handed over to customs officials who burnt them. This movemade facilitates enforcement of Afghanistan's ban on alcohol due to its largely Muslim population, with only a few specifically designated areas allowing its sale for foreigners.\"" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[36m(autoscaler +4m31s)\u001b[0m Tip: use `ray status` to view detailed cluster status. To disable these messages, set RAY_SCHEDULER_EVENTS=0.\n" + ] + } + ], "source": [ - "# Mapping of model name to max_model_len supported by model.\n", - "model_name_to_args = {\n", - " \"mistralai/Mistral-7B-Instruct-v0.1\": {\"max_model_len\": 16832},\n", - " \"google/gemma-7b-it\": {\"max_model_len\": 2432},\n", - " \"mlabonne/NeuralHermes-2.5-Mistral-7B\": {\"max_model_len\": 16800},\n", - "}\n", - "\n", - "class LLMPredictor:\n", - " def __init__(self, text_column):\n", - " # Name of column containing the input text.\n", - " self.text_column = text_column\n", + "from rayllm_batch import RayLLMBatch\n", "\n", - " # Create an LLM.\n", - " self.llm = LLM(\n", - " model=HF_MODEL,\n", - " **model_name_to_args.get(HF_MODEL, {}),\n", - " # Note: add additional args to LLM constructor below.\n", - " )\n", "\n", - " def __call__(self, batch: Dict[str, np.ndarray]) -> Dict[str, list]:\n", - " # Generate texts from the prompts.\n", - " # The output is a list of RequestOutput objects that contain the prompt,\n", - " # generated text, and other information.\n", - " outputs = self.llm.generate(batch[self.text_column], sampling_params)\n", - " prompt = []\n", - " generated_text = []\n", - " for output in outputs:\n", - " prompt.append(output.prompt)\n", - " generated_text.append(' '.join([o.text for o in output.outputs]))\n", - " return {\n", - " \"prompt\": prompt,\n", - " \"generated_text\": generated_text,\n", - " }" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Scaling with GPUs\n", - "\n", - "Next, apply batch inference for all input data with the Ray Data [`map_batches`](https://docs.ray.io/en/latest/data/api/doc/ray.data.Dataset.map_batches.html) method. When using vLLM, LLM instances require GPUs; here, we will demonstrate how to configure Ray Data to scale the number of LLM instances and GPUs needed.\n", - "\n", - "To use GPUs for inference in the Workspace, we can specify `num_gpus` and `concurrency` in the `ds.map_batches()` call below to indicate the number of LLM instances and the number of GPUs per LLM instance, respectively. For example, if we want to use 4 LLM instances, with each requiring 1 GPU, we would set `concurrency=4` and `num_gpus=1`, requiring 4 total GPUs.\n", - "\n", - "Smaller models, such as `Meta-Llama-3-8B-Instruct` and `Mistral-7B-Instruct-v0.1`, typically require 1 GPU per instance. Larger models, such as `Mixtral-8x7B-Instruct-v0.1` and `meta-llama/Meta-Llama-3-70B-Instruct`, typically require multiple GPUs per instance. You should configure these parameters according to the compute needed by the model." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds = ds.map_batches(\n", - " LLMPredictor,\n", - " # Set the concurrency to the number of LLM instances.\n", - " concurrency=4,\n", - " # Specify the number of GPUs required per LLM instance.\n", - " num_gpus=1,\n", + "workload = CNNDailySummary()\n", + "batch = RayLLMBatch(\n", + " engine_cfg=engine_config,\n", + " workload=workload,\n", " # Specify the batch size for inference. Set the batch size to as large as possible without running out of memory.\n", - " # If you encounter out-of-memory errors, decreasing batch_size may help.\n", - " batch_size=5,\n", - " # Pass keyword arguments for the LLMPredictor class.\n", - " fn_constructor_kwargs={\"text_column\": \"item\"},\n", - " # Select the accelerator type; A10G or L4.\n", - " accelerator_type=get_a10g_or_equivalent_accelerator_type(),\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, make sure to either enable *Auto-select worker nodes* or configure your workspace cluster to have the appropriate GPU worker nodes (A10G or L4):\n", - "\n", - "![title](assets/ray-data-gpu.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the following cell to start dataset execution and view the results!\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.take_all()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Scaling to a larger dataset\n", - "In the example above, we performed batch inference for Ray Dataset with 5 example prompts. Next, let's explore how to scale to a larger dataset based on files stored in cloud storage.\n", + " # If you encounter out-of-memory errors, decreasing batch_size may help. \n", + " batch_size=None,\n", + " # Set the number of replicas to use for the inference. Each replica will run one instance of inference pipeline.\n", + " num_replicas=1,\n", + ")\n", "\n", - "Run the following cell to create a Dataset from a text file stored on S3. This Dataset has 100 rows, with each row containing a single prompt in the `text` column." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds = ray.data.read_text(\"s3://anonymous@air-example-data/prompts_100.txt\")\n", - "ds.take(1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Customizing your LLM instance\n", - "If you wish to further customize vLLM, you can modify the `LLMPredictor` class defined earlier in Step 3 as follows:\n", - "- Add kwargs for initializing the `LLM` object in `LLMPredictor.__init__()` as indicated by the comment, in Step 3.\n", - "- Modify the `SamplingParams` object defined earlier in the notebook, in Step 1.\n", - "- For a more advanced usage case of using a different `SamplingParams` for each `LLM.generate()` call, follow these steps:\n", - " 1. Add a new argument to `LLMPredictor.__call__()`, which takes a function that returns a `SamplingParams` object to be used for the subsequent `LLM.generate()` call.\n", - " 2. This function should be passed to `LLMPredictor` in the `fn_constructor_kwargs` argument of the `map_batches()` call in the next section. \n", - " 3. Finally, in `LLMPredictor.__call__()`, call this function, and pass the generated `SamplingParams` object to `LLM.generate()`." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Similar to before, we apply batch inference for all input data with the Ray Data [`map_batches`](https://docs.ray.io/en/latest/data/api/doc/ray.data.Dataset.map_batches.html) method." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds = ds.map(construct_input_prompt, fn_kwargs={\"text_column\": \"text\"})\n", - "ds = ds.map_batches(\n", - " LLMPredictor,\n", - " # Set the concurrency to the number of LLM instances.\n", - " concurrency=4,\n", - " # Specify the number of GPUs required per LLM instance.\n", - " num_gpus=1,\n", - " # Specify the batch size for inference. Set the batch size to as large possible without running out of memory.\n", - " # If you encounter CUDA out-of-memory errors, decreasing batch_size may help.\n", - " batch_size=5,\n", - " # Pass keyword arguments for the LLMPredictor class.\n", - " fn_constructor_kwargs={\"text_column\": \"text\"},\n", - " # Select the accelerator type; A10G or L4.\n", - " accelerator_type=get_a10g_or_equivalent_accelerator_type(),\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Output Results\n", - "Finally, write the inference output data out to Parquet files on S3. \n", "\n", - "Running the following cell will trigger execution for the full Dataset, which will execute all of the operations (`read_text()`, `map_batches(LLMPredictor)`, `write_parquet()`) at once:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.write_parquet(output_path, try_create_dir=False)\n", - "print(f\"Batch inference result is written into {output_path}.\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Monitoring Dataset execution\n", - "We can use the Ray Dashboard to monitor the Dataset execution. In the Ray Dashboard tab, navigate to the Job page and open the \"Ray Data Overview\" section. Click on the link for the running job, and open the \"Ray Data Overview\" section to view the details of the batch inference execution:\n", + "# This will runs until completion.\n", + "ds = batch.run()\n", "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Handling GPU out-of-memory failures\n", - "If you run into CUDA out of memory, your batch size is likely too large. Decrease the batch size as described above.\n", "\n", - "If your batch size is already set to 1, then use either a smaller model or GPU devices with more memory." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reading back results\n", - "We can also use Ray Data to read back the output files to ensure the results are as expected." + "# Read the results\n", + "gen_texts = [r[\"generated_text\"] for r in ds.take_all()]\n", + "print(gen_texts)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ - "ds_output = ray.data.read_parquet(output_path)\n", - "ds_output.take(5)" + "gen_texts = [r[\"generated_text\"] for r in ds.take_all()]" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 8, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\"In Kabul, Afghanistan, over 1,000 bottles of alcohol were destroyed as part of a crackdown on smuggling and sales. The bottles were confiscated from Afghan sources over a two-year period, mostly from international hotels and handed over to customs officials who burnt them. This movemade facilitates enforcement of Afghanistan's ban on alcohol due to its largely Muslim population, with only a few specifically designated areas allowing its sale for foreigners.\",\n", + " 'Here are the article\\'s highlights summarized:\\n\\nPhotographer Eiko Jones was taking underwater pictures of plants near Campbell River in Canada when he was suddenly surrounded by thousands of tadpoles swimming at the Cedar Lake. The 41-year-old photographer was initially startled by the large group of tadpoles, which appeared as a \"cloud\" swimming around him for about ten minutes. The rare sighting was a unique experience for Jones, who stated that he had never seen or heard of tadpoles schooling before.',\n", + " 'Two high-ranking officials were killed in a plane crash over the Escondido River in Mexico. \\n\\nKey points:\\n\\n- The victims were Mayor Jose Manuel Maldonado of Piedras Negras and Coahuila official Horacio del Bosque Davila.\\n- They were on a plane that took off from Piedras Negras and crashed into a lake known as the Fragua Dam.\\n- The pilot, whose name has not been released, is presumed dead.\\n- The aircraft involved in the incident was a twin-engine turboprop Piper Cheyenne.',\n", + " \"South African golfer Thomas Aiken won the Spanish Open, his first European Tour victory, with a score of 10-under-par 278. The win came on a somber day after the passing of golf legend Seve Ballesteros at the age of 54. Players observed a minute's silence to honor Ballesteros, and Aiken dedicated his victory to him. Aiken held his nerve on the final day, with Denmark's Anders Hansen finishing second on eight-under-par and Spain's Pablo Larrazabal, along with Scott Jamieson, taking third.\",\n", + " \"Chelsea is interested in signing Paul Pogba from Juventus for £60 million. Pogba, a 21-year-old French midfielder, has impressed with his performances at Juventus and France. He even has Premier League experience from his time as a scholar at Manchester United. Chelsea sees Pogba as a strong investment due to his Premier League background, which helps them comply with UEFA's Financial Fair Play rules. The deal would add to their impressive midfield, which already includes Cesc Fabregas, who recently joined from Barcelona for £30 million, and other players like Oscar and Eden Hazard.\",\n", + " \"Key highlights from the article include:\\n\\n* Professor Chris Wise, who helped design the Olympic velodrome, will give a talk at the Annual Stephen Lawrence Memorial Lecture in London.\\n* The event is held in memory of 18-year-old Stephen Lawrence, who was murdered in a racist attack in 1993 and had dreamed of becoming an architect.\\n* The lecture aims to raise money for the Stephen Lawrence Charitable Trust, which supports disadvantaged students pursuing a career in architecture.\\n* Tickets for the lecture are £15 for full price or £5 for students and can be bought through the event's website.\\n\\nOverall, the event aims to honor Stephen Lawrence's memory while supporting his legacy by helping students achieve their architectural dreams.\",\n", + " \"The article reports that both Delta and American Airlines have canceled hundreds of flights for voluntary inspections on wiring in their jets. Delta canceled 275 flights Thursday and 325 earlier, affecting flights through early Friday. American Airlines canceled 318 flights Wednesday and 132 scheduled flights Thursday, forcing passengers to spend the night at Atlanta's Hartsfield-Jackson International Airport. The inspections relate to concerns about how wires are secured to MD-80 aircraft, with Delta's MD-88 planes being the focus for inspections, which are expected to be completed by week's end. Passengers were inconvenienced, missing flights, job interviews, and comforts, with the airlines offering assistance such as rebooking flights and covering food and accommodation costs.\",\n", + " \"Here are the article's highlights:\\n\\nNathaniel Clyne, Southampton's right back, has been in phenomenal form this season. After a conversation with manager Ronald Koeman, where he was assured he would be the club's first choice right back, Clyne has delivered outstanding performances, including scoring the winning goal in a 2-1 win against Arsenal.\\n\\nKoeman believes Clyne is ready for England recognition, praising his experience and consistency. With Luke Shaw facing uncertainly at Manchester United, Clyne's performance has raised questions about whether Manchester United bought the wrong full back. Clyne's steady rise to prominence began at Crystal Palace in 2008, where he was promoted from the academy to the first team.\",\n", + " \"Here's a summary of the article's highlights:\\n\\nThe FA Cup second-round replay match between Scunthorpe and non-league side Worcester City ended in a thrilling penalty shootout. Scunthorpe secured a 14-13 victory, setting a new FA Cup record for the longest penalty shootout. Worcester City equalized early into the second half with a goal from Sean Geddes after Scunthorpe's Paddy Madden opened the scoring in the first half with a header from a corner. The match ended 1-1 after extra time, setting up the penalty shootout. Scunthorpe's Miguel Llera sealed the win with the decisive penalty kick, sending his team into the third round of the FA Cup.\",\n", + " \"According to a report by the American Customer Satisfaction Index (ACSI), Americans find flying even more stressful than going to the post office. Although airlines saw a 3% improvement in customer satisfaction, they still scored lower than the US Postal Service, with a score of 69 out of 100.\\n\\nHowever, two low-cost airlines, JetBlue and Southwest, scored highly in the survey with 83% and 81% respectively. \\n\\nThe main areas of customer dissatisfaction with airlines include:\\n\\n- Seat comfort\\n- Rising ticket prices\\n- Extra fees\\n- Poor in-flight services\\n\\nIn response to the low score, the airline industry argued that they compare favorably to other modes of transport like taxis, and that prices haven't increased in line with inflation.\",\n", + " \"Serena Williams, an 18-time Grand Slam champion, recently showcased her new $73,000 diamond-encrusted watch from Audemars Piguet after a win in her opening match of the WTA Finals. \\n\\nWilliams defeated Ana Ivanovic in a 6-4, 6-4 win, her first match in Singapore where she is defending her WTA Finals title.\\n\\nHowever, her victory comes after a week of controversy involving Russian Tennis Federation president Shamil Tarpischev. He made offensive comments on a TV talk show, referring to Williams and her sister Venus as 'brothers', leading to a $15,500 fine and a one-year ban from women's tennis.\\n\\nMeanwhile, the International Tennis Federation faced criticism for not taking immediate action, but the Women's Tennis Association acted swiftly in response to the incident.\",\n", + " 'A 33-year-old British tourist has been taken to court in Dubai for allegedly getting drunk and running naked through a building on the Palm Jumeirah. The man, identified as RS, has been charged with consuming alcohol without a license and committing an indecent act. He admits to drinking eight rums, but denies indecent behavior. \\n\\nAccording to witnesses, RS was seen arguing with security guards in his underwear, then proceeded to remove his clothes and stand naked in a brightly lit corridor on the second floor of the building. It took 30 minutes for police to apprehend him from his hiding place. RS claims he has no memory of the incident due to intoxication. The next court hearing is scheduled for March 27. This incident is the latest in a string of court cases involving British tourists in Dubai, where foreign residents must have a license to consume alcohol.',\n", + " 'The National Football League may soon have its first openly gay player as a current player reportedly plans to come out before the 2013 season. \\n\\nThis move could bring about a significant change as football has never had a gay active player in its nearly 100-year history. Chris Kluwe and Brendon Ayanbadejo, who are outspoken LGBT advocates, have expressed support for the player\\'s decision.\\n\\nDespite this positive outlook, there are also concerns and controversy surrounding the topic. San Francisco 49ers cornerback Chris Culliver sparked uproar when he said he did not welcome gay players in the locker room, and NFL Commissioner Roger Goodell has stated that asking potential players about their sexual orientation is \"unacceptable.\" This issue has gained attention following the Manti Te\\'o \\'fake girlfriend\\' hoax, where Te\\'o was questioned about his sexual orientation at the NFL scouting combine.',\n", + " 'Artist Jennifer Trouton from Northern Ireland is featured in the bestselling book series \"Fifty Shades of Grey\" by E L James. The series\\' author is a close friend of Trouton\\'s and spotted her work at a 2006 art exhibition in London. Trouton\\'s painting, \"Looking At the Overlooked,\" is a mosaic of 300 smaller paintings depicting everyday household objects, which specifically caught the author\\'s eye. It\\'s featured in all three books of the series, including when the main characters first meet and when Christian Grey recalls their first encounter.\\n\\nTrouton\\'s work is described as a metaphor for the mundane becoming extraordinary, reflecting the extraordinary bond between the characters. Another of her paintings is donated to a charity auction in the second book, \"Fifty Shades Darker.\" The artist\\'s involvement was kept hidden from friends and family until it was revealed through her Facebook page.',\n", + " 'Researchers at Cambridge University have found new evidence that challenges the traditional image of Neanderthals as brutish hunters. Instead, they discovered that Neanderthals may have spent most of their time performing domestic tasks, such as preparing animal hides for clothes. \\n\\nThe researchers found that Neanderthal arm bones showed unusual strength, particularly in the right arm, which was 50% stronger than the left arm. This is unlike most humans, who have a 10% difference in arm strength between their right and left arms. \\n\\nA study found that the strong right arm could not be attributed to hunting with spears as previously thought, but rather could be linked to tasks such as scraping animal hides, which was necessary for survival during the Ice Age.\\n\\nThe study also found that Neanderthals may have been more advanced than thought, living in communities, eating cooked food, and understanding its nutritional and medicinal qualities.',\n", + " \"Here are the article's highlights summarized:\\n\\nSerena Williams won her first match back at the Brisbane International, defeating Chanelle Scheepers 6-2 6-3 in straight sets. \\n\\nThe 30-year-old American, ranked fourth in the tournament, fired seven aces in the 68-minute win. However, she revealed plans to cut back on her tennis schedule in 2012, stating she doesn't love playing tennis but can't live without it.\\n\\nOther notable results in the tournament include:\\n\\n- Samantha Stosur beating Anastasiya Yakimova 6-2 6-3 and is likely to face Serena Williams in the semifinals.\\n- Andrea Petkovic defeating Shahar Peer 7-6 1-6 6-3.\\n- Ana Ivanovic winning over Tamira Paszek 6-3 6-3 and facing Kim Clijsters next.\",\n", + " \"The biggest European football stories include:\\n\\n- Italian football: \\n - Juventus manager Antonio Conte may be leaving the club after failing to make progress in the Champions League, despite winning three consecutive Serie A titles. Conte is being considered for other jobs, including at Monaco.\\n - Inter Milan captain Javier Zanetti is set to retire at the end of the season after a successful career.\\n - Roma owner James Pallotta is in Italy for Sunday's match against Juventus.\\n\\n- Spanish football:\\n - Barcelona's Lionel Messi wants to lead the team to a La Liga title by winning their remaining two league games.\\n - Barcelona legend Carles Puyol is close to leaving the club, while Atletico Madrid's title hopes may be affected by Diego Costa's hamstring injury.\\n - Cristiano Ronaldo is saying he's fit to play for Real Madrid, despite concerns about his fitness ahead of their match against Celta Vigo.\",\n", + " \"Here are the highlights from the article:\\n\\n- Norwich City dominated Huddersfield, winning 5-0 with key scores coming from Bradley Johnson (2 goals), Cameron Jerome, Lewis Grabban, and Nathan Redmond.\\n- Bolton drew 0-0 with Ipswich in a match where Eidur Gudjohnsen appeared as a second-half substitute.\\n- Brentford won 3-1 against Blackburn with goals from Jonathan Douglas, Andre Gray, and Jose Ignacio Peleteiro Ramallo.\\n\\nNarrow victories occurred for Wolves (1-0) against Sheffield Wednesday, thanks to Leon Clarke's goal, and Fulham (1-0) against Leeds, thanks to Hugo Rodallega's strike.\\n- Blackpool drew 2-2 with Charlton.\\n- Rotherham and Nottingham Forest played a goalless match.\\n- Wigan continued to struggle under Malky Mackay, having lost to Watford 2-1.\",\n", + " 'A 9-year-old boy from Solihull claims he was repeatedly substituted from matches because of his Asian background while playing for a local youth football team, Knowle Juniors. His mother, Fehnez Khan, has made a complaint to the police and British Football Association (FA), alleging racial discrimination. \\n\\nThe allegations have been denied by the club, which claims the boy was substituted for football-related reasons and that other children also received less playing time. \\n\\nKey points are as follows:\\n\\n- A meeting at a police station has been held to discuss the matter with Khan and club representatives.\\n - The football club, Knowle Juniors, received a Community Club Charter status from the FA for their good work in the area.\\n - Police are hoping to resolve the issue locally, but details on their investigation have not been released.\\n - The probe is also being investigated by the Birmingham FA, who have not provided detailed information on their investigation yet.',\n", + " 'Here are the highlights from the article:\\n\\n- Two rare bottles of whisky salvaged from the 1941 shipwreck of the SS Politician off the coast of Eriskay in the Outer Hebrides were auctioned off for £12,050 in 2013.\\n\\n- The bottles were part of the cargo of 28,000 cases of malt whisky that sank along with the ship, and are scarce due to only eight having been authenticated since 1987.\\n\\n- The whisky is now undrinkable, and the bottles were sold for their historical and scarcity value.\\n\\n- The bottles are part of the inspiration for the book and 1949 film \"Whisky Galore,\" based on the true story of Scottish islanders who salvaged the cargo.\\n\\n- The auction was held by Scotch Whisky Auctions in Glasgow, and the buyer remained unidentified.\\n\\n- The bottles come with authentication documents from Christie\\'s, where they were previously sold in the past for £4,000.',\n", + " \"Here are the article's highlights:\\n\\n1. Authorities in southern Indiana have arrested 54-year-old William 'Clyde' Gibson III, a convicted sex offender, in connection with the murders of two women and a suspected third victim.\\n2. Human remains were found in Gibson's backyard, which were later identified as those of 35-year-old Stephanie Marie Kirk, who was last seen on March 25.\\n3. Kirk's remains are believed to have been in the backyard for weeks or months. The cause of death is still under investigation.\\n4. Gibson is also suspected of killing Christine Whitis, 75, who was found strangled in his home last week, and Karen Hodella, 44, who was discovered near the Ohio River in 2003.\\n5. Gibson was arrested on drunken-driving charges after police spotted him driving Whitis' car, leading authorities to search his home and find Kirk's remains.\\n6. Gibson has a lengthy criminal record, including convictions for robbery,\",\n", + " \"Noted author Mitchell Gross, who writes under the pen names Mitchell Graham and Douglas Alan, has been accused of swindling millions of dollars from two women he met through online dating sites. \\n\\nHere are the key highlights:\\n\\n- Gross allegedly convinced two women to invest in a sham company, one of whom wired $3 million to a fake account, and the other who invested $1.4 million.\\n- He used the stolen funds to buy expensive artwork, a luxury car, a golf club membership, and other personal items.\\n- Gross falsely claimed that film adaptations of his books were being optioned by Steven Spielberg, featuring Pierce Brosnan and Kirsten Dunst.\\n- To further deceive his victims, he pretended to be a representative of a financial institution, 'The Merrill Company'.\\n- Gross' scam involved creating fake tax forms and account statements to conceal the scheme.\\n- He has pleaded not guilty to wire fraud and money laundering charges, which carry a potential prison sentence of decades.\\n- Two previous\",\n", + " \"Here are the highlights from the article about Myspace's comeback:\\n\\n1. **Myspace is making a comeback**: Since December, the site has added 1 million new users, with a significant increase from adding zero new users per day to 40,000 per day.\\n2. **New music player a key factor**: The introduction of a music player offering 42 million songs in December helped the site regain popularity.\\n3. **Tie-up with Facebook**: Myspace has formed a closer relationship with Facebook, allowing users to log in with their existing Facebook details and access Myspace content through the Facebook app.\\n4. **Improved user numbers**: Now, Myspace has 25.1 million users, a significant increase since its decline in popularity.\\n5. **Comparing to Spotify**: Myspace offers a larger music library than its streaming rival Spotify, which has 15 million songs, and other platforms, such as Pandora, offer less.\\n6. **Pan\",\n", + " \"Here are the article's main highlights:\\n\\n- Conservative Chief Whip Andrew Mitchell and Lib Dem leader Nick Clegg received £11,000 and £777,000 respectively from Brompton Capital, a company based in Jersey, a tax haven.\\n- The company's chairman, Rumi Verjee, has donated millions to the Lib Dems and the Conservative party, despite filing multiple losses in the company's financial accounts.\\n- Brompton Capital's shares are owned by an offshore firm called Integro Nominees (Jersey), which has since changed its name to EQ Nominees (Jersey).\\n- Despite Brompton Capital's losses, the company has made over £12 million in charitable donations in the past 10 years.\\n- Labour deputy leader Harriet Harman accused the Liberal Democrats of hypocrisy in accepting donations from a company using offshore companies to potentially avoid taxes.\\n- Both Mitchell and Clegg's parties have expressed support for cracking down on tax avoidance and wealth inequality, despite this new\",\n", + " \"The article reports on a recent development in the Madoff Ponzi scheme case. The key highlights are:\\n\\n1. **$2.48 billion payout**: Victims of Bernard Madoff's fraud will receive approximately $2.48 billion to cover their losses, making their total recovery around $3.63 billion.\\n\\n2. **New total recovery**: This payout triples their previous total recovery of $1.15 billion, but still only covers about half of the total losses estimated at $9.15 billion.\\n\\n3. **Trustee's work**: The recovery is attributed to the efforts of trustee Irving Picard, who has managed to recover $9.15 billion or 53% of the estimated losses.\\n\\n4. **Remaining funds**: Although Picard has recovered almost $9.15 billion, some funds are being held in reserve as victims pursue their own cases to recover more money.\\n\\n5. **Delayed distributions**: Picard is appealing court decisions that have limited his claims against banks such as JPM\",\n", + " 'Here are the highlights from the article:\\n\\n**Surrey County Council Faces Criticism for £4,000 Away Day at Historic Castle**\\n\\n* 26 senior Conservative councillors and officers attended a 2-day workshop at the 900-year-old Farnham Castle at a cost of £4,000.\\n* The council is set to make £200m in savings over the next four years due to government funding cuts, and up to 650 jobs are at risk.\\n* Opposition politicians and local residents accuse the council of wasting taxpayer money on a \"posh jolly\".\\n* Council Chief Executive David McNulty defends the trip, saying it was \"value for money\" and allowed the organization to develop its approach to complex issues.\\n* However, Communities Secretary Eric Pickles\\' recent paper suggests canceling away days at posh hotels as a way to save money, recommending instead to use council-owned properties or borrow a room from a neighboring council.\\n* The cost of the trip has sparked criticism, with',\n", + " 'Here are the article\\'s highlights:\\n\\n- Former UK hospital manager Gary Walker claims he was paid £500,000 to keep quiet about patient safety concerns at the United Lincolnshire Hospitals Trust after being removed as chief executive in 2010.\\n\\n- Gary Walker broke his silence, speaking out about a care scandal that may have led to 670 patient deaths, despite an email from NHS-funded lawyers warning him not to speak out and threatening repayment of the £500,000 settlement.\\n\\n- Jeremy Hunt, the Health Secretary, has expressed concern that Walker was \"leaned on\" to remain quiet and is willing to order NHS bosses to reverse the gagging order if it breaches NHS guidelines on whistle-blowing.\\n\\n- The Health Secretary has written to the trust chairman to inquire about the gagging order, citing the Francis Report\\'s call for a ban on such orders that prevent concerns being raised about patient safety.\\n\\n- United Lincolnshire Hospitals NHS Trust, where Walker was chief executive, is among 14 trusts being investigated',\n", + " \"Former French First Lady Carla Bruni-Sarkozy spoke to Vogue magazine, sharing her views on feminism and women's roles in society. Key points from the interview include:\\n\\n1. Bruni-Sarkozy stated she doesn't identify as a feminist, preferring a traditional role at home with her children.\\n2. She mentions pioneers who opened up opportunities for future generations of women, but asserts she is content with her life without actively pursuing feminist causes.\\n3. The former model and singer turned conservative shared that she disagrees with her husband, former President Nicolas Sarkozy, on gay marriage, supporting the right to adoption for same-sex couples.\\n4. Bruni-Sarkozy's life in the public eye has grown since Sarkozy lost the French presidential election, leading to her becoming a prominent figure on billboards, magazine covers, and through her new album.\\n5. Despite her husband's involvement in corruption scandals, Bruni-Sarkozy remains tight-lipped about the issues and prefers to step back and be\",\n", + " 'Here are the article\\'s highlights:\\n\\n- A growing number of travelers, known as \"flashpackers,\" are benefiting from cheap, well-furnished hostels. They are usually over 30, well-established in their careers, and can afford higher-end hotels but chose to save money by staying in hostels.\\n\\n- People like 49-year-old Paul Wampach, who prioritizes budget-friendly accommodations, especially for ski vacations. He has stayed in the same hostel, Fireside Inn in Breckenridge, Colorado, four previous times, booking a dorm-style room for less than $40 per night.\\n\\n- Flashpackers prefer to stay in hostels with shared living spaces and modern amenities, such as Wi-Fi, hot tubs, and community kitchens, allowing them to meet travelers from different cultures.\\n\\n- The number of hostel bookings has been increasing at U.S. vacation destinations after the 2001 recession, mainly due to the unstable economy. Popular destinations like New York and San Diego reported significant',\n", + " 'The article describes the author\\'s journey to Greenland to join the Arctic Sunrise, a ship belonging to the environmental group Greenpeace, on a three-month expedition around Greenland\\'s coast. Highlights from the article include:\\n\\n1. **Meeting William, a Greenland taxi driver who has engaged in whale hunting**, which is legal in Greenland as a means of subsistence.\\n2. **Observing the breathtaking landscape** of Sermilik Fjord, where the ship travels, featuring an \"inky blue body of water thick with floating, ancient ice\" and massive mountainous icebergs.\\n3. **Scientific research on the melting of the Greenland ice sheet**, which shows alarming rates of change, possibly leading to sea levels rising beyond current predictions.\\n4. **A warning from glaciologist Dr Gordon Hamilton**, who believes that if urgent action is not taken, the Earth\\'s climate will reach a \"tipping point\" with catastrophic consequences for society.\\n5. **The opportunity for CNN to participate in a Green',\n", + " '**Tragic Burns Survivor Michael Brewer Faces Long Recovery**\\n\\n15-year-old Michael Brewer suffered severe burns over 65% of his body after being set on fire by a group of teenagers in Deerfield Beach, Florida, in an alleged dispute over a video game, a bike, and $40. His mother, Valerie Brewer, is bracing for a lifelong recovery for her son, who still faces multiple surgeries, physical therapy, and rehabilitation.\\n\\n**Key Facts and Updates:**\\n\\n- Michael Brewer\\'s attackers, Denver Jarvis (Jarvis\\' brother), Matthew Bent, and Jesus Mendez, are accused of pouring alcohol over Michael and lighting him on fire.\\n- Michael Brewer\\'s treatment is extremely painful, with procedures like lengthy showers and physical therapy causing excruciating pain and distress.\\n- Ozzy Osbourne sent a CD to Michael, which he plays during the painful shower therapy to help him cope.\\n- Michael\\'s recovery is expected to be lifelong, with his mother saying it\\'s been a \"rollerco',\n", + " 'Here are the article highlights:\\n\\n- George Kenney, a 52-year-old high school principal in Florida, pleaded no contest to practicing hypnosis without a license after hypnotizing 75 students, teachers, and their families at North Port High School. \\n- As part of his plea deal, he received one year of probation.\\n- Kenney was accused of hypnotizing two students before they committed suicide last year: 16-year-old Wesley McKinley and 17-year-old Brittany Palumbo.\\n- An investigation found that Kenney was warned by his supervisor to stop the hypnosis sessions but did not issue a written directive.\\n- Kenney admitted to holding hypnosis sessions with five other students who later struggled with mental health issues or had tragic outcomes, including a car crash that killed a teenage student named Marcus Freeman.\\n- Many students defended Kenney, claiming the hypnosis helped them focus in class, and a Facebook group called \"Bring Back Dr. Kenney\" was set up to support him.\\n',\n", + " 'Here are the main highlights of the article:\\n\\n* The UN\\'s outgoing corruption investigator, Inga-Britt Ahlenius, has released a 50-page memo criticizing the leadership of UN Secretary-General Ban Ki-moon, accusing him of managerial incompetence and being \"responsible for undermining his own officials and failing to address key issues.\"\\n* Ahlenius alleges that Ban has repeatedly undermined the flow of information, interfered with staff appointments, and left crucial leadership positions vacant to maintain his own power.\\n* The report describes the UN Secretariat as \"decaying, falling apart, and drifting into irrelevance.\"\\n* Ahlenius\\' report highlights several instances of Ban\\'s failures, including:\\n\\t+ Failing to appoint an Under Secretary-General for Safety and Security for 11 months after a deadly bombing of the UN\\'s Algeria headquarters.\\n\\t+ Relying on a bureaucratic approach to accountability, rather than taking concrete steps to address issues.\\n* The report has put the White House in a difficult position,',\n", + " \"A 25-year-old drug dealer, Javad Malik, has pleaded guilty to multiple charges related to the death of 28-year-old Ahtia Tabasim and her unborn child. The incident occurred in January when Malik attempted to flee from police in a high-speed chase, crashing into Tabasim's car just yards from her home in Birmingham. \\n\\nTabasim, a newlywed and a care worker at an old persons' home, was three months pregnant and died from her injuries in the hospital. Her husband, Bahdar Zahman, and family members have paid tribute to her, describing her as a kind and caring person who loved her work with the elderly and disabled.\\n\\nMalik has pleaded guilty to causing death by dangerous driving, possession of heroin, cocaine, and cannabis with intent to supply, and not having a valid license or insurance. Judge William Davis warned Malik to expect a lengthy prison sentence, stating that his offenses are very serious and will result in a significant term of imprisonment\",\n", + " \"The main highlights of the article are:\\n\\n1. Former boxing champion Frank Bruno made an emotional plea for better mental health treatment after revealing he has been sectioned twice in the last 18 months due to suffering from bipolar disorder and depression.\\n2. Bruno, a Lib Dem supporter, recorded a video endorsing Health Minister Norman Lamb's mental health policies, expressing his gratitude for the progress made in mental health care.\\n3. Norman Lamb announced new initiatives, including a 'carers' bonus' worth £250 a year and a 'carers' passport' for access to benefits such as free hospital parking.\\n4. Lamb criticized Labour and the Conservatives for their handling of the NHS, accusing Labour of being'resistant to change' and the Conservatives of being potentially 'vulnerable' to cutting NHS funding under right-wing pressure.\\n5. The article compares the promises made by Labour and the Conservatives regarding NHS funding, with Labour pledging a £2.5 billion 'time to care' fund and the Conservatives\",\n", + " \"The UK's national tourism agency, VisitBritain, is launching a marketing push in Asia to attract more Chinese tourists. The agency plans to give iconic landmarks, such as Buckingham Palace and Stonehenge, Chinese names to make them more appealing to Chinese visitors. This move comes after a record-breaking 20 million tourists visited the UK between January and July, spending £11.3 billion.\\n\\nKey highlights include:\\n\\n* VisitBritain aims to give Chinese tourists a greater affinity with Britain by using Mandarin titles for famous sites.\\n* 20 million people visited the UK between January and July, a 7% increase from last year.\\n* The UK's heritage is a key selling point for Chinese tourists, with visiting Buckingham Palace and touring historic Chatsworth House as top attractions.\\n* The GREAT China Welcome programme aims to make Britain the destination of choice for Chinese tourists, with a new charter to help visitors identify China-ready hotels, attractions, and tour operators.\\n\\nOverall, the agency hopes to treble the number of\",\n", + " 'The article discusses the college football scandal at Penn State University and the crisis it presents for the sport. Key highlights from the article include:\\n\\n1. **Penn State\\'s inadequate response:** The university fired Joe Paterno and other officials, but more needs to be done, including whether Mike McQueary should be punished and whether others on the staff were aware of Jerry Sandusky\\'s alleged actions.\\n\\n2. **NCAA\\'s inadequate response:** The NCAA has stated it will defer to law enforcement but hasn\\'t provided a meaningful response, considering the severity of the scandal.\\n\\n3. **Worst scandal in college football history:** The article considers this scandal the worst in the sport\\'s history and calls for the toughest penalties, including the \"death penalty\" (a one-year ban), which has only been given to one program previously, Southern Methodist University.\\n\\n4. **Lack of accountability:** The NCAA allows the football program to make big money, but players, who are unpaid amateurs, often bear the consequences',\n", + " \"A 53-year-old convicted paedophile, Brett Barrett, was jailed for seven months for assaulting a teenager. Barrett, who had previously been jailed for two years in the late 1990s for sexual offenses against a teenage boy, had taken over a milk bar in Melbourne's south east near a high school. \\n\\nThe milk bar advertised 'after-school specials' in 2013. What's more, Barrett's latest crime was not known by detectives investigating him, as his previous conviction predates the introduction of the National Child Offender Register in Victoria in 2004.\\n\\nA public national sex offender register has been proposed but rejected by all states and territories except the Northern Territory. The Northern Territory's register will be named after murdered teenager Daniel Morcombe, and will allow the public to look up convicted sex offenders in their area.\\n\\nDerryn Hinch, a 'name and shame' campaigner, believes that a national public register would have allowed the public to identify Barrett and stay safe.\",\n", + " \"The article highlights several attractions and activities in the Swiss city of Basel, situated at the crossroads of Germany and France. Key points include:\\n\\n1. **Historical significance**: Basel is home to the oldest university in Switzerland and Europe's oldest five-star hotel, the Hotel Drei Kronige. A scenic walk through the beautifully preserved Old Town allows visitors to see the notable Munster, a red sandstone gothic cathedral.\\n\\n2. **Ancient Roman settlement**: Located 12 miles east of Basel, the 2,000-year-old Roman settlement of Augusta Raurica showcases a well-preserved theater, forum, amphitheater, and aqueduct. An open-air museum features a reconstructed Roman house and daily life recreations.\\n\\n3. **Thrill-seekers' delight**: The Hasenhorn toboggan run, 25 miles east of Basel, is Germany's longest and an adrenaline-packed 1.8-mile ride open year-round.\\n\\n4. **Art and culture**: The\",\n", + " \"According to the article, Facebook is reportedly planning to release its own smartphone by next year. They have hired over a dozen former Apple engineers who worked on the iPhone, and a former engineer claims Facebook CEO Mark Zuckerberg was very interested in learning about smartphone technology, which indicates a serious approach to developing a Facebook phone.\\n\\nThe new smartphone would allegedly allow users to seamlessly send messages, post updates, and share content, but it remains unclear if this is a necessary feature or a gimmick. There has been speculation that Facebook needs to develop new mobile revenue sources and more control over its mobile products as users spend more time on mobile devices.\\n\\nThe news comes as Google closed its acquisition of Motorola Mobility, increasing the pressure on Facebook to make a move. Many tech experts believe a Facebook phone would be a bad idea due to the company's lack of experience in hardware and low profit margins in the industry.\",\n", + " \"A mother and daughter, Kim Milhano (28) and Susan Scott-Williams (51), shared a joint wedding ceremony with their partners. The idea was suggested by their partners and after months of planning, they had a combined celebration at a hotel near their home in Bristol. \\n\\nKey highlights of their unique wedding include:\\n\\n- The mother and daughter wore matching bridesmaid dresses but had separate dresses.\\n- The pair shared the ceremony and reception with their respective partners, with a combined guest list of 180 people.\\n- They managed to save £2,000 (about a quarter of the total cost) by having a joint wedding instead of two separate ones.\\n- Kim and her husband Carlos had been engaged for eight years before finally getting married, while Susan married her partner Barry after rekindling the romance.\\n- The couple's children and grandchildren played a key role in the wedding, with Kim's kids serving as flower girls and page boys, and Susan's grandchildren also participating.\\n- The joint wedding\",\n", + " 'Ipswich Town is close to signing goalkeeper Paddy Kenny on loan from Bolton Wanderers until the end of the season. Kenny, a 36-year-old experienced keeper with 7 caps for the Republic of Ireland, has failed to make a first-team appearance for Bolton since joining them last summer. Ipswich manager Mick McCarthy seeks a temporary replacement for injured goalkeeper Dean Gerken. Kenny is expected to undergo a medical before completing the move, having previously played for Leeds, Sheffield United, and QPR.',\n", + " \"A viral YouTube video showcases a small dog in Japan's Kobe that found a creative way to pass the time during the summer. The dog plays fetch with an orange ball in a stream, picking it up, throwing it in the water, and then chasing after it, jumping from stone to stone. When the ball floats too far, the dog retrieves it by putting a paw in the water and doggy-paddling back to the shore. This entertaining video has garnered over a million views and demonstrates the dog's determination and resourcefulness.\",\n", + " \"Sebastian Vettel, a three-time Formula One world champion, believes his Red Bull team is in better shape than last year. The team is hoping to repeat their 2012 success and has focused on improving their car, with some advancements made after the 2012 season. Vettel remains motivated and expects the 2013 season to be close, with multiple drivers competing for wins, similar to the unpredictable start of the 2012 season. He emphasizes the importance of consistency and scoring points in every race to be a title contender, and is currently prioritizing Red Bull's preparation for the upcoming Australian Grand Prix.\",\n", + " \"**Girl Leaves with Horrific Scars After Dog Mauled Her Face**\\n\\nTwelve-year-old Georgia Sigourney was left with severe facial scars after her friend's Siberian Husky attack. The dog, named Dakota, suddenly flipped and clamped its jaw down on Georgia's face while she was lying on the floor, causing flesh around her mouth and cheeks to tear. Georgia was rushed to the hospital and underwent 51 stitches (31 external and 20 internal) to repair the damage.\\n\\n**Key Points:**\\n\\n* The incident occurred when Georgia accidentally nudged the dog, which was sleeping behind her.\\n* Georgia was left with severe pain and is now scared of dogs.\\n* Her father, Chris, says Georgia is lucky to be alive, as the attack could have been fatal or disfiguring.\\n* The dog's owners initially claimed it was not their pet, but later gave it to the police to destroy.\\n* The case is being investigated by Cambridgeshire Police, who have\",\n", + " 'Maria Sharapova, the world No 2 tennis player, faced a significant challenge in the Australian Open. She trailed 1-2 in the match against qualifier Alexandra Panova (world No 150) but managed to come back and win 6-1, 4-6, 7-5. Sharapova survived two match points in the decisive third set before taking the lead and sealing the victory. \\n\\nSharpova hit 51 unforced errors in the match but found a way to triumph through sheer determination. Despite a tough performance, she said that winning the match was more important. She praised Panova for her challenging play and accepted that winning despite a lackluster performance boosted her confidence.',\n", + " \"Here are the highlights from the article:\\n\\n**Ava's Story:**\\n\\n- Ava, a 14-month-old toddler, had a rare cancer-like disease called Langerhan's Cell Histiocytosis (LCH) diagnosed at just 5 months old.\\n- She underwent 15 weeks of aggressive chemotherapy and over 100 blood transfusions to keep her body functioning, but her treatment failed.\\n- A bone marrow transplant was her best hope of beating the disease, and thanks to a 21-year-old UK donor, the transplant was successful.\\n\\n**Disease Details:**\\n\\n- LCH is a rare disease affecting 1 in 250,000 children in the UK each year.\\n- It's a cancer-like disease treated with chemotherapy, and the cause is unknown.\\n- Symptoms include swollen lymph glands, poor appetite, bone pain, skin rash, ear discharge, breathing difficulties, and jaundice.\\n- The condition has an 80-90% survival rate.\\n\\n**Recovery and\",\n", + " 'A group of Heath Ledger fans has launched a petition to retire the Joker character from future Batman movies, citing Ledger\\'s iconic and chilling performance as the ultimate interpretation. \\n\\nThe petition, found on the website \"The Ultimate Joker,\" has garnered 2,431 supporters so far. The site\\'s leader, Fer Barbella, aims to reach 50,000 signatures, after which they may present the petition to Warner Brothers studios. \\n\\nHeath Ledger\\'s performance as the Joker in \"The Dark Knight\" left a lasting impression on fans and critics alike, earning him a posthumous Oscar nomination for Best Supporting Actor and multiple award wins. The fans behind the petition believe that no one can surpass Ledger\\'s portrayal of the character and want to honor his memory in this way.',\n", + " 'Here are the key highlights from the article:\\n\\n- An American Airlines flight, AA65, from Zurich to New York made an emergency landing at Heathrow Airport in London due to a cracked windscreen.\\n- The plane was around 45 minutes into its journey when the emergency was declared and landed safely at 11:30 am local time.\\n- Ground staff will attempt to replace the windscreen, and passengers may be rebooked on other flights to complete their journey to the US.\\n- The plane is expected to depart from Heathrow again around 1:30 pm after refuelling and a new windscreen replacement.\\n- Passengers were alarmed by the rapid descent, with some social media users speculating that the plane would land at Gatwick Airport instead of Heathrow.',\n", + " \"Here's a summary of the key points from the article:\\n\\nStoke City goalkeeper Jack Butland is eager to regain his place in the starting lineup after returning from a loan spell at Derby County. He has been restricted by Asmir Begovic since 2012, forcing him to spend time on loan to get match experience. Butland now aims to compete with Begovic for first-choice goalkeeping duties as he prepares for the European Under-21 Championship in the Czech Republic.\\n\\nButland shares his enthusiasm about England Under-21 manager Gareth Southgate's contract extension, believing it shows their team's growing confidence and positive squad dynamic. This added motivation, combined with the squad's team spirit, may push Butland to achieve his goal and make a strong showing in the upcoming European Under-21 Championship.\",\n", + " \"On a single day in Afghanistan, five Australian soldiers lost their lives in two separate incidents. \\n\\n1. **Green-on-Blue Attack**: A shooter in an Afghan National Army uniform killed three Australian soldiers at a base in Uruzgan province, wounding two others. The shooter escaped by scaling a fence.\\n\\n2. **Helicopter Crash**: Another two Australian soldiers were killed when their helicopter crashed in Helmand province, while trying to land. The cause is unclear, but enemy action is not suspected.\\n\\nThese incidents marked Australia's deadliest day in Afghanistan, with a total of 14 NATO troops killed this month due to 'green-on-blue' attacks. The rise in such incidents has led to increased precautions among allies, with US forces now carrying loaded weapons at all times. The incident marks a significant blow to morale, with Australian troops set to withdraw from the country ahead of schedule.\",\n", + " 'The article highlights Richard Sherman\\'s crucial play in the NFC Championship game, where he deflected a pass intended for San Francisco\\'s Michael Crabtree, allowing his teammate Malcolm Smith to intercept the ball and seal Seattle\\'s 23-17 win. \\n\\nSherman\\'s deflection and subsequent celebration, including a taunt towards Crabtree and a verbal rant on live TV, stole the show. He reinforced his claims by calling himself the best corner in the game and labeling Crabtree as a \"mediocre\" receiver. \\n\\nThe game was a high-scoring match-up with several pivotal moments for the Seattle defense. During the fourth quarter, they forced three turnovers, including two sacks and a fumble recovered by Michael Bennett, and an interception by Kam Chancellor.',\n", + " 'Here are the article highlights:\\n\\n- Dave Styles, a 30-year-old big cat handler, returned to work at Australia Zoo after nearly being killed by a 114kg tiger, Charlie, in November.\\n- The tiger used Styles as a \"teething toy\" and caused puncture wounds to his neck and shoulders.\\n- Styles had been working with big cats for over 9 years and even raised Charlie from a cub.\\n- Despite the attack, Styles still loves big cats and is focused on their conservation.\\n- Charlie was not euthanized but had been seen interacting calmly with other handlers after the attack, showing he wasn\\'t being vicious but rather overly excited.\\n- Styles received support from around the world during his recovery and is now \"thrilled to be back\" working with the tigers at the zoo, including Charlie.',\n", + " \"In a major breakthrough, US House and Senate negotiators have reached an agreement on a $662 billion defense authorization bill, aiming to address concerns from the White House about detainee language and potential vetoes. Key highlights of the agreement include:\\n\\n1. **Additional language to protect civilian law enforcement**: The bill clarifies that nothing in the new detainee rules will interfere with civilian law enforcement's ability to carry out investigations and interrogations in the US.\\n\\n2. **National security waiver for the President**: The bill includes a waiver for the President to transfer suspects from military to civilian custody, providing more flexibility.\\n\\n3. **Tough sanctions on Iran's Central Bank**: The bill includes sanctions aimed at punishing Iran for its nuclear program, which received broad support in Congress and is expected to pressure Iran.\\n\\n4. **New restrictions on Pakistan**: Lawmakers have added provisions to ensure Pakistan is not involved in manufacturing or transporting improvised explosive devices for use in Afghanistan.\",\n", + " '**Local Woman Receives Payout After Being Told to Stop Breastfeeding at Leisure Centre**\\n\\nSophie Howes, a 27-year-old mother, was asked to stop breastfeeding her eight-month-old daughter Connie at a leisure centre in Kent because a lifeguard was \"offended.\" The centre manager, Kim Walters, intervened and told Howes to move to the changing room to continue feeding her daughter.\\n\\n**Key Highlights:**\\n\\n1. **Discrimination Claim:** Sophie Howes claimed the centre had breached the Equality Act 2010, which protects breastfeeding mothers from discrimination.\\n2. **Payout:** The centre, Ashford Leisure Trust, agreed to an out-of-court settlement with Howes after admitting that staff made her feel \"embarrassed\" and \"humiliated.\"\\n3. **Support for Breastfeeding:** Ashford Leisure Trust now fully supports breastfeeding at its sites and recognizes the legal rights of mothers to do so.\\n4. **Staff Training:** The centre has promised to train its',\n", + " \"The article highlights the following:\\n\\n1. **Sale of powerful stun guns on eBay**: A Mail on Sunday investigation found that powerful stun guns, disguised as torches, were being sold on eBay that are capable of delivering an electric shock five times more powerful than a police Taser.\\n\\n2. **Danger to public safety**: The stun guns can paralyze victims instantly, leave them in excruciating pain, and have been linked to brain damage and even death in some cases.\\n\\n3. **eBay's failure to address the issue**: Despite the website claiming to ban the sale of illegal weapons, the Mail on Sunday was able to buy three illegal stun guns and two pepper sprays within minutes, with the packages arriving from Poland, Lithuania, Italy, and the US.\\n\\n4. **Investigation and response**: The Metropolitan Police launched an investigation into the eBay stun guns, and eBay removed the listings from its website before they reappeared just hours later.\\n\\n5. **MPs' concerns**: Tory MP\",\n", + " \"Here are the article's highlights:\\n\\n- The US is deploying an additional 350 troops to protect the American Embassy in Baghdad and its support facilities due to growing concerns about an ISIS attack.\\n- The deployment follows a request from the State Department and a review by the Defense Department.\\n- This move increases the total number of US forces in the country to over 1,000.\\n- The new troops will not be part of a combat role and are primarily for diplomatic security.\\n- The troops will be from the Army and Marines, with 820 currently assigned to augment security in Iraq.\\n- The deployment aims to replace 55 troops in Baghdad who will be redeployed outside Iraq and will be accompanied by medical personnel, helicopters, and an air liaison team.\\n- The US has also conducted 114 airstrikes in Iraq, including one near Mosul Dam on Monday that destroyed 16 armed vehicles.\",\n", + " \"Three young blind individuals from Arizona have made a remarkable achievement by completing the challenging Alcatraz Invitational Swim in San Francisco, California. The event required them to swim 1.25 miles from Alcatraz Island to the mainland. \\n\\nMax Ashton, 17, was the first to finish in over 50 minutes, guiding him were his 24-year-old supporters Mike and Paul Tiffany. \\n\\nNotably, this is not Ashton's first impressive feat, as he earlier climbed Kenya's Mount Kilimanjaro at 13 and crossed the Grand Canyon at 14.\\n\\nTwo others who braved the swim were Tanner Robinson, 24, who crossed the finish line in over an hour and 16 minutes, and Katie Cupp, 19, who finished in one hour and 24 minutes.\\n\\nThese remarkable individuals hope to show the world that the blind can achieve anything a sighted person can do.\",\n", + " 'Here are the highlights from the article about Jane Lynch:\\n\\n**Career:** \\n- Jane Lynch plays Sue Sylvester in the hit TV series \"Glee,\" winning her critical acclaim and several awards, including a Screen Actor\\'s Guild Award, Golden Globe Award, and Primetime Emmy Award.\\n- She starred in various other movies and TV shows, including \"Best in Show,\" \"Wreck-It Ralph,\" and \"Saturday Night Live.\"\\n\\n**Personal Life:**\\n- Lynch married Dr. Lara Embry in 2010 and has daughters Haden and Chase.\\n- She co-authored an audio book \"Elfbot\" with her daughter Haden and friends, aiming to start a new holiday tradition.\\n\\n**Family Involvement in Showbiz:**\\n- Lynch expressed excitement and nerves about her daughter Haden getting into show business, emphasizing the importance of her own path and how she wants her kids to find their own way in life.\\n- Her family\\'s involvement in the audio book \"Elfbot\" makes',\n", + " 'A recent study by Cambridge University academics has revealed the vast amount of personal information that can be obtained from analyzing Facebook user data. Here are the key highlights:\\n\\n* Researchers analyzed data from 58,000 Facebook users and were able to predict sensitive information such as:\\n - Male sexual orientation with 88% accuracy\\n - Racial identity with 95% accuracy\\n - Religion and politics with 80% accuracy\\n - Personality types and emotional stability with accuracy ranging from 62-75%\\n* Even users who did not openly identify as such were accurately identified in some cases (e.g., less than 5% of gay users were connected to gay groups)\\n* The study\\'s methods were not complicated and could be easily replicated by companies to gain more accurate information.\\n* The study also found unusual correlations between online behaviors and traits (e.g., liking \"curly fries\" is associated with higher IQ, and liking a specific Facebook page is associated with lower drug usage).\\n* The findings',\n", + " \"Here are the article highlights:\\n\\n**Australia:** A third rescue operation in two weeks occurred in the waters between Australia and Indonesia, with 162 passengers being plucked from a distressed boat. However, authorities have not confirmed if the passengers were seeking asylum.\\n\\n**Global Asylum Seeker Issue:** The issue of asylum seekers has become a divisive and politically charged topic, with wealthy nations like Australia and the US hesitant to welcome refugees.\\n\\n**Statistics:**\\n\\n- Eighty percent of the world's refugees are hosted in developing countries, with Pakistan hosting 1.7 million refugees, followed by Iran and Syria.\\n- 17% of refugees live outside their region of origin, mainly in countries with available immigration channels.\\n- Major destinations for asylum seekers include South Africa, the US, France, Germany, and Italy.\\n- Asia is the leading continent of origin for asylum seekers (45%), followed by Africa (27%), Europe (15%), and the Americas (8%).\\n\\n**UNHCR's Report:** A \",\n", + " 'Here are the article highlights summarized in clear and concise language:\\n\\nA group of high-profile individuals, including former US President Jimmy Carter and musician Sting, has sent a letter to UK Prime Minister David Cameron urging him to reconsider the country\\'s drug laws. The group, which also includes Yoko Ono, Nobel Prize winners, and several British MPs, suggests that the UK\\'s \"war on drugs\" is causing more harm than good.\\n\\nThe letter argues that the estimated £285 billion spent annually on drugs could be better spent on measures to minimize the harm caused by the drug trade. The signatories, led by Countess of Wemyss, claim that legalizing drug use could prevent thousands of deaths associated with the black market trade.\\n\\nKey supporters of the proposal include:\\n\\n- Countess of Wemyss, leading the initiative\\n- Former US President Jimmy Carter\\n- Musician Sting\\n- Yoko Ono\\n- Businessman Sir Richard Branson\\n- Professor AC Grayling\\n- Professor David',\n", + " \"Former England rugby player Paul Sackey believes England national team coach Stuart Lancaster should start fly-half Danny Cipriani in the Six Nations tournament. Sackey, a former teammate of Cipriani's, says that Cipriani is the most skilled attacking player in the England team and would be a great asset due to his pace and passing accuracy. Cipriani was expected to be on the bench for the opening match against Wales, but Sackey thinks he deserves to start and potentially reignite his career.\\n\\nSackey emphasizes that Cipriani's recent form with the Sale Sharks club has made him a strong contender for the position. He also notes that the team's midfield is still uncertain, with several options, including George Ford, Luther Burrell, and Billy Twelvetrees, competing for spots. However, Sackey believes that if England can solidify their midfield, they will pose a significant threat to opponents.\\n\\nIn summary, Paul S\",\n", + " \"**Woman Abandoned in Hospital Waiting Room Identifies After 3 Years**\\n\\n* A 68-year-old woman, identified as Edith Allen, was found abandoned in an Alabama hospital waiting room in August 2010, wearing an adult diaper and hospital gown.\\n* Despite the medical staff caring for her, they were unable to identify her due to her lack of identification and inability to speak, leading to a three-year search.\\n* The investigation revealed that her carer, Cathy Jean Thomas, had been receiving over $25,000 in Allen's social security checks, which she used for personal benefits.\\n* Thomas, 59, has been charged with identity theft and is being held on a $50,000 bond.\\n* A tip from a non-profit group, LostNMissing, led authorities to Thomas, and consequently, to Allen's identity.\\n* Allen's medical bills have built up to $200,000 over the past three years due to her inability to qualify for Medicaid due to not having\",\n", + " \"Here are the highlights from the article:\\n\\nRolls-Royce has unveiled a unique, one-off limousine called the Celestial Phantom, designed to celebrate the 10-year anniversary of the Phantom model. The luxury car features a starry night sky replica on its roof, achieved with over 1,000 fibre optic lights, and a team of designers spent nine months perfecting it. \\n\\nThe car's exterior is painted with a color scheme that evokes the night sky, and its interior features leather seats in a 'dusk' hue. The clock in the car is decorated with diamonds, adding to the luxurious features.\\n\\nThe Celestial Phantom is the first car to leave Rolls-Royce's West Sussex factory under the BMW regime, which took over the company. The car's 6.75-liter V12 engine produces a significant amount of power, with a 0 to 60mph time of 5.8 seconds and a top speed of 150mph.\\n\\nThe car\",\n", + " \"Here are the highlights from the article about the 100-year-old identical twin sisters Marjorie Gilbert and Winifred Witt:\\n\\n- Identical twin sisters Marjorie Gilbert and Winifred Witt from Cwmbran, South Wales, turned 100 years old on the same day, a rare occurrence, making them one of just 15 sets of twins worldwide to achieve this milestone.\\n- The twins are inseparable and have lived together for most of their lives, even still sharing a nursing home.\\n- They were born in 1913 and grew up sharing clothes, books, and a bed, and remained so close that their own children and families would often treat them as one.\\n- After marrying at 21 and having children, they deliberately moved their families to live together during World War II, solidifying their bond.\\n- After their husbands passed away in 1992, they resumed living together, enjoying activities like playing bingo until they were 95 years old.\\n- The twins'\",\n", + " '**Article Highlights:**\\n\\nHospitals in Aurora, Colorado, received multiple victims after a shooting at a movie theater on Friday. \\n\\n- **Tragic Events**: The shooting resulted in multiple casualties with reports of at least a few hundred rounds fired by a single gunman using a 100-round rifle magazine.\\n- **Denver Health Hospital**: The emergency department received 7 victims and activated a \"mass casualty situation,\" coordinating transport logistics to avoid hospital overloading.\\n- **Staff Response**: Hospitals like Denver Health, Aurora South, and Swedish Medical Center prepared for the influx of patients, having conducted regular drills anticipating such a scenario.\\n- **Injured Patients**: At Denver Health, 5 patients were transferred from another hospital and survived. At Aurora South, 18 patients were treated, including 12 gunshot victims, with some in critical condition.\\n- **Staff Training**: Medical professionals, including experienced physicians and surgeons, treated patients while also dealing with a traumatic situation.\\n- **Team Response**: Hospitals coordinated closely to',\n", + " \"Here are the highlights from the article:\\n\\n**Intermittent Fasting's Rise to Popularity**\\n\\nThe 5:2 diet, a method of intermittent fasting, has gained popularity worldwide with the support of health experts and celebrities, including Beyoncé. Proponents claim it improves cognitive function, increases insulin sensitivity, and may guard against conditions like dementia and diabetes.\\n\\n**Drawbacks of Traditional Fasting**\\n\\nFasting for a few days a week requires counting calories, which can be challenging and tedious, particularly when limiting daily intake to 500-600 calories.\\n\\n**Introduction of LighterLife Fast Packs**\\n\\nTo alleviate the difficulties of fasting, LighterLife has introduced a range of nutritionally complete meal packs designed for 5:2 fasting days. These packs are available exclusively at Superdrug high street stores.\\n\\n**Key Features of LighterLife Fast Packs**\\n\\n* Nutritionally complete meals and snacks in various flavors (e.g., chocolate shakes, vegetable soup, snack bars)\\n* Convenient, just-add-water\",\n", + " \"Here are the article's highlights:\\n\\n1. **Pipe retrieval delay**: The removal of drill pipe from inside the Macondo oil well's blowout preventer is taking longer than expected due to a buildup of hydrates that temporarily jammed the cap.\\n\\n2. **Removal of old blowout preventer**: Once the drill pipe is removed, the old blowout preventer will be replaced with a new one from the nearby ship, Development Driller II.\\n\\n3. **Continued state of emergency**: Certain Florida counties, including seven in the Panhandle, will remain under a state of emergency to qualify for economic aid due to the ongoing spill.\\n\\n4. **Haunting uncertainty**: The condition of a third, longer piece of drill pipe is unclear, which may affect the progress of the operation and lead to a potentially complex solution.\\n\\n5. **Missed timelines**: Due to the uncertainty surrounding the third pipe, Thad Allen, the lead coordinator for the US response, hesitates to give\",\n", + " '**Shocking Abuse of Child Victims in Court**\\n\\nA harrowing trial in 2011 at Stafford Crown Court saw vulnerable child victims of a sex grooming gang being subjected to aggressive questioning by defense lawyers. The victims, some as young as 13, were grilled for 12 days, reliving their traumatic experiences. \\n\\n**Inhumane Treatment of Victims**\\n\\n* One victim was accused of lying and being \"naughty\" by a lawyer.\\n* Another victim was forced to read out her police statement detailing alleged abuse by her stepfather, even though she had withdrawn the allegations.\\n* The victims suffered from psychological distress, with one breaking down in tears.\\n\\n**Judge\\'s Outrage**\\n\\nJudge Robin Onions described the trial as \"shocking\" and \"apalling,\" stating he felt like he\\'d been \"hit over the head with a hammer.\"\\n\\n**Reaction from Authorities**\\n\\n* Keir Starmer, Director of Public Prosecutions, proposed pre-recorded cross-examination sessions to avoid similar treatment in',\n", + " 'A Paris judge has ordered the seizure of luxury goods worth over £11 million from Saudi Princess Maha Al-Sudairi to settle her debts, including unpaid bills from a £5.5 million stay at the Shangri-la Hotel. \\n\\nKey highlights of the case include:\\n\\n- The Princess failed to pay her £5.5 million bill at the Shangri-la Hotel after occupying an entire floor with 60 servants for six months.\\n- She claimed diplomatic immunity when King Abdullah refused to pay her bill, and later moved to the Royal Monceau Hotel.\\n- The Princess has run up unpaid bills of over £14 million in France since 2009 and is known to have used \"payment to follow\" notes, which were often accepted due to her wealthy credentials.\\n- She has been implicated in looting luxury goods from shops, including £100,000 worth of stock from the Key Largo leisure wear store.\\n- A judge has ordered the sale of contents from three storage units',\n", + " 'Comedian Gilbert Gottfried comments on the backlash comedian Daniel Tosh received after making rape jokes at one of his stand-up shows. \\n\\nThe Controversy surrounding Daniel Tosh: \\n- Tosh made rape jokes during a show, sparking outrage online.\\n- A woman called out the jokes from the audience, saying \"rape jokes are never funny.\"\\n- Tosh allegedly replied, \"Wouldn\\'t it be funny if that girl got raped by like five guys right now?\"\\n\\nGilbert Gottfried\\'s Perspective:\\n- As a comedian, Gottfried thinks people should be able to gauge what they find funny and laugh or show their discomfort accordingly.\\n- He shares his own experiences of performing comedy after 9/11, making jokes about terrorism and aftermath, and after a tsunami in Japan.\\n- During these times, Gottfried received backlash, but was able to recover without losing his TV show.\\n- He argues that comedians often face criticism for pushing boundaries and finding humor in serious topics.\\n\\nMain Takeaway',\n", + " \"The article discusses how California's ongoing drought has severe consequences, particularly in rural communities and farmland, but has inadvertently sparked a modern-day Gold Rush. \\n\\n**Key Points:**\\n\\n- The drought in California has exposed previously inaccessible areas, making it easier for prospectors to search for gold.\\n- The dry conditions are estimated to be as bad as during the 1977 drought.\\n- A beginner prospector can make around $5-$200 per day, thanks to low water levels.\\n- Modern prospectors are discovering gold in areas that were previously untouched by the 1849 Gold Rush participants.\\n- The prolonged drought has caused a serious economic impact on farmland, with ten rural communities at risk of running out of water within 60 days.\\n- California has received only 1.2 inches of rain in Los Angeles since July, leading to concerns of traffic accidents and mudslides with the upcoming rain.\\n- A storm is predicted to hit the Los Angeles area this weekend, which could put an end\",\n", + " \"Here are the article's highlights summarized:\\n\\nA sinkhole has formed at Pembroke Dock war cemetery in Wales, swallowing the grave of Private Ryan, a soldier who died in 1915 during World War I. The 20-foot-deep and 6-foot-wide hole was caused by heavy rain that shifted the limestone beneath the coffin.\\n\\n- The Ministry of Defence (MoD) is attempting to fill the sinkhole without exhuming the remains.\\n- Five other graves are at risk of falling into the sinkhole, including those of five other soldiers.\\n- The cemetery, Wales' only military graveyard, is closed temporarily while work is carried out to ensure the graves are safe.\\n- The MoD has been unable to find living relatives of Private Ryan to notify them of the situation.\\n- The cemetery will reopen by the end of March after the sinkhole is filled, in time for a service to mark the centenary of World War I in August.\\n- The incident is a major concern for the\",\n", + " 'Here are the highlights from the article:\\n\\n- Patrick Rock, a key advisor to the Prime Minister, has been arrested on suspicion of child porn offenses.\\n- Rock, a 62-year-old senior figure in David Cameron\\'s inner circle, was a fellow Tory adviser in John Major\\'s government.\\n- He resigned from his position at Number 10, the UK government\\'s official residence, after the National Crime Agency (NCA) was called in to investigate a potential offense, but the reason for his resignation was not publicly disclosed.\\n- Rock was arrested almost three weeks ago, but the arrest was kept secret until details were leaked to the press.\\n- His relative, Simon Rock de Besombes, claims that Rock\\'s resignation and arrest could be the result of \"revenge or jealousy\" and maintains that Rock is \"to date, innocent.\"\\n- The government has faced criticism over why it took three weeks for the arrest to be made public, and Labour is demanding an investigation into the timing of the arrest',\n", + " \"The Tour de France is rolling into Yorkshire, UK, bringing a £100 million boost to the local economy. Locals are showcasing their entrepreneurial spirit by renting out homes and gardens along the route, with some charging up to £10,000. Hotels have seen a significant increase in room rates, and farmers' fields and village pitches have been transformed into campsites and car parks.\\n\\nThe county has invested £6 million in road repairs to ensure a smooth journey for the cyclists. However, some residents have criticized the lack of attention given to roads in poor condition. Cyclist Marcel Kittel has expressed concerns about the narrow roads, but the event is expected to be a huge success.\\n\\nA variety of creative preparations are underway, including:\\n\\n* A handmade Eiffel Tower in Burley-in-Wharfedale\\n* A model of a cyclist on a house in North Stainley\\n* The Bank View Cafe in Langsett repainted in the colors of the King of the Mountains jersey\\n*\",\n", + " 'Frank Cramp, a 94-year-old Royal Marine veteran, has been awarded his second green beret after he mistakenly gave his original one away 60 years ago. \\n\\nKey Points:\\n\\n- Frank Cramp, a veteran of D-Day, single-handedly took out a German machine-gun post during the Normandy landings in 1944.\\n- He gave up his first green beret when he left the army in 1954, unaware he was allowed to keep it.\\n- After six decades, Frank was finally given a new green beret as a replacement by the Navy as a token of recognition.\\n- The ceremony took place on Dartmoor, Devon, where modern-day Royal Marines receive their green berets.\\n- Frank Cramp was praised by Lt Col Richard Cantrill, Commanding Officer of 42 Commando, for his bravery and selflessness.\\n- The Royal Marines Association was instrumental in re-presenting Frank with the recognition he deserved.',\n", + " \"Here are the article highlights in brief:\\n\\nThe Marussia Formula One team has concluded its investigation into the test crash that left Maria de Villota with serious injuries, including the loss of her right eye. \\n\\nKey points:\\n\\n* The team ruled out a mechanical fault in the MR01 car as the cause of the crash.\\n* Multiple investigations were conducted by the team, the Health and Safety Executive (HSE), and an external forensic body.\\n* The team has finished its investigation and is focusing on supporting Maria de Villota's recovery.\\n* The team will continue its preparations for the German Grand Prix, taking place on the weekend.\\n\\nOverall, the team has absolved the car as the cause of the unfortunate incident but is now shifting its focus to Maria's wellbeing.\",\n", + " \"The key highlights from the article are:\\n\\n1. Sporting Gijon is expected to lose striker Stefan Scepovic to Celtic in a deal worth less than the originally asked £3.2 million.\\n2. The Serbian striker didn't play for Sporting Gijon recently to avoid getting injured and affecting the negotiations.\\n3. The club needs to sell Scepovic urgently and is expected to accept a lower offer from Celtic within the next 72 hours.\\n4. Celtic manager Ronny Deila is also set to finalize a loan deal for Rubin Kazan winger Wakaso Mubarak, who could join the team this week.\",\n", + " \"Middlesbrough are on the verge of signing Genk's 25-year-old striker Jelle Vossen for around £5 million. However, Genk is holding out for the full price, while Middlesbrough wants to pay less.\\n\\nAdditionally, Middlesbrough has welcomed back Nigerian centre-back Kenneth Omeruo on a loan from Chelsea, with Omeruo citing his positive experience with the team's manager Aitor Karanka and the club's atmosphere as reasons for returning.\\n\\nThe signings come at a time when Middlesbrough is in need of a goal-scorer, with their previous six strikers failing to reach double-digit goal totals last season.\",\n", + " \"Here are the highlights from the article about The Players Championship at TCP Sawgrass:\\n\\nMartin Kaymer wins his first tour triumph since 2011 after overcoming adverse weather conditions and a tough finish. He trailed for a brief period on Sunday, but regained his lead with a clutch putt on the 17th hole and secured a 13-under-par one-shot victory.\\n\\nJim Furyk came in second, while Jordan Spieth finished tied for fourth after carding his first bogey of the week on the fifth hole and struggling with his game for the rest of the round. \\n\\nThe victory secures Kaymer's first win in over a decade and earns him a prize of $1.8 million.\",\n", + " \"The article highlights the following key points:\\n\\n* Britain's aid spending increased by 28% in 2013, making it the largest jump among European countries.\\n* The UK's aid budget rose to £10.6 billion, placing it second only to the US, with the US spending £18.9 billion on overseas aid.\\n* Britain achieved its target of spending 0.7% of its GDP on overseas development.\\n* Despite the increase, Germany, France, and Russia had lower aid spending ratios at 0.38%, 0.41%, and 0.03% respectively.\\n* The Organisation for Economic Co-operation and Development (OECD) expressed concern over declining aid spending in sub-Saharan Africa, while countries like China and India experienced rising aid budgets.\",\n", + " \"The results of the Reader's Digest annual trust rankings survey have been released. Here are the highlights:\\n\\n* Malcolm Turnbull ranks 69th, 10 spots ahead of Prime Minister Tony Abbott, who ranks 79th.\\n* Opposition leader Bill Shorten is joint 81st with Nationals MP Barnaby Joyce.\\n* Neurosurgeon Charlie Teo remains the most trusted individual for the second consecutive year.\\n* Paramedics remain the most trusted professionals for the 10th year running, followed by firefighters, rescue volunteers, nurses, and doctors.\\n* Business leaders have mixed results, with billionaire James Packer ranking 85th and electronics entrepreneur Dick Smith ranking 10th.\\n* Convicted drug smuggler Schapelle Corby ranks 99th and her sister Mercedes ranks 100th as the least trusted Australians.\",\n", + " \"The article discusses the debate on gun control and background checks in the US, following various mass shooting incidents. Here are the highlights:\\n\\n**Background Checks and Their Limitations**\\n\\n- Over 90% of Americans support background checks, particularly at gun shows.\\n- Background checks did not prevent mass shootings in Newtown, Aurora, Tucson, and Virginia Tech.\\n- The National Instant Criminal Background Check System (NICS) missed potential gun buyers, including the gunman in Tucson.\\n\\n**Notable Shooting Cases**\\n\\n- Newtown: Adam Lanza used legally purchased guns, and background checks were not conducted on his mother's firearm purchases.\\n- Aurora: James Holmes purchased guns legally, despite his name being submitted to NICS.\\n- Tucson: Jared Loughner's application was not flagged due to a system mistake.\\n- Virginia Tech: Seung-Hui Cho was deemed mentally ill by a judge, a disqualifying factor, but the background check system failed to identify him.\\n\\n**Current Proposals and Controversies**\\n\\n\",\n", + " 'Here are the article\\'s highlights:\\n\\n- Hackers claiming to be from the group Anonymous threatened to release sensitive information about the US Department of Justice in response to the death of Internet activist Aaron Swartz. \\n\\n- Swartz, 26, had faced federal computer fraud charges that could have resulted in 35 years in prison.\\n\\n- The hacker group claims the justice system is responsible for Swartz\\'s death and threatened to release \"embarrassing information\" to news outlets if the system isn\\'t reformed.\\n\\n- Anonymous hacked the website of the US Sentencing Commission and posted a lengthy, eloquently written message signed \"Anonymous.\"\\n\\n- The FBI confirmed it is investigating the threat and considers it a crime.\\n\\n- Anonymous also accused the FBI of infiltrating its ranks and criticized the federal government\\'s \"highly disproportionate sentencing.\"\\n\\n- The hacking incident temporarily brought down the US Sentencing Commission\\'s website, but it was restored later the same day.\\n\\n- The hacktivists created \"warheads\" (chunks',\n", + " \"Highlights from the article are as follows:\\n\\nA 9-year-old boy named Hector Montoya was initially saving for a PS4 gaming system but decided to spend his $300 to purchase smoke detectors after hearing a tragic story about a fire that claimed the lives of a mother and child due to no smoke detector.\\n\\nWith the help of the Grand Prairie Fire Department, Hector installed over 100 smoke detectors in the homes of needy residents, mostly the elderly.\\n\\nHector's act of kindness inspired his new friends, siblings Ashton and Peyton Harder, to buy him a PS4 as a thank-you gift. They drove 45 minutes from Dallas to deliver the gift, along with $150, to continue Hector's mission.\\n\\nDespite initially giving away his gift money, Hector was overjoyed with the kind response and expressed his intention to continue saving and donating to those in need of smoke detectors.\",\n", + " 'The UK census is set to transition to an online format to save taxpayers around £400 million. The change comes with the next census in 2021. The online census will:\\n\\n- Replace paper forms with online submissions, with paper forms available for those unable to use technology.\\n- Hire enumerators with iPads to assist those struggling with the online format.\\n- Use tax and NHS records to fill gaps and keep population estimates up-to-date between censuses.\\n\\nKey points from the article include:\\n\\n- The move requires new legislation to use publicly-held data for the census, which raises concerns about personal privacy.\\n- The 2011 census showed 94% participation and detected an extra 500,000 immigrants. \\n- Cabinet Office Minister, Francis Maude, aimed to reduce costs by reforming the census, with an estimated £1 billion expense for a repeat paper-based census in 2021.\\n- The online approach could be implemented for £625 million.\\n- A backup survey of 4',\n", + " \"A California police officer, Laura Weintraub, has been placed on administrative leave after a video she posted to YouTube sparked controversy. The video, part of her 'Cup Holder Commentary' series, expresses her hatred towards bicyclists. In the video, she asks her husband how much he would have to be paid to run over a cyclist and ends with an image of a 2008 bike crash in Mexico that killed one person and injured 10 others. The video gained attention from her supervisors, and her department, the Santa Paula Police Department, placed her on leave pending an investigation. A second reserve officer was also placed on leave for responding to comments on the department's Facebook page. The video was removed from Weintraub's YouTube channel, but a copy remains online.\",\n", + " \"**New York City Agrees to Pay $98 Million to Minority Firefighters in Discrimination Settlement**\\n\\nNew York City has agreed to pay $98 million in back pay and benefits to entry-level firefighters who claim the city's fire department used a biased entrance exam to discriminate against African-American and Latino candidates. The settlement follows a 2007 lawsuit filed by the US Department of Justice, which alleged the exam was unfair and didn't properly assess candidates for the job.\\n\\n**Key Highlights:**\\n\\n1. **Settlement:** New York City will pay $98 million to back pay and benefits to minority firefighters.\\n2. **Background:** The US Justice Department sued the city in 2007, alleging bias in the entrance exam since 1999.\\n3. **Settlement ordering:** A US district judge ordered the city to pay $128 million and hire 293 black and Latino applicants who pass the hiring process.\\n4. **Implementation:** The first groups of minority firefighters joined the FDNY in 2013\",\n", + " '**Highlights from the Article:**\\n\\n1. **Tory plans to scrap stamp duty on properties worth up to £250,000 in Wales**: A proposal to abolish stamp duty in Wales, making home ownership more affordable for first-time buyers.\\n\\n2. **Different tax rates between England and Wales**: This move will put pressure on Chancellor George Osborne to promise the same for England, as it may make buying a home in England more expensive compared to Wales.\\n\\n3. **Cost of £20 million for Wales**: The cost of scrapping stamp duty on properties up to £250,000 in Wales is estimated to be around £20 million.\\n\\n4. **Increased house prices**: House prices in Wales are up 5.4%, London is up 11.6%, the South East is up 4.5%, and the West Midlands is up 4.4%.\\n\\n5. **Tory goal for Wales as a nation of homeowners**: Welsh Conservatives aim to make Wales a place of low tax and',\n", + " 'Here are the key highlights from the article:\\n\\n* Ahmed Raofi, 29, an Afghan minicab driver, was jailed for 6 years for attempting to abort his unborn child with his mistress Irene Santos while she was pregnant.\\n* Raofi became enraged when Santos refused to terminate the pregnancy and hatched a plan to kill the fetus without her consent after researching online.\\n* On April 9, 2023, he invited Santos to his flat, taped her hands and feet, and forced poisonous pills into her womb.\\n* Santos miscarried a 19-week-old fetus, which showed signs of life and breathed and moved for at least 10 minutes outside the womb.\\n* The court heard that Raofi had initially tried to take Santos to an abortion clinic, but she refused, and he then planned to \\'punch the baby out\\' of her at 7 months pregnant.\\n* Judge Aidan Marron stated that Raofi \"denied a woman a much-wanted child\" and',\n", + " \"During World War One, a unique chapter in women's football emerged when thousands of female munition factory workers formed teams. The Blyth Spartans Munitionettes from Northumberland stood out, playing beautifully and remaining unbeaten for two years. \\n\\nTheir star center-forward, Bella Raey, a coal miner's daughter, scored an impressive 133 goals in one season. The Munitionettes won the Munitionettes Cup, a knockout tournament in 1918, with a record-breaking crowd of 22,000 spectators. The team defeated Bolckow-Vaughan from Middlesbrough with Bella Rae scoring a hat-trick.\\n\\nBella Raey went on to play for England, showcasing the women's football team's skills. However, after the war, the munition factories closed, and female teams disbanded. The Football Association also banned women's football at their grounds in 1921.\",\n", + " \"Here are the article's highlights:\\n\\n**Robot Submarine Completes First Scan**\\n\\n- The U.S. Navy's Bluefin-21 underwater drone has finished its first full scan of the Indian Ocean, collecting data to find Malaysia Airlines flight MH370.\\n\\n**Depth and Coverage**\\n\\n- The Bluefin-21 spent 16 hours scanning the seabed 4.5 km deep and covered approximately 90 square kilometers.\\n\\n**Search Efforts**\\n\\n- The search for MH370, which has been ongoing for 40 days, is now in a new phase, with the Bluefin-21 drone leading the methodical search under the Indian Ocean.\\n- Up to 10 military aircraft, 2 civil aircraft, and 11 ships continue to search an area of about 40,000 square kilometers.\\n\\n**Missing Aircraft Analysis**\\n\\n- Authorities believe the Indian Ocean, 2,000 km west of Perth, is the most likely area where the plane crashed, but so far, there have been no signs of\",\n", + " 'David Moyes\\' return to Everton\\'s Goodison Park as Manchester United\\'s manager ended in a disastrous 2-0 defeat, dashing their chances of Champions League qualification. Everton\\'s win, their 20th under manager Roberto Martinez, marked a turning point in their season, just one point behind fourth-placed Arsenal. \\n\\nMoyes was left disappointed with his team\\'s performance, labeling their defending as \"rank and rotten,\" after they conceded two sloppy goals. Phil Jones\\' handball led to Leighton Baines\\' penalty, and Alex Buttner\\'s mistake allowed Kevin Mirallas to score from a tight angle. \\n\\nEverton dominated the midfield, while Wayne Rooney and Jonny Evans struggled against Romelu Lukaku, who caused problems for the United defense. Despite Moyes\\' attempts to put a positive spin on the loss, the season is now over for United, marking the first time in 19 years they have failed to qualify for the Champions League under a manager.\\n\\nIn contrast,',\n", + " \"Here are the highlights from the article:\\n\\n1. Illinois Congresswoman Tammy Duckworth, a Iraq veteran, has given birth to her first child, a daughter named Abigail O'kalani Bowlsbey, two weeks after winning a second term in the U.S. House.\\n\\n2. Duckworth, 46, used assisted reproductive technology to conceive and gave birth seven weeks before her due date of December 5.\\n\\n3. Abigail's middle name O'kalani comes from Hawaiian Senator Daniel Akaka, who acted as a Hawaiian elder and friend of the family.\\n\\n4. Duckworth and her husband Bryan, a Major in the National Guard, were overjoyed with the early arrival of their baby girl.\\n\\n5. As a disabled veteran who lost both legs in a 2004 helicopter crash in Iraq, Duckworth inspires with her determination and perseverance, making history as the first disabled female veteran to serve in the House.\\n\\n6. Interestingly, Duckworth joins a group of four\",\n", + " \"Highlights from the article include:\\n\\n1. **Pope Francis' act of compassion**: The Pope showed kindness to a severely disfigured man during a weekly audience in St. Peter's Square, embracing and blessing him, just like he did with Vinicio Riva two weeks prior.\\n\\n2. **The Pope's 'Papal' style**: Known for making personal calls, inviting the homeless to dine at St. Peter's Square, and washing the feet of young offenders, Pope Francis' actions have revitalized the Catholic Church, making a huge impact on the faithful.\\n\\n3. **Catholic congregations surge worldwide**: The so-called 'Pope Francis Effect' has seen a 20% rise in Catholic congregations in Britain, with increases reported in Europe, the US, and Latin America.\\n\\n4. **Italy's priestly support**: Half of priests in Italy have noted a significant rise in support for the Church, with youth and lapsed Catholics surging back to the confessional.\\n\\n\",\n", + " \"**Libya Conflict Continues: 9 Soldiers Killed in Benghazi**\\n\\n Libyan government forces clashed with Islamist militants in Benghazi earlier this week, resulting in the deaths of at least 9 soldiers and 19 wounded. The attack began when Ansar al Sharia and other armed groups targeted the Benghazi security directorate headquarters. The government condemned the attack and praised the bravery of the special forces that intervened to regain control of the area.\\n\\n**Key Points:**\\n\\n- At least 9 soldiers killed and 19 wounded in Friday's fighting\\n- Ansar al Sharia and other armed groups attacked the Benghazi security directorate headquarters\\n- The United States has designated Ansar al Sharia a terrorist organization for its role in 2012's US consulate attack\\n- The security situation in Benghazi has been plagued by near daily assassinations and kidnappings targeting security forces\\n- US officials have expressed concern over Libya's instability and pledged support to the country in its fight against radical militant groups\",\n", + " 'Here are the article highlights:\\n\\n**Far-Right Rise in Germany**: The article highlights the growing presence of neo-Nazis in the small village of Jamel in northeastern Germany. The village is predominantly settled by neo-Nazis who identify as \"free, social, and national.\"\\n\\n**Violent Extremism**: Reports have surfaced of pro-Hitler parties, vandalism, and harassment targeting non-extremist residents. Residents use guard dogs and fences to warn off outsiders, underlining their degree of isolationism.\\n\\n**NPD Connections**: The village is near the headquarters of the German National Democratic Party (NPD), a far-right organization with 5 MPs in the regional parliament and close ties to one of its members, Sven Krueger, who was jailed for possessing a machine gun and handgun.\\n\\n**Recent Trial**: The trial of Beate Zschaepe, accused of complicity in the National Socialist Underground\\'s murder of eight men, a policewoman, and a bombing campaign',\n", + " \"The article highlights two key matches from La Liga. \\n\\nIn the first match, Atletico Madrid won 2-1 at the Bernabeu, the home stadium of their rivals Real Madrid. This was Atletico's second win in a row at the Bernabeu. They were led by goals from Tiago and Sergio dies after being down to 1-1 with Real. Real's poor performance has put them 11th in the table with just three points from three matches, while Atletico moved to second in the table with seven points.\\n\\nIn the second match, Barcelona maintained their 100% start to the season with a late victory over Athletic Bilbao, securing their third win out of three under new manager Luis Enrique. Neymar scored a brace in the final 10 minutes of the match to seal the win. Barcelona started their match in their home stadium wearing a special red and yellow kit to mark the 300th anniversary of Catalan National Day.\",\n", + " 'Here are the highlights from the article:\\n\\n**Big Cat Sightings in Gloucestershire and Essex**\\n\\n- After a reported lion sighting in Essex, leading to a 24-hour search by police, some wildlife experts claim they have identified a shadowy beast in the Gloucestershire countryside.\\n- A photo taken by a trip camera in February 2012 appears to show a large, furry black figure sprinting through woodland, sparking speculation it could be the \"Five Valleys big cat.\"\\n- Big cat tracker Frank Tunbridge believes this image suggests big cats, possibly a puma or leopard, roam the area and says it matches similar sightings in Gloucestershire and beyond.\\n- Residents in Gloucestershire have reported seeing a large black panther-like creature, which also matches eyewitness descriptions of the Essex lion.\\n- Eventually, the Essex search found no trace of the lion, but witnesses still insist they saw a large cat, which is now believed to be a domestic cat named Teddy Bear, a 25',\n", + " '**Scotland\\'s Largest Pedophile Ring Dismantled**\\n\\nA Scottish court has convicted eight men of child sexual abuse in what is described as the largest pedophile ring ever dismantled in Scotland. \\n\\n**Key Highlights:**\\n\\n1. **Convictions:** Eight men were convicted of child sexual abuse-related offenses, with three also found guilty of sexually abusing young children and five conspiring to do the same to a child known as Child F.\\n2. **Evidence Gathered:** Investigators recovered \"tens of thousands\" of child abuse images and videos, aided by international collaboration, including the FBI and Microsoft.\\n3. **Expert Help:** The police received invaluable assistance from academics and organizations specializing in forensic techniques, such as steganalysis.\\n4. **Sentencing:** Two men, Neil Strachan and James Rennie, may face up to life in prison, while the others will receive lesser sentences.\\n5. **Child Abuse Network:** The investigation revealed a network of individuals',\n", + " \"Here are the article highlights:\\n\\nHope Solo, a US women's soccer star, was arrested at her sister's house in Seattle after a domestic violence altercation. \\n\\n- Solo was at a family barbecue on June 11, arriving intoxicated and argumentative after missing a flight.\\n- The 17-year-old nephew alleges Solo physically and verbally assaulted him and his mother, hitting the nephew with a broomstick.\\n- The attack allegedly started when Solo became upset over an argument with her nephew, calling him names, including 'fat' and 'p****'.\\n- Police responded to a 911 call and found Solo intoxicated and upset, with her nephew and sister sustaining visible injuries.\\n- Solo was arrested and charged with two counts of fourth-degree domestic violence assault.\\n- Her next court appearance is scheduled for August 11.\\n- Solo's defense team maintains she was the victim in the altercation and is innocent.\\n- This is not Solo's first incident involving police, as she was involved in a similar altercation in \",\n", + " \"A mother's frustration is revealed in an article as she recounts the struggles of allowing her 10-year-old daughter Sophie to have a love for the color pink. Despite society's perception that girls who like pink are being limited in their aspirations, the mother and daughter's story emphasizes that it's not about pink stymieing girls' development, but about allowing children to express themselves freely.\\n\\nKey highlights include:\\n\\n1. The mother's daughter, Sophie, has consistently chosen pink as her preferred color, even in the face of her family having three brothers and a more tomboyish environment.\\n2. Critics, such as the Independent Association of Prep Schools and some MPs, claim that-girls being exposed to pink leads to being confined to traditional feminine roles.\\n3. Research suggests that there is no link between the marketing of pink-toy and career aspirations.\\n4. Modern feminism has, ironically, contributed to constraining girls' identities by urging for the elimination of traditional colors like pink, highlighting the failure\",\n", + " \"Here are the article's highlights:\\n\\n1. **Cold weather forecast**: Britain is expected to witness a deep freeze, with temperatures plunging to -8C (18F) in rural areas. This is part of a prolonged cold snap that will last throughout the month.\\n\\n2. **Snow and ice warnings**: Weather warnings have been issued for ice and snow across the country, with forecasters predicting snow in London, Surrey, and Hampshire by Thursday.\\n\\n3. **Flooding concerns**: Residents who were affected by last week's floods are warned to expect around an inch of rain, posing a risk of localised flooding and hazardous driving conditions.\\n\\n4. **Snow and winter conditions**: The UK can expect sleet, snow, and hail for most of the week, with Scotland seeing the most significant effects, including four inches of snow expected tomorrow and another four inches later in the week.\\n\\n5. **Record-breaking winter**: Many believe that Britain could be heading towards one of its coldest winters on record\",\n", + " \"Here are the highlights from the article:\\n\\n**Prince Philip receives birthday gift from the Queen**\\n\\n* The Queen gave Prince Philip the title of Lord High Admiral of the Navy, a position that dates back to the 14th century, as a 90th birthday gift.\\n* Prince Philip received the Letters Patent in the Admiralty Boardroom at Admiralty House, where he also watched a display of precision drumming by the Royal Marines Corps of Drummers.\\n\\n**The Royal Navy's decline**\\n\\n* The article suggests that the Queen may have been concerned about the decline of the Royal Navy's strength since 1977, with a chart showing the current strength of the Navy.\\n* The number of warships in the Royal Navy has fallen dramatically over the past 30 years.\\n\\n**Prince Philip's naval career**\\n\\n* Prince Philip was a promising naval officer who had to give up his career to support the Queen after his father-in-law's health declined.\\n* He left the Navy in 1951 to become\",\n", + " \"For the first time, U.S. public schools are expected to have more minority students than non-Hispanic white students this fall, a shift driven by growth in Hispanic children due to immigration and higher birth rates. \\n\\nHere are the key highlights:\\n\\n- Minority students, including Hispanic, black, Asian, and Pacific Islanders, will make up the majority in U.S. public schools for the first time.\\n- Hispanic students account for about one-quarter of minority students, while 15% are black and 5% are Asian and Pacific Islanders.\\n- U.S. school demographics mirror the changing nation as a whole, with the country's population expected to have more minorities than whites by 2043.\\n- The shift brings challenges like increased need for English language instruction, changing school menus, and addressing racial tension.\\n- Some schools are experiencing racial divisions, reflecting broader U.S. housing patterns, with minority students often attending under-resourced schools and facing harsher discipline.\\n- Educators emphasize the importance of\",\n", + " 'Some remarkable moments and people throughout 2014 showcased the resilience and kindness of humanity. Here are five inspiring highlights that demonstrate gratitude and positivity:\\n\\n1. Ibrahim Hamadto, a young Egyptian para-table tennis player, did not let a life-changing accident stop him from chasing his dreams. Despite losing both arms, he practiced diligently for three years and achieved success.\\n\\n2. Through the power of social media, several people were reunited with long-lost family members this year. Twins separated at birth used Facebook to reconnect, and a woman found her birth mother after searching online.\\n\\n3. Favorable acts of kindness were witnessed throughout the year, such as a bartender receiving a $1,000 tip, and a community raising over $22,000 for a man wrongly targeted by police due to his resemblance to a suspect.\\n\\n4. North America experienced a rare occurrence – two blood moons – giving people a rare experience.\\n\\n5. A 100-year-old woman, Ruby Holt, fulfilled her lifelong dream of',\n", + " \"Here are the article's key highlights:\\n\\n- Raúl Castro, the brother of Fidel Castro, is expected to take over as Cuba's new president after Fidel's announcement to resign as president and commander-in-chief of the armed forces after 49 years in power.\\n\\n- Raúl Castro has been known for his ruthlessness but has also attempted to bring in more capitalism to Cuba, especially through free enterprise farmers markets.\\n\\n- He has been preparing for the transition, initiating a national debate six months ago to address high unemployment and economic concerns in Cuba.\\n\\n- Raúl Castro is seen as more down-to-earth and practical in contrast to Fidel, who is known for being more charismatic but stiff in social situations.\\n\\n- Despite a reputation for being a hard-liner early in the revolution, Raúl Castro says only the Communist Party can guarantee continuity, with the military firmly behind him.\\n\\n- As Fidel steps down, Raúl Castro is expected to introduce a more democratic society,\",\n", + " 'Here are the article\\'s highlights:\\n\\n**Regime Status:** Leaders of the rebellion against Libya\\'s Moammar Gadhafi are in control most of Tripoli, but fighting continues. Gadhafi\\'s forces still hold some strongholds, including the Rixos Hotel.\\n\\n**Capture Claim:** Gadhafi son Saif al-Islam appeared at the Rixos Hotel, stating his father and several sisters are safe in Tripoli. He claimed to have been tricked into being thought captured by the rebels and went on to say that government forces had defeated the rebels.\\n\\n**ICC Involvement:** Gadhafi\\'s son, Saif al-Islam, who is wanted for war crimes, said, \"To hell with the ICC,\" in response to a warrant for his arrest.\\n\\n**NATO Involvement:** NATO has been providing airstrikes against pro-Gadhafi forces, and their warplanes have been seen over the city. The alliance has condemned the use of Scud missiles by G',\n", + " \"Here's a summary of the article's highlights:\\n\\nA Delta Air Lines flight, Delta 1921, made an emergency landing at the Colorado Springs airport after the captain reported engine problems. The Boeing 757, flying from Detroit to Phoenix, experienced issues with one engine and a faulty rear wheel alarm during landing. A fire occurred in the main landing gear. Two passengers suffered minor injuries during the evacuation process, which was carried out using emergency slides from the side of the aircraft.\",\n", + " \"Tamara Beckwith-Veroni, a 44-year-old television celebrity, was fined £900 for failing to reveal who was driving her Porsche when it was caught speeding. Beckwith-Veroni, who has appeared on various TV shows, pleaded guilty to the charge through a letter, citing that she was seven months pregnant and unsure who was driving at the time. \\n\\nShe stated that a visitor claimed to have been in the area, but not driving, and that she found it difficult to clarify the situation. \\n\\nAs a result, the court imposed six penalty points on her driver's license and ordered her to pay £175 in costs, including £85 for costs and £90 as a victim surcharge.\",\n", + " \"Muhammad Ali, the legendary boxer, has made a significant recovery after being hospitalized over the weekend with a mild case of pneumonia. His team of doctors aims to discharge him soon. Here are the highlights from his remarkable career and life:\\n\\n- Ali won an Olympic gold medal at 18 in the light-heavyweight division.\\n- He became the world heavyweight champion in 1964 after beating Sonny Liston.\\n- Ali converted to Islam and changed his name from Cassius Clay to Muhammad Ali in 1964.\\n- He was an outspoken opponent of the Vietnam War and refused to serve in the military due to his religious beliefs.\\n- Ali retired from boxing in 1981 and was diagnosed with Parkinson's disease in 1984.\",\n", + " \"Here are the highlights from the article:\\n\\nA video has been shared on YouTube by Alex Steel, showing a brushtail possum breaking into his kitchen in search of food. The possum, native to Australia, was distracted by a loaf of bread and refused to leave the premises despite Steel's requests. \\n\\nSteel used a wooden spoon to gently coax the possum outside, eventually nudging it in the right direction after it got stuck between a toaster and kettle. After almost three minutes, the possum finally left the kitchen with a piece of bread clutched in its paws. The video has gained over 65,000 views and has been described as the 'cutest home invasion' by some viewers.\",\n", + " \"Mathew Vaea, the manager of the Samoan rugby team, has been fined by his village after misbehaving at the 2011 World Cup. He was ordered to provide 100 pigs as payment for tarnishing his village's honor by drinking regularly and treating the campaign like a holiday. Vaea instead paid a fine of 2,000 Samoan tala (£535) and made a formal apology to village leaders. His actions followed a damning report by Samoan captain Mahonri Schwalger, who accused Vaea of being unprofessional and distracted. The incident led to Vaea's village, Leauva'a, lowering his ceremonial title and raising a significant fine.\",\n", + " \"**Syrian Refugee Crisis in Lebanon: Key Highlights**\\n\\n* Over a million Syrians have fled to Lebanon, making up nearly 30% of its population, due to the ongoing war.\\n* Most refugees have limited financial resources and struggle to find affordable shelter, sometimes settling for cramped and makeshift living quarters like garages without basic amenities like plumbing and electricity.\\n* The cost of renting land or shelter has increased significantly, with many families struggling to make payments.\\n* Many refugees, like Adla's family, face extreme difficulties making ends meet, leading to sacrifices in basic necessities like food and healthcare.\\n* The UNHCR reports that only 1% of Syrian refugees live in rent-free collective shelters, leaving hundreds of thousands without a stable and secure place to live.\\n* Organizations like Concern Worldwide are working to convert unused buildings into safe, rent-free housing, but more options are desperately needed to support the influx of new arrivals.\\n* The future of Syria's next generation hangs in the balance, as many families\",\n", + " 'US federal prosecutors have charged two men, Daniel Cowart (20) and Paul Schlesselman (18), both self-described white supremacists, with plotting a violent attack on African-Americans. The plan included attempting to kill more than 100 people and behead 14 of them. They also planned to target and attempt to assassinate President Barack Obama, dressed in white tuxedos, by crashing a car into him while shooting from the windows.\\n\\nThe suspects were arrested outside Jackson, Tennessee, after an aborted robbery attempt and shot out a church window on their way back to their home. They claimed they were willing to die in their mission, but backed out when they saw people near the target.\\n\\nThis is not the first time there have been threats against Obama. The Secret Service is investigating and taking the matter seriously, despite the suspects having no history of attending any Obama events or drawing Secret Service attention.',\n", + " 'British Transport Minister Baroness Susan Kramer gave a pocket watch to the Taipei mayor, Ko Wen-je, which is considered an inauspicious gift in Chinese culture as the word for watch/clock translates to \"the end\" or death-related terms. Kramer apologized for the oversight, citing her lack of knowledge about Chinese customs.\\n\\nMayor Ko Wen-je received the gift poorly, saying he\\'d give it away or sell it for money, despite the alleged rudeness, he has since apologized and plans to take diplomacy etiquette training.\\n\\nThis situation parallels a 2009 controversy involving then-US President Barack Obama\\'s gifts of DVDs to British Prime Minister Gordon Brown (non-compatible format) and a Victorian-era ship timber pen holder from Brown, which Obama also made an unconventional gift: an iPod loaded with US footage to Queen Elizabeth II in the same year.',\n", + " \"Here are the key highlights from the article:\\n\\n**Resignations in Turkish Government:**\\n\\n- Three cabinet ministers (Urbanization and Environment Minister Erdogan Bayraktar, Economy Minister Zafer Caglayan, and Interior Minister Muammer Guler) resigned due to an anti-graft probe involving allegations of corruption, money laundering, and bribery.\\n- Erdogan Bayraktar also asked Prime Minister Recep Tayyip Erdogan to step down.\\n\\n**New Appointments and Cabinet Reshuffle:**\\n\\n- Prime Minister Erdogan announced a cabinet reshuffle, naming 10 new ministers, including Efkan Ala as the new interior minister, Idris Gulluce as urbanization and environment minister, and Nihat Zeybekci as the nation's new economy minister.\\n\\n**Power Struggle with Fethullah Gulen:**\\n\\n- The crackdown is believed to be a move against former ally turned rival Islamic cleric Fethullah Gulen, who lives in the US and is accused of trying to establish\",\n", + " \"Here are the highlights from the article:\\n\\n- Kraft, the owner of Cadbury, has invested £6 million to change the way Dairy Milk bars are displayed at store checkouts.\\n- For the past 186 years, Cadbury bars have been stacked flat in boxes, but Kraft wants to display them upright to increase impulse purchases.\\n- Research found that customers are more likely to buy a Dairy Milk bar if they see a complete bar of chocolate rather than just its side.\\n- The new packaging will be implemented at Cadbury's factory in Birmingham, starting in the new year.\\n- The change aims to make the bars stand out on store shelves and will be rolled out in the first half of 2012.\\n- Kraft has made this investment despite announcing its plan to cut 200 jobs earlier this month, with some job losses set to take place in March.\",\n", + " \"Here's a summary of the article in clear and concise language:\\n\\n**Abandoned Hotel in Germany**\\n\\n* A hotel in Germany has been abandoned for over two decades.\\n* The hotel, once a popular destination, is now overgrown with moss and vines.\\n* The hotel's interior is in a state of decay, with broken furniture and crumbling walls.\\n* Despite its disrepair, the hotel still contains interesting features, such as a retro bar and a swimming pool.\\n* A photographer, Andre Govia, captured the hotel's abandonment through a series of haunting pictures.\\n\\n**Abandoned Observatory in Spain**\\n\\n* The Mohon del Trigo observatory in Spain has been abandoned for nearly 40 years.\\n* Built in 1902, the observatory was once a hub for astronomers from around the world.\\n* The observatory is still owned by the University of Granada and features a rusting dome and mangled telescope.\\n* The interior is in a pitiful state, with graffiti and signs of\",\n", + " \"The article highlights four international styles for a New Year makeover: French, Spanish, New York, and Italian. Each stylist from a different country shared their approach to fashion. \\n\\n- French style emphasizes following strict rules, including wearing hemlines below the knee, navy, white, grey, and black colors, which results in a classic look.\\n- Spanish style is about being bold with figure-hugging, overtly feminine clothes, short, fitted jackets, and bright colors.\\n- New York style is characterized as relaxed elegance, featuring tailored suits, soft blouses, and muted colors.\\n- Italian style is described as flamboyant, showcasing figure-hugging clothes that accentuate curves, with an emphasis on looking polished and glamorous.\\n\\nAnnabel's verdicts reflected a personal take on each outfit, with a more reserved response to the French and New York styles compared to the bolder Spanish and Italian outfits, which she enjoyed more and graded higher.\",\n", + " 'Here are the main points from the article:\\n\\n- Darren Wilson, a 28-year-old white police officer with 6 years of experience, shot and killed an unarmed 18-year-old African-American man named Michael Brown in Ferguson, Missouri.\\n- The officer\\'s name was initially withheld due to death threats, but was later revealed by Police Chief Thomas Jackson, citing the officer\\'s devastation over the incident.\\n- The Ferguson police department released documents stating that the officer, Wilson, believed he was responding to a \"strong-arm\" robbery at a convenience store where Brown was the suspect, although some in the community are skeptical of this claim.\\n- The police also released surveillance footage allegedly showing Brown committing the robbery, which some attribute to a police cover-up and others question the circumstances.\\n- The timing of the release of this information has been met with anger and accusations from Brown\\'s family, who claim that the police are trying to justify the shooting of their family member, which they consider an \"execution-style murder.\"\\n',\n", + " \"The article reports on the Obama administration's response to the Supreme Court's decision on immigration laws. Key highlights include:\\n\\n1. **No Federal Cooperation**: The administration will not assist Arizona in enforcing immigration laws unless the individuals meet federal immigration criteria, such as being a convicted criminal, a recent border crosser, or someone previously removed from the US and re-entered unlawfully.\\n2. **Rescinded Agreements**: The administration is ending the 287(g) agreements with Arizona, which allowed local law enforcement to enforce federal immigration laws. These agreements were initiated under the Bush administration but fell out of favor under the Obama administration.\\n3. **Limited Resources**: The Department of Homeland Security (DHS) will focus its resources on individuals posing a public safety threat or challenging border integrity, rather than responding to every situation.\\n4. **New Hotline**: A telephone hotline and e-mail address (855-353-1010 and SB1070@usdoj.gov) have been set up for\",\n", + " \"Here are the major highlights from the article:\\n\\n- A multi-millionaire businessman, Darren Browne, and his family have been left homeless after a fire damaged their £3.5m mansion in Caversham, Berkshire.\\n- The fire started in a first-floor bedroom of the three-story house at around 2:30 pm on Sunday afternoon and caused significant damage to the property, including a collapsed roof and windows.\\n- The family was alerted by their teenager son, Conor, who called the fire service after spotting the fire, and they managed to evacuate safely with their family dogs and a dead pet rabbit.\\n- No human casualties were reported, but the house's interior and exterior suffered from water damage and debris from the blaze.\\n- A joint investigation by Thames Valley Police and the Royal Berkshire Fire and Rescue Service has been launched but the fire's origin is not believed to be suspicious.\\n- The damage is estimated to cost over £1m to repair, and the family is currently looking for temporary accommodation\",\n", + " 'A California woman, Tania Warchol, is suing E.L. James, the author of the novel \"Fifty Shades of Grey,\" and a British sex toy company, Lovehoney, for allegedly failing to deliver on the promised performance of their sex lubricant, \"Fifty Shades of Grey: Come Alive Pleasure Gel for Her.\" The $14.99 product, released in conjunction with the novel, promised to enhance orgasms and stimulation but reportedly failed to meet expectations. Tania Warchol claims the product also has some incompatibility issues with latex and may be mislabeled as an \"aphrodisiac\" without FDA approval. She is seeking a refund and punitive damages, and has filed a class-action lawsuit to represent other California residents who have had similar experiences with the product. The lawsuit is set to face several obstacles, including proving that the lubricant did not work.',\n", + " \"Here are the highlights of the article:\\n\\n**Researchers Develop a Potential Solution for Sensitive Teeth:**\\n\\n* Researchers in Taiwan have created a paste that mimics and helps rebuild worn tooth enamel, providing relief from sensitive teeth.\\n* The paste enters exposed dentine tubes, crystalizes, and seals them, preventing fluid disturbance and pain.\\n* In animal tests, the paste provided relief for at least 70 days.\\n\\n**How the Paste Works:**\\n\\n* It uses calcium carbonate and silica to seal exposed dentine tubes and catalyze enamel regeneration.\\n* The paste plugs tubes more deeply than other treatments, reducing pulp irritation.\\n* It has been shown to stimulate the regeneration of hard tissue in teeth.\\n\\n**Alternative Solutions for Sensitive Teeth:**\\n\\n* A study in China has created a compound inspired by mussels' natural 'glue' that can help teeth rebuild enamel and dentine simultaneously.\\n* This compound, made from polydopamine, calcium, and phosphate, has shown promising results in lab\",\n", + " \"Here are the article's main highlights:\\n\\n- A 30-year-old Samoan woman was charged with attempted murder for allegedly dumping her newborn baby in a western Sydney stormwater drain on November 18. \\n- The baby was found alive but severely dehydrated and with bleeding on the brain after being left in the drain for five days. \\n- A man believed to be the baby's father has been located by police.\\n- The accused woman had kept her pregnancy a secret for nine months, posting photos on social media of her aunt and uncle's children and even boasting about a new boyfriend.\\n- The woman was living with her aunt and uncle in the western Sydney suburb of Quakers Hill at the time of the incident.\\n- Police are waiting to interview the baby's father and are still gathering evidence, including from Blacktown hospital where the baby was born.\\n- The baby, over eight weeks old, has been released from the hospital and is in care.\\n- The woman was refused bail and\",\n", + " \"A neighbor, Mark Taylor, witnessed his next-door neighbor, Richard Wight, attempting to break into his home with an axe, similar to the film 'The Shining.' Wight, a 55-year-old lorry driver, had a history of harassing his neighbors, including Mark Taylor and Alan Taylor (59), with whom he had a long-standing feud over parking. \\n\\nThe bodies of both men were found in their homes, with Wight's cause of death attributed to stab wounds, and Alan Taylor's cause of death attributed to cardiac arrest. An investigation is ongoing, but it is believed that Alan Taylor may have killed Wight before suffering a fatal heart attack. Wight had a history of violent behavior and was known for smoking pot and drinking.\\n\\nNotable points from Wight's history include:\\n\\n- A prison sentence in 2002 for threatening Mark with an axe\\n- An Anti-Social Behavior Order (Asbo) in 2007 for threatening and abusive behavior toward neighbors\\n\"]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "### Submitting to Anyscale Jobs\n", - "\n", - "The script in `main.py` has the same code as this notebook; you can use `anyscale job submit` to submit the app in that file to Anyscale Jobs. See [Introduction to Jobs](https://docs.anyscale.com/examples/intro-jobs/) for more details.\n", - "\n", - "\n", - "After modifying the configurations at the top of `main.py` (model name, input/output path, input text column), run the following cell to submit a job:" + "gen_texts" ] }, { @@ -471,31 +1244,12 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "!anyscale job submit -- python main.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "This notebook:\n", - "- Read in data from in-memory samples or input files from cloud storage. \n", - "- Used Ray Data and vLLM to run offline batch inference of a LLM.\n", - "- Wrote the inference outputs to cloud storage and read back the results." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "base", "language": "python", "name": "python3" }, @@ -509,12 +1263,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.19" - }, - "vscode": { - "interpreter": { - "hash": "1a1af0ee75eeea9e2e1ee996c87e7a2b11a0bebd85af04bb136d915cefc0abce" - } + "version": "3.11.8" } }, "nbformat": 4, diff --git a/templates/batch-llm/assets/configure-a10g-1.png b/templates/batch-llm/assets/configure-a10g-1.png new file mode 100644 index 0000000000000000000000000000000000000000..132cf2b456461df20d4ecdf6182d327b8e36755f GIT binary patch literal 72970 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℞4Sp#15tx?^@kh`=sF?hmC!qB*iGcJCTDYinyqg!cobe_y9tCGL*- zX3rqCf>Dzy%NQ*72$e~+_fhl8P5I5CZ@Z_zxye;0Iq1`8t(o^^Zyq@c7vIaEb8;ob zz~X#OSWw4F!C6&iX9O?4X9t}Ohy`9a)yJZ3;U+PM^f$xTl_PhU1H5FhYnqZCi2m7( zyF%Y0+Ytdt`RJ>a`Mt08#@n7roUt5w;nX_R}W_KGKgbWp$d zb2fx;I~P(+M+8u60*yU4MV~C0n-K7E0j)QeJ9}7%-%Xzk4pvsPgfvs+U!RL6`UzsE#~AGYrx= z!9}Q&N?LnpuKqTM&^h&-x3u#j_zoHD!jgmwcgQ>dU3RlIVVBW#k#MP80Kgv(mgpM< zn-4q-F)Z|j6k5a+Q_dtMArrfGfS!qWiV22Feu2R|HhN-)!pa%F#4Ym8i=b-HH-G6w zEEYIDyA0eto7D2<8&g_0W}R!WfNfy#@4n^CtF$&-?;{(GhrP~eI6D|Ckc{bKKlJAMF*#sbBmHcRbVsFjcu~G zLqS>}1MwyWnu~%W`?X#IC!7^u;k__t!R#cw`A}2hfW_A6tEpl@%4hL5zjQnQ{M?=4 z7ja}wKeKBiZ@iBUSp{4 z_MSwjmw}(vkB1_ePy2fU6xvP1ju@5`XPI2mUy$S1vseKO&!>=wFX{)j#hC(XN`(;? zaz?T8hPD}Y%0>F*#ff|G07#y}A@Rid4hsYg(;lG8_oHQcD`k*?kaA!c!+DP!uV0dT zpljaNMS=N&4J@?PT%D%&>@ykn1MKuUqprwj2m)~3oF#GdZc%2uWp?~r?!oTVV%9Um z4_D%+Wl0Aa-1G}~H)q~P%|*RrvXwP(Dcpjp;i9eZ=39bxtrPc+s(ztU4kZuuu-kf zp~G3HnAAg9qV!1F32CwuR5{K2eD3Px`?Gw}EIMZ&BYKf>4|sEBcR9IC6n%SXSe9St zlRaHUUJhjj9erbnyMp6mYGql1UTZa)-hE-)Cd`Hb;*;&kG8o12<5Q1mgewqki#*ES$g1Rwo(KS5iZB0K} zWl_%KF<=~NQI00F3=(SAwtFiPeYnMB1MRvx_qo*OJm}GRJGyU|!}GcVb#qo498Wf$ za@O~iR)tt}No+@;v*sTD3@NmR4nYqY5VRJPXz~y^;KhOeP4@tXA5Haz6vOD-0VOm8 z%j-}s+gou$gR{q~4aW3~PL>EXz)ZUl%8WV=rMiLU74_L`>Ur|ghH-i>c8 zo)37Uy|SQ3z-Gmybp?d3ZEma&Io{0FdfHbdo0;fWz1I1IGU9S*%aatu_T4bl)uOUr z^NDN9pf>LwRjC1=QpMAZ0|w(hVe)2hcs)#{Q;vJbg-Y{k=I6zswo1N5zH(|Cs*wu8 zIJ4w5AYzR>((LyEnmCFb9B(&|wv#+#lDoZxnYijSfNZ2qwFH>Lj~wC|*6w)1Rb5PN zljMX~Kxa#O7RN4dB^h)1hy#qDPigSD9c6@RT#|s01v1Yrq-UZT(dzm~;$eNvb1F=k zaPW46D&3Szo;WF((hnJJ7s(SHj3LrX@Cr90C3${`Ph4M}F4;@2ChB5FqPw4tn|w5B zXYPSDOG{ED-BuoOxiX$W-~1S(KgMhZaKIheg>1*8!YP}LZ4`rZ(YI?Kd>n~??2*zA!sfyjty<)7zk2533u zj{h1_dHehd9Y%VY$cOe)vN#!42aQZYE`Sm(@$sZeiscqqp{>08ZCSbs zSb&RLj8Q7NOlY*3&D>YLG-!K8aKFIa%m^b~GPJLeK5;-_H=ga>5hk#~lq9;_TUck~ z9s49$&@kP@G2?E{5RGLqXD6yl75bJNQ^+N7l=m~IPzEE`hf}7PX?je5Y)v||El1L^ z${B)FS?^?LMQtEc-#SXZqI05qO%;JFiF4 zm<3$X57pw`&)xXe?hS>`{+EXZN=FZ#4Dp0#*bQ(6#;Oomrj{V8k-9cuxnSpgL*$_d z$mC4KSnnD%?o4zgiy=tG5AWK(F0mD>`cv*lMtAn}lhitLR}GwFmTq5u9Z^rXQUIFi zc5?q&(7z7+qCpXbNE#8g_ODt5otKz31_mB3HkKz&@P`M}43+xslkV(fP!0R~-V|A1 z{D9TDeY{+nFIf$s`k?RF3~#9j&wtqidzC3=?LVV~8Tsr@HL^7+j`*9+KZ-`{+fNEB zwhy?SguUw;>{^*u{&Sz0*={0(hUNP0Zy}y<=`Bo(foPBClGOa3YYJ{>s+(rERQx;F zu(;2MoIwT?dY`GExNS%$sfBLwf3av+B>Q#(>SD>xoT*KGE0kz*e>CxAGUdDmNB99A z|96_6c$#(oLYmIyx374gl~p)}KdU0K%llsY1>QAa#>A;QW;mDAaN-?-M&ESx?+qcF z51R(BGCe;%0)lpJzwyh^6O@im3@8|!C68c281xF-oZ|#VP6>}z@FIUyKrMI!%dgQ# z9^>b?4Ev(yoKL}Doz-y$Bk4f5?$=nr>)p(e`!uCS%pJd3xm9{G*z&ed*Q>ScjQZ74 zcvVRPRR=y{2O`_`weoVPv8anK&$unK&xtXo!qzSG^;ep*&1zuUj&T|?Vy3!8ku6l*^!(FK%|T9DASVb z)DP_u#aFysX0cv{9pU#ir`}-svwa{7KZywoul9CFpGSb`U~>^ie9wa;Tt-p-0lhED zyxfoTF@s0I{5T>LZo6YEmZSU(7hYpl&D({Bc<($}>|HofJt?ApCHs|E!WxN>S79DQ z0a%2J-_6%rVz4HELxh39Me9zw7X$50>RE$+*Kx}1C&qY6foM-t<)6;^9#0Mxz7 zYW_uDV&$!D2A=eV?~={;GAFg+v6< zmN8BI8&B^1!JH{kzb~n;6&iS1eco1Eql*p|0m;hkeo+|YzoB^YQlMe=R;A)+sySkAv3P1(uWxCxMSEJP5-xo8z&1%95(C69Wy zapC0U@g?6F_LQd%XrPQh@Ax;te5nK|OY~~L-~HjW)bwKYxV(=ZA@7Ik8j(AB8XiLM zk0T*BWo2gK6y?K-2Yg3|RLzJ+_vUhnz=PyiF`>I?fclm0(0{U<)PzJWCDRz@Cu6{BOiTP_bT->z@wD%@)k2xxR=Y(ukkhvp(R{kp< zg(0?qUuw&Y+qzHm#M(^vI%BT1?5gOh@?K&n;{wk8&a>NS#|O)@A!y|Q%p4?Ue0s0S zztUKyk!)!k`?23kFk4qboXCV=@YUd1Ktm!P12b)I8oO0yP%yigGfIEsmF{?WGzqq3 z!14}RlFOId1Z-36Sx=+;8zKG?%OCtMO99VGoO3P{yU*6xY~%$%is6HeUV36-)0XsbiE z*F-sU+?$*8RC}DG7*`jZ(n>UGJ(9Z8q=s=x3$VJTr}>{hSd_(1E5mZ3!0u{qJQ#av zmrSl7iTk`}G2s3(mh3%je3zyJb9-`%k3u(mosZbC!4_-bk*UzM^8^fn36~ly?v`@@ z*{7K@RjbFq#iQHot2PIJtK4>)u#uxl0LNG|UQ@oL#>a-6{JmES`^pT;Pa{m)2qAKf zX;@||x0~xoP2gTf*=(d;A#sKg{aUfO`lBLsT=cPEMe2LO4U108nj9xRX%|-%}G8yD}a~UEP9(Lsp_jABrt@Cp6%Wg-ItQ#W_W*?(f;7cQvd5>0H zm;YKUqzI0=?E*;|)#rxYT|Z*+Vu@DyVP4N^8ZHnGl&Hon*0+`!H5M_u(pguA;eYSk z`%0-Jwim3{J`sp$6=$hoQS<)C$0y%*ZPn?&I##rbH91DLWA=GYGQdkdvdjEtJbzoJ zo|k%5D7q+4-wjxO#zEJd@&N&>@N4<=CLBRdWG9vzu{v6^q6dh9PJMMR zqW?Z_DL_S^3%^0u?>HS?B|@}@t%Gn>Lq`eXH3F-s^+j#!v!xiI^% zK0oO;txVJ3Y%%Cids#KhB{S=qUHW8|4b1NqmWKeT#@zlU2V9y5c(Al6XOBLU+bvQO zXGGl{VycqPWWC#ToG-@`B4B*!3?kpq6NOE>kFXSy9^t08WjTm?M$Pn%mk6&%%1h4%CR;ob5N*wb&*^uA!-goLcI`ZF)D z@YRnzik+8ac%*9PtVutztz5qS`t0(IcFQwzT*Oby?TD+Nhele|@?#v`)vTelcjL4< zksTN1&fwpV_PUE+-pKg(=_Us;(oOe+utb0>8+E>3e`N3$M7DXVa<+TK?Te zbjFTt_l_j?lLke>A?UyHG798QJbAVU%w6qWh#q(SgZJ z1Kg}DnZ>h>|8BGi$iV8&zqSu-r0@!$+`-2IE3gSxn!xh$h7rfODaal ztx;mX&lg>@TK(sy)?}U_?NM^7(+}06yvqXSJF`#yJLUI!*YCR zh?U&?7F2Cp=lxC0$cu#c7t!{Uct;t%gSz(V{U$BDxSX5U4;O`fQ$^d(8o2cM6mTC~ zybok{!X=aV6(};Hl|#8iY`-+l6+K%uCQiAdhxaj+&JhF`b!>xe?awMZI%-7piZR;o z2Qq)C?a#J;4|M_qq07cZ$6t)AhD=mTIc#D~9;cs&uxpBy*4C2W^i#35*;?C4Ol5YDs9Bj`UIm{!m!5G@#| z3%<69bAHzG)HiGF;G@LLN9=Ewt5E1$=c->0C5!fgOm4rAW&P)sCG|o~lZ&|TY-7^Q z>gL8ebz4`~sCwAd6c%x;zZ<^+yWP1@=^!5-=c?iZiZ^}LF05$7)Mt?Ztk`=B8xV~I;9 zRmZcmU@~AfKrhJWb$kzDGM|+e$Ra%4Ti$PN`Up8aHaZTTQ=OY^m|$M zp4B7&eIm3K>RDm?!Xlb0niy7CrflB&h@wP3O^(mCw%7#klu!U06cv+{W)yVs+|hr7 zj2KW}f2pRWKWVztCwap>L8;e|ui(K|PMCm$s!Sz)U`g9hUZaMG zr!%%_hn)z2>j=ouGo+Dzja@o8JSz8fAwJ>rx7WlE4EZEIV|&y1Dq}TNZCF1p?yVWU z42J1vobs!qW$>Te+2>>~q4yVx*}P4!3cOiJS^9ma`+oBszV&4a`Ja&6CKXM+H^N4x4t!Ilr97{IOea&Qjfrmzo*+4$qYue zst?q<@e-OaovP742H@@xWb!wn9futbBi)In1;C~4?o%wF6GP7?vZ`yMpOCW6j1XSM z>NeKVVhyPa`jJ!AO)c#^#Es_lMr{WdPn8qpA4W?CSz~KAf(ISTMU`uL9oG%8b;fR6 z1~8MgTffI_g8ReWsY8)cA|%!zoppH6@uRhBug$3KDx)YV9Wl2`bdE1jzI7O#y_UEr zew)mG$h4Vj94(KeS`8`JP|1b5t$1&DDoF@gm>H3-EqJV$*pNP~Ux@pU7eKdSJ-L zm#dNWp-xw!=!#etpV|fBcsA3C&X!t{^$2w4a@{I5OOAf~qj}gIFVxGkBwWk$01)NF zw?H(6nJ+soT)e#IqywYH9^ecvsqsdp1@`V#>9+QV>V`Tx`1=-3%lVbui=+QuPA<5B zlD@OpG;(na8@V(_eS-ikd}WrnzK9enn6Ftwgu-!+xu}x4J1wuPL_@WDt88udzwIrw zEH&DW&H7<2>d8PK@lBIr47>S7ib6)&OC&G-{v?x~s;-ScKcIC~RN`(VQ4C*avutzP zDbj5_C({jF719-QdZ7aFxa}AeC8Hx1lyNw&FE*@1aZW{q_p-0rP)(A_dg)tKoIpit#~`{)&-t8R z&q(w^__Wp97wT7hU{pV%?h*}QuOu)We#otVe$gyJIgBp2nzq%}D|s{8Z?r^N%)$A? zR*i1qo6+4~`d9LmE_~qLsml>l?+2JCd2^o~RsI}%x}_3(WK=@9*)F!O$Qrf1f@$LMVDj=rB-I>HsbxYo`w&$jE^`yoyON3B9{4;`HNF~K6*#e^<)20hKmLex zJ}{Zhd-xu9IN;&t^zH0X_#6>ah^Jn{{1ZhYxhIit^k%M+h{GTZSjuiQ(-~W3)X1{a zSY&FjT0;!-+L#+mxEsml!(TJ zC!Y&SA0Qw0x(AL{hJsth441*#9*l~dmCU1Uq5ZXh)BxA&aeJ$So?2*xo) zF5sMxu>vBVL?5^sh3C%3gJ-RP7Z8EfqsD0ZOOya?hcPsaAP~V5HqDJmN>$=<#)o%4 zF!DsSm)#>rYy^?uy|QOXo4yQr9bGS}iyRo03Lc$ePmR&NtKj9AM4QOGtU3;HAfD;i zi=>H4vZG2JSJ)03F!*Ih=nS%Ln!ZDmr}{Z_n1(M?#U%_{(XpL>r=F_Ot*3X-{UkH- ziz=$nW>_P*`VvBJRQYrh3Kx#v?;}un1Vh0A-Z8bSkj-W3#izIQ&sTfV>_MWcP7X7l z*&{pb6}#DgsKT%T3$%eOmbB0$)ovWY-aZ>g6e;8+w4d zhYgvS6m+OfL8JQD1O3Lny!Y^#9v^Hb2@XfbXc@v-W)=4}`tQ}45|zcZ%ycFx%D0fW z@5Gf_Lc9~co!yIS4>4MY(K1Y3iaYwBnCcZ(IkZT<3AQ`e%tbyVThk!^aIT5z^rU@L zXA!4+nRRLUX5KO|anaT9n9#8ShOmnt>cO62`IOpt`E{G}=ZCWQNh{EA2F2S!t77J@ zh# zvNEih#LW%^?|Q*|uRM^=>IKQWUYN-9Wzg_WaqnA*Fv(!3YML z@!+k*>rU@foP#jQx(l=R+MXWU8CfN_{kdn)pRp4a{QLyBC6|AA4hRsq)to6P-l3eS z_5V5DaJvx|_l$KNOvmi~YkD8}@^(~VkvC{WOe1i5ui`F&YXv0jZB{?SW~DVXM#@LV z+1;UKws0%5zj69jK#33fM_BDJFxSA40tQl5O4uB+b-$W(x1s34X7Xp5ic&<(I}HVR zW?;;`CNNn@ZW`g3lujrQHH`!fFw*6@PfVJt#MHN<_KyTe?@Ig`BPSjGH$oU#?&p0% zFEn?NRzEw&{FRl%?l(PXr)l{CqIuv8LY{>DNA;g%3JnX`a8@s5vscyJ-o#=!X~~}7 zFGkn7J{f{PyW%ao_}tX%V_r~_Z1(#oN=7P*6w;l-hK#&rRDzW! z{B^_M(vB2;lYp0q0N~sMK!sg^d0)ID~6U6y#rWSNJZ{B1J?!}hXk7mmm zb{?-gG;BWo+V8~uXAmjV@yDXDsP{P_B1kTzWGGvgoEU*g?7K5*Tql`h=tQ{>Srr6v zO1m~;KGm;d9}-a=CADLzO~;Fut*t?`*^3J05Y-XNqDD_^oD6c0l^eE<{D%>e*m`Z~ zHilHRd)SR^?z&{AdV#%$4od@|ee%|M5HT^@H`ohZGBmJNEW5mwFUj&JU+=}ebv<$ zIea(fbZMjOO~v<#=6yw;#R(wb)7EgUivChI`{9dhYgiGstl{x?4vzY}wKb(O%QWDd z#|`}yRgZ*lXO3S!{qCZhuw0cJz$Tf3Hqa%wyXye6GrV@0BBD@KcMuzkfmwWEy#vzFpsNzv}S{4cqjFahiMbSfwo|a`EsrnJ|m!c zSi>jZNQ4FvTYY^y#sSBNaOaw142s9_x)dK&MbqOaq&+rXJ$`luth7`hQ6kap%$Hof zgsin2+G_Z%mA9T`x|js5!|3GB6=ilT6uzC??7e=X(Dd3NGYg;;2HDJST?7kEvigwI=g1D z7$#rb=UWqsp4<}=P)OVSJmN5i6=!l9Tp?Og8m`vC)F;q;LJDx@9Z$&#VXwo+b;2rJ z+W|NUYRmM=`Hg;*L==^i3UIuqFrd-2mQIX<_I!X$JC?dn=w#FNM5>VVzAnG6%4{XH z6qIDLWT4BbcCLej(u0TO-=fHkNaerL&KyfnABSH* z??1HkrU!LjiHnbBIgpCqP==|xlRE0aH=T8bENn6w3XDp*|EQL( z+yI)^QS29!ZQm>eY~G17;p-1PV9)8{n}KtA61i8EosjUVY3f8+k`LB+ipEz!P;J2C zh_Q48>g23|F{gu&V4jbaWaRq`lbbK$Y%~3z=H4mq#|8Jro**&4)WZvH_)+uO{k(K? z+4X4NmF(J%L)A~6usgyXlR_H|7Q;JlESvi13?h$<8Mhw}KsXX27W3+rU9c8W426BU z=$fC>G$s*R3LNMRi_zQQ7x^93H!dQ=#v2ZQ;I`-+BZAJeOZ3CK+(aOhnN$NGYwQux zZ}DLO@c179HRCLKWO}niach%4{+pM2`+{vc^YrFHoCSoq^Xv{+w257f4ood4*3aRb z(aQvH9%;QiNR1J_veihc?Dz}`%7=;fo084g*=fsL#?sniZ(qpv7KF@&I9h@;vS>F; zEEOnREqdw|dxTTd;mvVm35aTZQMpg47Y)^;lB5YlMa%@TVDiz+7xrNn?*j40amvSK z;P{8U9ZjSFT-#5ye7fDk2L&GWdGN#c&QUM0k&z4Rw;vW!tq+e2 z46_y|M6)(i!O_nLbcxie0MIR4q_aTx7A28*aK!kLF^;@n3TWT5&564z)7A@xh~EN> z;MW?6F}{s#`Ac^$B0VT4^+x(Q7FX4b1Ao6OeO+#O0w12hHTL|SCd$NEW22B07(E=g zD*P%lmUYr++~Tpm0(|#}&G6428Hf-=hZALhjKPdnPOTH&Q zlj=H_ag}2w*;E)KI*SxI%laocr@@ZL|zH>6XPWL7|N_hK@cS>S-4J7GKLqdz1);mqD|3;-HP3*th`uN%rX5 z*^ek=Q8Polw}U*^A7tF0^T2Z`j4j@SxeEBq8wd;Gl3h-(ir7;~GZ!KEf}~8QyJikL zF|p6cA$X9SK6&lyvr_50GuS=Q@0S>JoHtPg7ZRm&B=ykK0o#a#0M(?|7lhu(?tre` zt!)Ld25%xJt=A=gtm?ur5$xV~+bK(e{?6+=p?&H%fSlz84#*1WD$V@Vg-J{&(=AFS zq6$BoS8_FzU2nf7d0@mRvw=)e_633MZAQPmRZy_!XY1Y7`Q@N4}Y@%XqA&39^resqY(v)7+tq^q`!s4;8#{hXBMqPHp6up+^3TGqL!$;|~ z|3Mj+>~LWHzHT=@NuI`hYcitSk(jj!(r8r}T@cnI*c>2L0u`B-$*jI0u%Lpr>rf2k z$ZarO2-|?`e-zK}IXDDuKr5yb+0@|tujg~f$0VD&$_v!z#~2^@jops*TsN$r4gcWve-*iU!CSeVmCT&kq0sRE`d3L>mPt3+%^lePeiSX zCK;NS9qv&!+Mjv!s(9SlP7`$jI$z*i0%2{t7o*$u)h~Jtk1A-R-;u_n-O==7)KPAI z^pP;}O$f@my5vPYs@>+&ujg*QL@PLZ##!9v_#9NX;I(em?m1X)!_3{(n4WE;$1 zxPH;fYOHu(2~}e>o32=t*m3YW-?5@cceRYD8b#;)<2hOC9oFC30!BwtTp|_(Xn`xk z`j5)1LN9?@m-3^CT4NqUzcIC{GLrWbgtPpwVsG%8d#k=B`y(E49L3_@8AKN0q}PYN z%^l5+1O#?NG9L9^Y=GjlmNxKqJL|7N4N}@FC;ZqHIfiSAdn)|QKj6}F0C|%~ClXoL zE%q$61!q}yEFkK#yl%|4h$N1Dq5uj?GuD#cE@T}g#v%)KSouG8NFUV~IzKNGFloBco59_M7J z5gI1tYO31v^Zt)2S&bT5V_1ErgT+-m-;iCJ&o5-=WrLg3C)^~| zl{JH!o5D%N-yL3t$X`k<+B@}?dHaJlzY!kMLrP`7mjVi93Dl0$kC0~W((?7*a-y>5 zuIrZ@Zm2}TcZ zB=+~8Sgq~;G$9;L;hooYA10fY9Q|7$Y4|(XZU*TB)#HeoV3D0S5W!|2j)$rqDeG~- zkxBNF(BN;U!SLu`7?_70&WI?Zx|$4w(jL&vFGl-xLuAU1KNU2c1w2N-qzK+-!sopt zQ3Ncs%|Ub@ko6+RFG82%^!VZYXlO3WP!?QnsZfb0@=Vk0fnePqr{#J;f{wzxJS!-b zV}c`2c(!~MclBt2EUFW=YGEUUZt}YL5wJ9&1n7b+OaG%?aKWpo_XBk-=klI3cyDWL zY4#H+$AiE&P;-oUYDCoB3K<49&YZf3Fs-4a<+l~;!k(95YY2@*`l%ZXVdYzjy`-7Y zZft=kn*BCzv$c?6-1J9L%{vfZMi!+PUEM@aLa^7g^r$BcLp}s0k#LObfk8# z&)-vx^#zScZ!^!e)I_ENIRKAZHeOW%?g<}*9@|1JYnfhlJ56yAe23w>kIlW#HQK2P zhu`9!-4{RcTeCK?WN@SDygeUfEq59eqX%x(E~BrNezONduBl8J8sMYoMKG5$Iw(_a z0s5fc*(s8=E|E&uX&n6N?*35{wi!qFo3^@R8%p$_sTv-7C_ilZ-4NpDUP#4zS})aI zAiFDT&g1aZh@qO_p0u|E(S;Dh*R#Vr^*O6xIJlpG0zamahos>D4253A*UiE3zx{}U zRYgoY)qmmParMJo7&{=b7%PLk$Y(Fok5ZlfW3;iyh71gV2#u}QhTtVjMfElAp1aiP zd*{kA*;^&&<{b;lM7K}9oYvHxLsij_d=(3*98jRS3j>l2aU5k5ow&dP)`ak3q2oG8 zW8$HG+pG&LV(1%KPG_t7PRjg@XHAL)s;xj4r;D zU6r0-hw}|vc(fZm4K=plsPgBB0Dk`mF8=5}hN*ERTU??bD;rf`)1&+C%G^OYJx{DAxb&bVFQYsaLlt+(=hiLeJBr8&)78&PhxdNg;}~5KG_)QR@pgR zmA1#!a~VvmA8{!VvO2ih)jPD2+Kq4ctmLe~Q(Rn~BQwU~2dD`Z7dY`%7R{IuNEq8H zl%6V#^*VsKAytrm{M~`(A1Et9U-?K@#VeIedr>re67NEMM7J!&3d1zU35R(LFH zX(wX6G?ZFGGVO#nw+%yRem7L-m)@US3@0?IAqFFA@)T`;zpLuLn^=9Gfy=ywHFia{ z9--54^$g|OkmmfvIt@#NHW7>+_p2|<3!CzD)FC?hN-8Iy9MC8EkZ&Z@d>za^Jl}e* zFT+b!(jULbF{N=9=BQ;->x0e7F|fEqS}?A5EWh zz7qx*!NN(|USogWS5>ykChzM@Rev*^56S$+iDt_X&K{s$YVc4mLFyCD0yo<~Wr-AR zGaeICd9Zq@&6Y3v()Nr~ynT9Yqzl11&lEC5{q2{<3p?j7yRTqE&n@8MWxGXBq+3=i ziL#;LNt9`LDldYarE`_5h-+hA_&T}jD$YtTy1XC4C4e4zhV$OpeghGgJF@X+2*n{n zoEs7XgM$Om;4qR`S>!ycD9xs}7w_+%mw8{8Bh$p9|0s?vgl+#*rN2#&vc$(vhvtBl z6{F*3BXf4+sQ8#wlh5JHg)4qbYs>LMx%PU6+eNYcWWpb7JJgAzrf^TUYDX`}pm=OF z`rjwE_09r;pc6wSa9+jkv5c55CmM3CKue-;dzDYqt!oTh{bNTpc^cTQDFf_1?UL_t zmIyFrVT1Ls?e|;>##$C5n=UJ16d@4iOUibr2PAe8bUc#RsH2S50BBfa4T}*im%ajz z5|>8;h0wvl8tr@}vpFfC3*~1dLnC@sS>)ks@}m_g>alFI0Y!#2@{O`#Sb;)w<5^X4 z1uEP2tlvK*PSM%Y#9rkR@U;>5s%m$J6)VF_`6!l*lO_tb=Io_A5HRs!v^(-~{8cv^ z5EP+)5P zyQ|7?Q5rGXD2o43&x%uy`rfPZASQ$xWam4?G)!odlfJ{wC>!)3h6sl=k@AV2O7gG{ zPx%TZ-FjK=kzYF<>mhx}P%7SS+-Nye|1zjR6>PLxiozV9@)%|SC-~f?)&~nL{^I_J zRlPHo0Qtj?_+vQMDT>(@3|j$(xR**kWnUjd2-!rO1wE@r678mLS5D;bctuaJNW$kJ zH^UDZfK8pi;>V5nZ_LY9(G-^59^Iy=SvSyeptze#0DQMg6}is}XKwN$$_(-8^$G|GxM4*=SZo;lY6 zabjbb`WmS+G8~>jnpA*jEppkI8Ob~`>B@%1{E}w-GJEQa!#D%V+=Eztw6f&uTkhX8 zC&q?Ipr`Gz_87r-ER%pG@n*zSiiG-mRO{FP0rGMHY23EFnZ+1oTggHxwQwFN+%&dR z2~K`ke}wodwI}YoOV=+aUhJsBj$|cfi5f1&5D9#?memFe%mm6>w@}uxgu!=M5Ywm# z@o)S#sv+JrizQCbFi=o0^22~?55wgWYTojV!Ot~HjJ&37k?#jmK>O~Pa03a@hhI-6 zVD-$8>U9{B`H=CW7y%9et5pu;J)~Upa}XuQ)(E7Q#O|utm@y9UB-!pW4UF)KE?-;h z1fvSgSl3p`0RGm2t}^zpzUJ)~IZSsdu}UVZ*!l?d=ArTxwZ5XO6@1Es$^*GpYg-a9 zD9JvTZVoh$eoGf`+Pp1KfA$#F9YBlG0UD0iA3C9g!j*jG6Ll{)%d?7AX-q*WVMqYr zN>lnG^2ZDyTOue39eg`L%sdZSlHOh$nYe6f6VyxpMF2GzTnJwkKT)o!y^`GrpXZsV zpNk_&*H|uX54bn3NNkzHPh}n;}4;QM19Lt{AyX<=u4EQbS;HS+Kkn& z&Dz&UsgIB~wp+#GDZuJ3PS{QgRjEOilfs$vGc@2^FZl#8^eFl=CMqS}y8%8Qmwd&!d!oX|J=ZgF-a za%~=$p^OeS_M9biYe%AityR%8iuuhlyP?EIaeG{5+^irrzShN;99X4p)aVV0_T*Gn1|SF!b_Gg;u2cXV z&|FF>;U(*(i6M+BSH-Ix+x=EJe^z%oNgKH;TsdEVrGDmLep+hqziVI7(!TlmjrMEB zH(RD|&K|V21OT?f<*|pQ4a4{L&ir$Nb0^3)ISG53rWv^JytqP8)Br0eO6slUu{cS5 zOu~hPaI?&p50)U;u6+21(%OF(379JvfYf!;RLLluzZ=^&Mus#+3JFa~RwSQ=J}==g zHl8y{^HpxIUuV9Bd%F6l$PDB;xg1_Bs{{AiT9c$j>>GWNeo1HCpZlM+0pt@h z@p@^N0k^*d_;9}MJt$b-7te_-$~5pdoPB-9m2;U%+#=M?fSLzCgqdR_Z2tM%aVAD( zy4#yf0D30OSD*h}e#w^q z{($+KErf-zF72q^XvIPFO-e@6G=+|-lyxtGJ;7vt0nQWC_44250X{=DH-9Ox)vBOl z9O9BeMwY%Q2&ADcoOb#WF@*q{xkjor@(fjL)xB|o?9Yh(t1&PV5NP8}4_NSp$F0gt zsmTjWX{kK}kKJbp20z zg15Fw9j)hL*XGNA1O}GTD~8V?{t7xFz;<9NU@9o3?hHgxk$&sD z3^*uS7};tD4wFtx1ACcZ#M>NquzM^25+sbURF^owdPT1`j48@Of-4)T!SZ#z)`OOKmjL$bg&RjF``&Nfd<4AJmq_$qx0O_f} z+xxZaLpGs2XWp}B%SEj?K%WK^f4~0!@*xVI1>a&;|CV&XKSQ%fj*LO>FHMSJhC~86 zAlkYA^~%2A!F`B!d!)Z7`PWFB`5-8i&Maj0cWHnbcml}b_bmH+91FIcWFm(2J zX<_h)=bkH!PWW3|Uz5NsYJq9y`>WRki@>r9e)>~={qMLHggU~^CYMbjZ~VJ70w=iX z-?R9Y|DGPmHNh=9!rZ<4yL1kCA|XDW9US?)JMzDQTcqi?_Ftvvz)ctNd{TA&yE_~Z zcYmux{9AVjK()?99u<4N)w%L2g$yjCnmF)_IA!83g#C}!k;A}{`*c3;6FuWG1l2zQ z`qx_=IR;7H%a}n7|16UjU=^*w>Ny6_eJ|ID@d*hj7ai~2ib_f;Bu*yQD|J>Re212+ z4JqQ0gkl0WGIyBC?1o|8+LZp^2gnuzKNhgcibib43BF>PRQcg^<@JXrse;Z{>N#64 z8q9zE5qR2FsI50EHQnqeU$$J_ZICS4f@_#5Th2-uPisUNbn5vPjeWB7XENjdw_2lB zI~}u?soQzIvFB;*a|p$Ed3jyZj7xAJ(Ku71lZEoT)wVVuhud6vK~>e1$K$*Q$N4m3 zfn*$|{gD{n(x!wo#>=75R$la83nP%%d1Lu>&6GBp(@zt|*8TnUevw|Wmn!PZKK=>Y z0MaFCYoK7M57db_zOkV(sG{{%i~ zK7EBH)4VqKMB+gXTTPZvohWd#hHNxEW4J#hf>uB->!$)JZMz%5<}f}_GOFae2P-a= z3CT#)>%_Ftn_p#~`u^^2GT;57Za*uotm}4bro^YQSshIbXGpc)q-3btpEGBt)rkzAWncMfSlzCPq#L}YeoMnSx4|ghfeJl=$>(bZ1-iV| zdXBC7nJ^rN@q2+6lZ6UR^VAVkw?Q=CWGl^9w{k+whOLvp0>vJ=l}1Z*o}s6z{%?td zDEodS&STSeoXhW3@3%ysm*#g!ZeC!K$HB4TB2dP;c!$}jf&kF*FN{TQ722KM9`8HR zPF(H3sbF*bFNrQS>)j&LPn?WYT=T;qe+>U@v4nH{`4QS{VaU~dvmyhbQd2q{mnn9= zT@zgm4cGIgT&=?+aQR0|zr#|Fzu`)aq1|3K$=k!M-i?2{K;MD$N^#z@?I0SQ|KJQ~ zUnuCMJpM*gP2O|`ai^m7R4!L2LP`u06NkbP-^QoLP0xa5k>CVp1mXC{j z&i~}}x$%F|T972_cR{T~<~t|ky?pdxgWr6=^zW{>F>ZzfB~N!8kLtnNo_e+Su`W!X z>A|uHGtI?CIO6kQe2dSL%=SXe_YN-Ee1hv}tf{eMAdcp_wz*kYy+}nb@G^KJamXe) z{IQs^ZS>~>OD-h~m!(1pM*JR~;L}tc)^u{oI_HxXZ|oD-Aepi3`>SdF=dAlZ5Bq~d z_ftEA@g}R?ke?@IxH(QIB+kowA4SMkkHY|6(ZIVVl#Wzm>!%jtO288IB=@?r;DQSQ zUvwJo@#1?C)p(~hnIUkL(oFrf}`OD~<`@6`U%l-NMtcKT-SOf8WCzk=l3`6DH zqQzR%u%<;=7?Pz2&9RTrw`yEPz60;qdIAQ=06uP~x_~ulE;-Fj{gI6HGhMDxWl^(-_sD)m>TrkA@j9o^u%cXupAKr<)RI-1gUNE zO!GTS{I&VZ}J*@86VOmBIWQ1J0aRhyYmT2c7PX3OIS?@d)Ik~FJ`i4iLH5R?p= z#i^_2msn&}9_F8KLl`OxO^F{A_(wdR+waeA0R)ob>u$BJL~+L#@EJ*0STth116I2D zTdsFq9QnQL-I^LZ?VESp7a|j+Ch+?UOXSdGigUS#s=DEZTGjo4rk0GPEirD`kr~G= zwmYP1!AJ1k3%rLbD#vB-oGe>`wpzQaN_V=p&f`+Z7xTL>V!rE*7D#Cwh=>f^9$@E& z%hW|c!iO0ov9n*VE2jPp!WhUo8rHaoRUcY&6>!h6nGI-UUs$tz9teqJvfJs@JiZGI zi0*<8ZCR`cLUl)?L5cy~ zo#03Bw}ePwXCT!DJ8yVyzU*DRf4XEJAUw9YDbGXUp?i?YS*LnIup|pAq;{4HK7W0e ziCq6wJbB^GIxp?=GF*f&4v#FyxaAoPf8YM@N&eia*%p1mH+r+8m8GZSK6m09OcuJT z_5ITBXe&ok2qh0~D^E+x0d9KP0oL7K4PK7%@*tJD*E}3|e7zFXG1vvPQDlqw-0_ty|F1goHi@U}R z|FqvPuZB5e>w#LL~u z^Nw_}MG!puoaO%kM=$4isR=h{^SgHgJPefmu5 zq1vHMZFvZ5-}Ux9fNEMSU*#d_ApneE1u{L1BX%~p_Exjhtt}l1xiVmq#oboK zeBSxlc6OyM>Q?*ya_`7t`6NACGGA-dMfSdBrM2_=t+LHb?4f>90|%%1!4vr9k-%Se zg&i^4Ma%^q$N~B#@KPm$@}~3kCd4gw7Y_lE(Blqbw$RyH zoy_6u{zx`oKAF4C+JiyZH}?$DPBIPufr$1^#)K+Npc1!ACSVJZpdy&tx{1Gg7VQ9{ zqV=n1u`oe`2<>UN#DD}Zeqq=wlquo#vPdEFnQ1H#r~Aub2fHcZ%GN=5zg^`;TVnqL z)=9RAr6##G6!sS_N z5_2jY%L}b8IvT9zS2SoSr_b{1%;rZl?6zH}(_Wl06-dpG8VDRBHn4>dMBooz?1RMn zSrgBwZBq}Bs9Y#1oL*5j3N4U5*+S?7Jn(4+X;k=P8}w7g$YK=+PIPh~V` zVY)-^YlN!y3+^1IB{~b6FjLGr0us@ejF5yQ;EHA^16fZwsj&tF5e#&i+q;rO|%ba)Z5(-LzACCbtd&aM246 z@{4!(;+=Vjh{{~+s!l8djt+9k;^M`2djOMK%N&OyJW0YgX5c20xpPdC)x|xJ{oSdF zs|b9CE*+Yi_Qw% zZR-(bh^`5X@hBEDOE2fuE;x_ZN$FV&N)PVQoQBY8kVI2L?-mc(qSAFo3;uq$N82*w zl_wqU0Wdu8uVP%NkD1l;gRa_sPV!OtsR#^q+^sQC;<80DgU}S%0%W=X;iqA@U*@lR z-Txd?M8{E)enL!g=R}1^T^VH0kDrgNYlD93twD}fH%DwOgl=Fe}Lk=Af>Z>8r39VE6$Ql)8)$s zr@@N_hMk@q;n*RTY2M$U0`wR&b-NM>tY+?I~wKeoJ=PD+&>c%Q9P=asQclCog&%&sylc-;R0Aovq?qff3we-b8pEXaP zCk3+fjfS&1ZZ*hO-%U0d;g*!|5i9rSsVbwHDh7;iXP9s*e<%G0tNq!!;jyMe(vdrg zhhIOEC?Bqe%Hro*T@eES!3?PR0Nb!7NI#Hke6;jpVW&X-+=i?4R*P5l>;2wJWi;== z7{Hoyg%}*(LBuF@-T8z$qjJ4`afX2@MLlTIy_`sxC_Zn|&1>|>GHIs>g6m5IVCQ(A zKlaOH(ddF@w_C`%Z$#*-)XQcSS*c=@`_(l2)Urx%7gt~Nb4mkUfXLAj!izHNIaK1| zQK0f+t+YTwK$&ktu5?Eb3s#YiTslepp|v^PSi>k_%i?y zR7|VV9&@>NMCE?VzKXLaP|nNWXgVu}=iWgH_npkux`N+m5+_b0BrTKQYLF(5MgZrQ z(G_QV0f%eG#k-|FjPf;|snU({s19rw`gXRBJ$RLPa)pc6IMv9hRZpslA6G{4?VYWc#rK6;AuZgr7w^FnDq`dU5Y{#WuB(2DjDo&zpB3s={bAy(H zmAOH~BCZVIiLcLbS>?3jF$HYhw}LsO00$ZuQj-|k%68s-&T@&|Ut)yBr#^7rwq(}B z4vN6Jj3RfMo4n+fXPO?DS)5fl?TqeQqnHPfo>8`mkRelHi}aGX-LH%qsZaUZ;a9;` zBDYy26E1KzqA@6!h4J$^El%GLW#<%6DB_(3=(#jlciPu^?(#onK96r!kg1sq zl8h{R`t=IDxoQ4rWu#}6Hfw*K?^ZhxEBxK*}HHoWJG-bLfa(ljh0nuF0#{Vj9Tzc$=wbvIEzH!D zUdn;ab6Ed8fub%jJpMV;^i82`ht$5!666{D3&b;wV3j^8WyU3K!fy2D{FA>rj?BfNW(&^(ibtuyfP?mXhOnR@PCM(Mn8x}VWzYV8lSe}(wu6~~W z{$UIXe=^2wa&k>5$?&(KSLw3HXooh-9NG`7sArMtj{$ZXguT9(C2f_2<2 z+t8qwVdgXCZxWPFRE_91l!JrWBaXI?no(BRmQ-1~@~m5&vV=h9Z?`xU%&7-J`7~it zJ=AEM`#j6%K{D@aKCLpcG}}QYs-pV})xZ!X+jOhP3i2r0n%Q;qe+=edrNKsaNU8uy z@=jWm&|7=E_FvmUfsod$0ctu8Tr9mX5St!E%~zyes?@rji*8qm+qNK5KBvY~kB4d6 z&tCY|y+!`!Zu%1Ey0`QcOmRshUaA7E_#4Xy+J8tP{C$5^c3u@|qU*IXZ&+4({&Ujw zW|BY;-dmTT0CIp|^Q6|f(!|SPcVga`>zv00ow-*+gP~SuU59LQ&?^fy%in~<1-qQ; zk}WQc_dzNegVMA|lom~^v&buuR+h}PlNxJgYuG=DVz!&p`>m8@jQh4XI)olfPxn6Z%(4uEfsT`o-%;9;!JZH*prP>gYP$t(WIWniK92=e43JQ_2|y z1X(O1IcpKJCE$y7?X>K}t!;xBAV&Y(ojf&4_5^7l`Ft%JV?iXnE{NmMTCH(WMVb)` z_XwP+LcD?we=OX7$FS%|rg6=Px%HZmcQ~kZ0&E^O761)*`R|aHbAH6p1`RKQQxP6m zCH}gJMTqx;WlWTH#iiL!LdPZ1t55jO^xC*l=3~?xO^(H7ignsp=%4RAqy$Xg%7p z<(ct4veAqjIg@9_Tv51D(_oZ6!KDkz;%XfLt#$ir1?qgaabKD@yJgEbTjb;= z=HPzUfSo`u)f+=)(_91m%bWN*-@t;*&JqUZCod3n$}d*RFtE*1Cz1er$1<9hafqJn z&Nnz$0h-F&F}Kdh%W?dVox>QsqTK0ChQUqKONoHw+UxpVs@;8Z^&JOKOlXh%pS7GF z{}j$?p}`CIRsOd=1*abJ0OjB2L#X9gnbKZQU)1IL5_bsw1RQ35Sz#P4Oldi?ldQ80 z;ABIih^*UWl2=TV+RAjr?nnzq4Al zQu6>i>%M!#v_b2gSik2iVSzremDe)Vw9%v4`XPR>YC6Jo?+$_(AOp4lXw90IHEhnm zGblT%l~i6HcIy`e(dFu+W(xG3Z_~isASF#%lBZ9S@GQCEv#Fw!lDzaUkVJP@l6tAl zjpnbyKZYR+2BGqQgL&X4@(xQGVdYI8u)dgSuEiO59vUZ(Rv27!?=%ecl_2U@4^3l2 z;Tq8uX`{VBsOdP0#}Q5Ya=!HT*#o8rOBfvP(D3&*wD(Kz1!HNnviGr?=57J0?eDtv zH0%26f#`@VlSPpMYy-3J7tAAk=34{{vxm42seRroPj|fT9W*1@lMm4Ex1fxL8^~#P zm#MD9uCLC|E*BW#5o!=@mTWZbg6pJ~f0|4wGibR)5NX;79PWI6ialDQSD#L71QT4m z(EKh|I&}K!qxNxnfDM@#hR-N(j)3lpi2p1;&f)-nmcF-&ae>u$6zS^D|AP^6M1~`P z!%1%jHN)hi)3brVs(G07Vw>%(xcVSoe|WTjgByjJ=3OwEQ%J@zYs0CoKm4*ROQwdd znI-rjY=q@>#S|$U#i%Db&|*ZNJ*zJfr_VSe^Jwgw$|Furj7s^i%l|{T(Ra|c;WN@_`hONI>jix4;f$zjbg{A(dB*268?NhE`5 zVHEy$Ayuk<(%Kn{GUU;>>jQyh6f#o6Ch@ar#8$9-u3)npe&KK_8yXc3Fea3ur4S`> zo^0Y}>*C){x`^FJpdaSc>6t6LsLk60_LmNsED!);dmgPfJ2K8b!f%hu-nrjf2K5;Q3@R#%^uaTk44yKP6cQvK>&Cw}cGY?F6R=&riyC|M_fz>=@k6X_(8 z!VQxF3l6@PYge=V44(9W*2x&w^#Pb$>ALJuE%>UGwa|L8t3!38p)_wc_mGg0Hpl^W zh!)65G=pi=N0GJY^WOlL`Gh@2wehQ6#bb0-ijcMDtR z5nMZl0JfQxRWtZGzPeE0w4iB&UHfKOL-AVq z{C5lpcflUIRPzsYVza5u@PU9N740-VJY9g{REo};=T&=k4=xBd7oTIo)zzN|r zNfi8eY8Gpd^;##kYDNg(A&i3>4yBq zKv&3ueIoyZO~oU!qT7xPH9`KvOBkR-hHamI!7D=qBLy!1Koj?C)%$;A50C(`Hyna8 z{6DxB_#XroFf?(Q$-9vLHy;B5h9)2d4KV&Ly$$9)h&Sv9|BDua5d`n&AVL`Z{x01H zh9-L5&sFXJh9)2oz60PPeu@3XcOeG+!+W?)l9MW6s6z%7CxuR-{`^d(pTXcx`; z<9{MEYX^0o3E?;jW=BHR=!KPZayB z_Df{)e~=vgnBaI$za~>%U%m>Nv{AqR+q+z6h21sM8sbyfgJfV_qtyPY6-?;VQGBA5 z20suU{6KEn!e6HIxuJXwoF`I#K=J>o8lVSNf|`SqL*U;~hSA4e1t!u~cGPQg`YenX zZKn=W_x`1e1P>7ev4n|w6dB+=0czmLTSNzGpZmv8*_hSq`49CCUH|P)K`08U>{I|D z#!oh^L?u6b_@x{fWCdyh+J<AwX90Qler&;)!A5Fd*-%pf1|b+XX5 zh;eXzEnvd#PvN;?O!`+-YLX%PSnJ3?QPkzcEANnQQf-}*$g2K_uI^zTkr^s_Bu3bQRu#dJfH zD`v(-;tRq5)+a0kQ9K_bBMd)9Aq|zeEgi1gHEd>x2(ivn&oQcO&04x>S>ppytS0Yk zx{%+69cp652;!F0IQkp^^1TEUm93bul5iMh_vRC&8skg&KsuyE5JdfspZ8N`Kql`W z4)5$EVH-+MtuIm*MSEn`6TO)()nPOrQg^{LJ>&N(t}R@GwLR$pA+L# zV`tbE==0D<8A_!S{;>WRak)+5(`^@dV<(dnAg;q>G$xo7D#;Z~fk`M-1`qw6sb4)p z;J;xrFwfN8`2RWi^c_(6|6^qThgSZ-#>oC3cc$+<`cIo29(|NH&v^yDp7*NCvP1-w1RxNINbbe6S0K>U zG7t#I@cK32POR2yA_#O-(n?xdRZd!(PSwfY+{)Gr1bXp4RtsNSt(!bmFZ!dTWxB!* z_>D)ea9`X=51vbk_;~d?L#L!_d1g34i2=K@w3f`>B0iA}ZSA{WM(oVYsMl>JO>#H} znAn|uOn=Jdh4ZR}#Xw3uh8SecB>d$PowhjKyBO zTJrHXyy16Wxh3CG$T{Xb(2{p-c(4;Q^|h;l4uU5s7u<2%0yhnMfB*0)gmF}LD|Axs zJLz>C)lBKln0Ubid`HT!0z=QQmaD@)T?8qw&hw3g@(U;TnXtpci04hz?v>nfNlf#nCMl=+8h(5d;7E|fvD95o zU}WhN^5vWQ?wZi+1f%>?{OIJXIZrQL$zjDqUFzW#OEGjglD03IUwn9buSB%(i3Ag; zq6u#eb2yps8~V7f^2@dULUCL-kK$3L!S|Qaw1a)D3@?Vf%Q!>%5KY422{*hQhLfG4qQ`A>7&3jv$#OTYd+@TXX*4?PssBbJ8GnT<(kj_D( zxP9|mjVlzLES*d5@f@Uj(0eyuO1U(NDmO7Fky3I*;TsXR;}Bj2fj_n;5;F$b(yg!C ztOvR8r_#0Jy#9FOxK*m{X2gqV^z}u4;=2J750`?@79B4t48@t>o=uo&`nrPdSIj+~ zdiP-W?vm)OYfg*sX9Ds)z`RM1;wK|gR;Lwgj+M)rWE0}wUUG84(YEPLKZ!dz=!yUY$)3ndjKHp9w z+`wmX`gCE+>A;qU48tzZsZz5pgX?e{S`E@@8Mg_=8lT2xztc-3J5~AVm()h0B5fk; z_9*j>K?Uv9>e{CQw}O%m)?xk2FSMRT$c__pBFxz)3@v@+Sw@7Nx}*1&`s>d!wMoxS z=5f&aWBYpL0+=Ew-ol(o2vswNh)L) z_b|wPfj5xu@!PPWTRvZ}mOtCPZSgkXm@eRj(4FusI;$6qkDfjLuJ}g$RY=h@0Xn@; z)^8++-zGmDpilX3xAJf}yy>}k`n`fc>-6V&WMBfbG)2Cf5wc8a3F~*Ot{eDs%1oqd ztkYD{hy@!yE6p@mCv*W_`NESEl<=DP-W5}mm)fjx0q@JFv{^JGHB73tdA$d;$~lWj zu;Yunk7c9BP)@}#R68#>@$p7t>g&~ZM5JRZNTa!2HS)cY%s@5sU4sO&S! zd=kpSeRac1%!&kg6-khvbSNdK)BUVlhvfx}hFqR{k$Op$9@%Hv{Hhsj%u{j%g zJ(`I8ftSUq#ai%;(^nBi=J}oKNqL%Cnk83{dS4D{Inz7iNX;w%fqW9H6sH<4b|^-$8~Ls zZHsw|;kwki=RXsFa{he(bEJx`D$2?oX$;l`+otHJn1S(KAnV@4{KIA&`>qtI@eRWt zKBagnsSWQ&6i$+UIFLNu>+spexjidrZ0Rx=c4Lp4898<6%utBb-d}$ z?q=)YE!^{3eIt)7^XGFPXD8Pl*Pq)i?p3SnLqEP{CdszA)i|$$wS(lE~G}P4jx;nd)HjXu*8}#aO>$Mu@-&j7$xUX<;P4qg=1&y<4 zB-H!R<$!%xbm1gEK1eHa0#ce{@ZWCcGtb`LMS+i?IR`WpVDi} z%!F5cxcgk-Spc)!Xh9zK$M_GmjHs`-OfyVbU#E6PMyA}KCYKFQx?3xn{D)faqd&pipqC;_Mt$D{jEDx-CWV3!Q#PW z!L&Jy%3?xFril)^SeHg*c&-E+0qd#VHSr*kOtTzhpC>Qv!0UmZV5)=^@kX=AlVm*S zhP7*hv;0v!To!XX-;}?xh0hPDB+fUrTDHyLMfu&h$j*6I{Y>A}Yg0GByuuQ( ztZ}<=Lu*7UzQniDd^qs{!HGzkcr`9R?p91_G*LJA`g|X4B=E+r&T!G_rIwX;eck@~ z^SMs8q%(mrh`>+%nv)Uowm3b#pxSXQ9gSFfdI;Ohk&D;TQO*3l7L6V5$(J?DDCNb0 z5`*$a-NMX)jB$tr5 zN5=ZsR=FSD&1wm`G_{J>^s!{X zyOlT3R-f1LY}QrN@TCuKWudQ#PA66s59;J58S)mdE?| z1REiH5cJFd{Cq=sF=fzwZH|714PNToau%={R3Kq{nTK*hfseQsOt6`CvhK9bv@IUd zmn#aGz}(SX#GqoT21W?;V2fx2e&#)MuuYLc0mI5)j2>6+XZQC?`<sUqG_xWcsL6G(0rI#Y@ zS!4Z;*5<9c7({1Lt3#kHGOO&%e%BqC-IVz^^;N;gN>>XX>kEX;=Qd#xVq*fuz)= z<>Y{~nyHhS8N}Jr-bDpg`Ubdh!{LRFGYCY^@aw>ld-Zr1D1X9AUE4)lNfB&nZ^vo! z#{RV#r-z-xuW~@59$?_o&dkMx&cn_Y;tci>d-O*NFmV0rHrFG%Ka#lEh&|F)Ql*o& zcQT_B;N<4yek4vnM@J{>^u`?g>e=&uX9s?XJ+gFhaR761xx2e_y7O|{J6Ui&5f&Ea z;^yJv;o$&Ma5#HHTueMTAkOsvD&)^{o|!qDI$1fmSlL79ewAzT+TPVg?9roN75(-3 zmz-uER)5z7asGF+fCh5?dcyUDlbh?WvVp9kzwUxntvt+Zb)H$-0euG4A^|wd=%&OsR<|J)z2h`~z{`YwOyWZa){yU>6*RQ7k))oKi z=RfWO9W72E%JtWvi4%CR72g2H@qyJd6?NbY%(6c|rNB2caQr$0hn(#<*Tr}cND?IX zOiJAYXLA;BhWcB5*Pc`$9zlTQRrlJZR}aD{n1t>s&}sWGv^~7aB? z^9TL&%Z#*cA&_w9nTo`@i`kS}Jcr)2CCNV%{gH7y!6Ma>)aPi*BDTb!u|42FiULwe zBCm>Ho;eHt7?ilwPw-fJuP`A*`S!o1Y~^Y>TVgEG4#35^dP@@YkFS6Vf?KVusF-wv z|0c7cKZu+Q_rC}!nU8nfIQDdJNa(+miG!=%bmhMlmrYLRud&f3z5JhY;9R|Kyhr?B zy6yUBU4M{fJ}pUv^gm?>nnLIQP2@kj`Z}GeH6TQ`uP7h!Kid22C(x*!|JGCgYt&!; z|G$y?bAtSD`u(~5|39p$-MuFCxL%1~Ed-KimBV6!vb^(WseiBD-D!dkS~x|3LYs-8 z5-b@DBzRD5w!5AS^L2vx9O>j3%r?5ald6b1noocKL_b?I4MEX(Z9bW(cebcK7!YZ6 z9uUsmsOyunYvO?(T4I)?Bp9m;BCKsP5o<6%H<vuV&rgkc#=~O3-5GK9go|lHfF1Ko>56HY0QlPmxF9*KJ$We#4K8laZhUdu;zKZ zYy>5OHCEoqL(gxXfvk2p@S^jumRvqpIc4Sp@4!9HlV`tas(?LJ<0b;*;<9#v?fl$S zYqaUcd`pW6;3S4kLtDlTXwo4E=di+fa-ql31<1UGd#c>1o**+^$CB9EyE1zU% zU>AqEeMiqV@2V=}pOOf#+!AzHXnn5C(f{N$brfU9Ovqm5@3mDu(as9{UB7eF07j(8 zGp|JpWHY9r)ly-6S=VTtajs+MVs>lc`2SL;Vl80|pO8?jTG zRZa^5_zk=RLYdaJzWN)o=JYZWJ!6C%p8?BvYG~jXRbAGi2)kO=bI8{jRkMOu=3;T` zMJeuGmtID(*$E;~A|L9vpl2mzPU*BvoDt~@2FkTkW*W8y_Zc ziYiuUt@-@N`g%uFaoAB~i;;ksiq7Jv>+}o4_xgY2{NY8=IsX5jKH+5nwm{1{K!c<r8}J5>yyLa9nL8-;?ah zWUC7!ubJAA+8&L;+~VHJa?|rNf$Emx@Hu>V7Zf(#VEG8I8ZNe>T+2^v%mQ-V?`CTB zJwIg#Mbr42^6VrO;ls1Zy3UwaHVZ!l;HpehUm}7JJB2yKOLNHKHU~JgM5(lVsm~ zAEsGNGrx0#Df#1r%mX{k?y&wyodoDc{<)amAgqU{mwlP(wrcx%+-H0mkF*LvpKEAp zn*@jTb0=u)UQ~r$gz!rR;62xU<;rj_-UlS_#_onnoTXQ+L@S)4YF2mJ1LeqkO0^>! zewh{TX%2sla+>g8y9=#Uz}Y9SZXB2Ml$+sT*81_4Xi;o*O;gWKqcHJ}k%v)xeg9*} zT9E6vz#cM`flj$GyrubqhTTE4e8w}jEeKzWeJDY{FahtJW5#XTjtncY84HBJ9AFylztUvA=cx*%GOtOj6Tii zg72bKsM(k)n7DxbiP7b$*6NwL=AkrSiJDYFh7({%%pz;EP-Li-=&QHX;{&gcHx}lF z^(==Lw<=2Iev>7ooWoWwYv|ZIR+iU~$~nxDHG)BOQ;$U{sAk+k^9z zpKq^uj#XLe8G?GDL?@C8y96*aZnL$d0j-f^F50=dQ5ylKLLjLUlt=L~PD>K+x^Kw{F*QJp&l=s&q-e zT1SDUy+nGLaEcgVpBWyNvNvv45S?EiCP@br)gU#Ge|9Q4k~T_L)4w<`Pgd#l_?FO1 zm59Tm+*D{m9>IJNy-yMJ;x3s2&-_pn(#2~<6&un9mPCR0$&SXSDKS+z-(In5kDq%V!HyD<5?k6J!#lPB{KpVf?P81)ei@)8h~`DgKe>gP zj$#$yoGicjBvsGSIIbw$>1ZizXS1(;ywdAi%%@gF5!eX$p@quji{|1|^=KZaou-3G zufrd*vvrQkXO03{Lo7F-4a}j@L@{#qP6969>{`x`x&;u`Crja6(XNQJU*6ey1K!o> zEt57}GLs*EfCpMW;Ok*t!(aJY`g5{5=;pUT>g{L+&KrdZD%i!%O|}VlL$?Z|jy8IlS1vKiGQDZT6^j4{ z*v&bp!Q0u35$KUnb$^JzSxsoHQ0N$?P0=DOdp|HZ<1`kvIiezgmfNtqZZ(NmItVv! zuQG9h04}rKz(^ok*{OEkx3Q9TAYseoTZmwNVQDkC=v2kP3(&)Ez&e4c5yOBf-s{zZ zne$3mX1~5HFlijrCs6!#tD1)OB6TJAwe%f${+tYaLcXk2-wc@{DkH!?$Wb%-8rk1n zG3SbcuY9&)HaLX*%9IO9C%iE=p~U+yBJ29Hkd)*a?2Aar+vh^P)ddq&-; z=HlhNOXS(}knDN7$KvbFMHaaV5`HNb0rVEqbm#MB=If*LW};L6PVH7pflUvT3o?J) zS!*5kEN!`HxSX!>FRGk-now{w@8{>fnqXmGldYB59bg70IiKHqcbk4# zl{*EF)r?-M#C&j5GZRgoJjkVCRQoaM9n2P*D{Z z>8*jJ(h@Iv?)uDu^tPlF4GDE{SKT-{_;c323@RPQJ3 zpzml`?lFxra(VgTTO{dcCT5?a{lzNR_g*ypVwjowcvX@J7ri%kpto5lw4w95HpQ`e zp&>=tQ6m*l^RM4<`Ft()Pqh){^?RLEK2e_!_bA&fr7{YjW0eYUt$q0!dKP`z!FF@) zqDd0u3g6i62~rqL@U3bG$8x%MPx_mHq^xa^Hr(qPVqZS{aoE4efx;(kBNMPS3$HZv zTqEk>i@swDUAVFuYab~2d)6iix`I{E@;3)XAzq@k3MU~0U{uk}a%`!hG^sTFRR8sR zh9%Y*bQ4AjUD%~{X8SowZq{wY)kdeo;2;byjm=4c*8cq}8!*xA#}*qj&jj-i_}FWz z8A|cv@bsds`PGGIpA%L0VyAB~@r_(jsLve+@}BI8pY3+28tk8Zr;j=obwMtpQ|J9I z&%2-O1@2pAM@>{f?Q|Eo#H%vqk{sts9ZK-Z3L;6UJ}0q1pb(Em_1`%Qm5x?HaEE(M zBkfsyvdWye&r?M9bKw*@zu$c(eGIVT6+ z^TheoG-En`g$eSiqJ%beJe*an_GjjTqG31Tx}`^q6CMAnrGsTq9J;K)a?;@Ev+i#w z29Btp+=5KaicNQp`X;AH7Gwi%zAUYei;QQ?(w$nts>1OhF~n81iem@cavIr$ z8dPd5wveBJ%RiPTtk5_*u(M4b2F=|MOtO~E#9^-%G02UJZEDsu1T*MH1y#zlF%WfW zmT~wH;a#^uq*l=QYpkuGW!S9KEFD=6ztxqQCqfEX>9pDW4t;WvS<2BBFsxNo`A{R8 z_Q3vRm)EV{7|2y0gh8QS*VytM;ThgfP0X7PPpBXIXD2H-PLFvpb0(g%``B+7#Be&6 zNsI9>W!y&&yRP)-<OtN&DwK99)Fx-nMSrc40*FnGyO530iayZw5emf)|>+f|dJM7^btt9=wC zcJ_VP;w6YJ6)oRY5U)VbV9#tKd)*j07YEqZ4=SQF@;G-GWL2oF6Hi^HfSnKzc8rSI zU^J7SIAp!cPX9Bzs1G#@+N!J5X+VMl^jNw>ejle7RTD=^l4gQH24rzw78$@K7#PTL* zjoj*0A5|_|G%*`%oODqEQN&|!Eg#tjj?X$}#02%!C~p{d8%V_+&WDDK>u#48CCTBXs(B82;**3v+)U?L1Rl{}Na4d$`!0#nUp(AyqD__fi z{@eb|Hv?+BC5EkapP<6m{@R=vx072w<{tb0gtXuh4m-9j^&&v+Zflsu)W~kp^Kb@@ z0e$HS6f;gy9e$ASXihkT(7=q|V5-FvAXh1MYRl^0&JQHdd4BnG6?F z1r{IUlbDFt^SYk%GKd=ii(X-=NtrV4%LFQSU6(SF^3qc4qeUpSTV9@)nxQx>qhWY@ z`KUmd=(cUvS1G9kU%*?4NKW+nfE(sM<0uQ+t^>9X^&83KO(YtzGE}z1!3FMs*0pg- zG>QmK>#pJtfH$>7)#1l+78xqO(Kc#e;9S}3Z$Pm#G@8e}Dwvg_1R@mZ>B+pSl6VYYoW3yzKZHM6H$pZ?giLfQmxdBPHd zRVw$g!_OtHq2%p{CwqN1N2WtM&H0B9?JA0N>iI~G8Z1LZ`WLcaci^Sqok!1-t2zqw zaqCP3ntvJT^C1WAPH*8?!3=&t-yORWMhg>$9GjiX@?yL2J`c8%x(q+_HbKnWOS=!#(|ul97U>qzoE;%V&I%mW>QJ?@3Um3W@0s;pK6ITkWcchE4Rg$XVKXqJG$Uhdl)+b^q zw*s=|SBla-kZyUkM$kIjGmLFOW&w)rpAe#q>RT_5mE4aZ+5Vz? zBoyH&5>$_#CZDOv%$)hQRtH`Of4hZY32VRaJ^ZBhy}jI!G*%1UM(msUth*Z zMIud_7iZ$UbxCLija&Wu^5YGmR_5>oGPtb3feCN!<1PW-x7^8D4}*|vc5TWQQhc@F zAB77M#VEIgdP-w{?fMEHhC#cE;%(}l^$%X0V?_vg7`oOIktS7?uk+KrO|;92tNbe} zZ_q?LTXSeHjOl!27k+GiJss`sI^M`D{G4!{w@>Gyy|3oEmdnm*Wai&n3A!Oo-0F}! zJTBa__28T_$J(m3TTcl=%=@3tM#_?(D~M9VH;^yH%J>S6Pv>H<>Pi!q0_azt8<9O5 zD|l|7kD;rO;+^>eDxNnlDwHPjV)+bi^p0$OF^kg)AN&EILXLlGn%Ij{f{zoYT>ZpDHU=gC4P2IatyV zi4g8dE->U@JY7_)92{$0J8aB2*oPVeF2Hv_9*b}L<7Pjp=T4HPr+w5a#mYwM2vs%M zjpOP=i3DecYWY(QxB-tp)zrgqk=NdQC?hG#;@;@Z_m1UhnyZw0cGVi*FBYL^2C#`M zC;+eS8!g3p0R90X>J9#HGrJ{QvUpDG=EFX}JHVHF{!hxm&RkmQ2<5_y_?ENmjZk%2 z0^=Lf(v9sTIzGCAEApa^uMH)ciSCogjIw)=Utv}&b(+2#E3^~w^NHK$WJU+?bgU86 ztS`qJg5lQ!znMRRw|oHLJmZQYMWJ#UB7AJ73KqBf)KhiKA75%r{1AB%Uk7)3*;?`G zHGG0+VyLWTr{z-IxgaDdXZ8U1egdhjj5P7Gq>&+rZO6ybE`wcDOWjxadxY}|0a8`^#i|;vQGeYP^4G=L=Pq7h0^K7X$ zQgZBZe{TZC&B-We!|FS&a#P0F8H9d|aR<1OT0ZuWxmB1518G*vZO3)d`iUM$zmTxB zd-rm?92p@{RQOtYqF`Xl5~nD|?I(*f$wq`pM@zKbM!ni+3l@*bK1lc8z8XmhL%cpu zWxx3+!cZ+A)`h$HWWVA{1TDa3IT{+Bm_oOyqG*k-Z&bFLT|GB>`##o30ftFJyy!LWlv$)O zGApJa^1a{+`ezTJarL3k5c+eBg76PpfySO-3PbHNdc_+DW4%1*$=66|9tiTg8@wNF zxj045_;5^34uj%K%sSk7F=_5x=kA4AHYjGvFc%8@+*n}vl1^kR$Bar`&-LdY0SDz6 z(!BWB@C^5dC4d&rhT5+7^p)${SLIPq{U2jO&P-rv4VH*Y;wUL8 zR|Nww-ge4EdXMZ_&7L!V0*R(yJrF9yavM5>%`P+Hn7mCwp&pGo zP&o|IBwu6oT@C!h+0bXt_9NH`-eyh4U_-LKSjqhH4!+A0NWB^Ih| zw5{fD{hA*G-Cne*0D(l+U^^Gre^Kl@EUvL|LmLh=X%Xjef0b=GTkuSpifl;Zqayq+ zN=MT`=;u%(0JjNu-q_<9)Lv~4OMQ>f>V3cz1jV82?bReZj?tTQ9|5ouRkoC2E_cf1*OuQH2jl6}RIovq!E_{PvYzc31Tl(g*cq9z&`+6O!~ z9-uXQ2u0TuLcnNY0RO*Bj8$))U=;cOfOdd`z!(81iMuOa%VFJ!t7_2T(yea_xM(9K z1sMw}qS86r2N8mEd0+wC>j6j z;HPEghvLWyjQPv=Uhj||h;~Xri2fK0<+$a0Y~jX)unZ1+3hAI`{^jDsQd#Y~w0*=k zsfwnD9~V8uf5U<;pQR#B2mpv%?(|)kUWq9*>vsHLor=YOJN#MZ%Z7mRjIM%@qGwDcv*WqS@cN+k4K?ruM zR;5PAze`7zPDh1Hd#F!`juGBH=mfynNy1pEZQFP8_G;dWt8W>#_-tl&7dxB>hl|X{ z3EA9@pqbk$m;^1(hV@6kBAIJjJ+>nspyO9qD*Hn!g%uv{z@#Qh49-7z16WXLOPsl= z0!9Bd=G>+`gFO~FMLFgbwyWL>+lKt8M00RuTGEK^2V}etSAN1aD8SwwPZ-b`J8&Vxv86}4Qqko!C%u9YADB)9MZ`IJYES4q0fKYKsPx0sG9o^n@ET&Y)eTF_C z4mHldO&R@pA~TB_KQ;t3-cXz2lPI+V5FfhXJ5AVrl!=CVZ4H~&tC#uwA2ioGyMIn;?s7!jFPf$Ub3GibCIDK~ubQnh64imMI$ zNbdfo)pS{h66e&5g=@37I1W6Q(YM-lCFHHQ3dvfBJJbiVJ+2!V`VbiE0GMx}#@uTSCs5?s@JtgxHefm8x4Adby@} zgml-pq@*-G03E1>^a2B{ z6sI6N8B7Hbc^Z9S{iURF&PnfTnF|r3xYx!W4j2}VxiXLM_J#%~N#^(Zu#sv8o-&nh z1@1i7bMEIqXOA5x<#y&m13E9Kxn*fFGac>;s~i;fk~#WEhmqst)#PPnZ*fg~UM<_~ zvOQbQHUuex)lp3qj*RT%JwfO=VBZC!j^8JEBxaiF&dg7`}ucs4N0eR$#F^tiW~h zz>+{9^t3(KDGFJiFAMwSAA(gdX*V7mN^rhy7=dkM=eVoS-?tNv$tqF$o0{;Y?CMXR z-O)H#*OgpuLqux@?V}dY@~LX??Yjt?3Q*Kw+Z!B8iw+IngPO@GUYK96uPAorX%9Vb z`dx*d?K$rQB@4MBpE+)XcqPqU2oM@C?ZNViC#)w-+d{-;qxMgkOB0>UkVfR|9OnBhSUREu+pf zwq9D;Z0})&;z8p(=>zZf#Elj>|HUYUYphG+rk`8-w# zSGxs6x^Q~^Ebuc}A`+yD~n7;&EZ``;x50`sfCL`nWkaC=<{ zxB?GUW@P_{FVp$AzGasL**x_P#|c_Wg5y<)U0`R{z6Uo05r zAP`Owk0{>HzX7SguT+@<8qCKK>i<*6zeO?wMAQh$m8AM-iN69d1OStmY`E;o-(b#P zS7|o^$$NJ1T3-2W1QdRd+w*=+Wi*k`HRQHd>4@BMF;V3 zD*R8m0(h_;1a)`-_{MW%B#B_fNSb?*oMC*hQA1YyYhoPXTFy`8NM+>;E^1 z{~N^rt;D}q=bu;qTZ#YwR;Qgwpz(K@Id@v$<4=MHzV&7^k7E>HT{HTx)^12XV2{z? zb%dj~!Rx{owkC9$%scy8P5FmBrSk98-al3SAEtADfkofxBo=ZU&Q&jL4x6Q}yA*F} zBkLMec;NIE1o->&_0<#l9d=ENr^{C-8N64DadJ4DW<-eu4Uj##D zR3uIe@HZzW{FJTbRw;BH0uC3uE1>t`68l#$NDElKQh(My)fe47T2Iq%+c z;pTWJ1H6VIq)PB@OIo$@%FynD3=<&E3|9-RNF+542nZ!9=C3 zdv9B{eZS;55MbFXp@wF9ZSFD6s$3E_1j}D=_wzwgs>dBr)3?Mu5oEJF{1dYaG=BT} z1zxc3K;vn<#%ev=Pr(Pu{j*2o(>ryf_^FAFDpc_o%h8Y>aj)ZZ0tfi%;W1PyPe z{jXOLydw*BEE1+lX`Royx8sd`-RLEbhe}ZrCi8$cKoX<;j4OO*>Kv83qAFV^52@F1}{<9Wm^Cki2Ym5q0ql`*0*fKGbk+Cw~( z2|XeF*uM}b!+R*$9%-S4oE?0!oZoY|y-uDtXc z_-RwJU9(lK;pD4*JZH@F6QqH0CZ^M5>q)?Z*pWGg3QH8eX8><-f>@e*o;5) zoT_LIFh|QPA6-BSR4O8fXGSVc{v7L+T`59C5gt1}C}Dwkk)@%akw%{~vmvC#iQNVw z8>FqT-j#2WycMM}v^JSZtg?Mj4RleEvcw21qb5JX@nxDrt0R+6+76WC}lkqs!|mkkT2w_ogfV#NI11?QoSYAR_Dg9iI< z`ZOMf6?)IHG4Rs54DX3YX$o(^B4prdj!|OXZ}>=O%mTpMLJ!pWkVm zpLH1F5NCF2^R!@s_wnG974h9^9d_t7jg;t~C>tT3t{>CX5mrkI38Zm6EZrJ$P(YW- z$Gd<~AEcO09-kx6O?28i4>*rq>z10mFg0gZ;h_fGA3N}mubvg2Suxc1Mou$LF9%m% zgYAU097iX4l?a~?jd)0){!{T5wqB)Z1)qNJn0Zh+7>7M8ZCV9mcIhuG5?0L}a*0JB zIxAj>SS|Ok6)%kInxaEOTdM(L#6kkp7k)B6ybE zMqoH6x-gfh%1~Fpo8xm3v2gp^exhHq=WIGYhA@fh;^tauRr@}qwq;x0BQ<0!IMuN0 zrx>%WW@a{k$8AtL%)D2wujJD+1`mEYV)4(FOoc8W&_e_`>_l8*2UP)JhFWHdIOx~> zBAb(nnwp0(tnxE+mt~n}`z0bf>+@tS(Fe3dGEK`RUbff1vdo^WC4X|hn)DwVe#u{R zgU#N@=pm*v`J({f$-){OVcDmvV-MP@Bg48Q6mhVMAzoLEVy&&a2 zJCx+jRjQ^U{_w_VehNMc@Eqqc9j1Vhu<8SenBnZ+P9^yijytCaZ86hSW+>S)rH z!YCd$f+=PHvQlBZ;yNkr`ZK)Vr^+=2&&&V0Is$I!15n5YULJsrn{2o`hckdDcAxa~ z#B-*wFE&JH+MmWpc<-bhHUq4;0!#QMB%>o$Tid0DToPIm{j;|E0v+tVb_rA0{~Gaz*95Iyc5i z57B=?fjf42RRH*_2=-t91)z;gQ-6t#1g~Djw1v_(FtDdz_{M1)A%YjV8Y%~=U%ALH z9%V)ejrKq3+6=}{{S*8714Ls(AENNe+S3U>*x-2m)l}%|yzgX6$b4`#&C|(f z8tnpEfILCmFPe9sGKpi+yV{`R9u-UC?N^m|1#~HijPu3Od}>jZzzd+qIu}(OE67(F z-bA;R)^>+|V{f$<#K+6S>z^7{#cJud4f5q3kok)`F68STzCWTcvVGa2zauf**uUZ& zGbR#w{?BEq_zu9jUa7!;0HbxcCC|j~|FQR$aaC>I8>k?NfPjF2G)PISG)SpP2?$81 zbR*p@s36@9(y;07?v&VccOzYUb0_D0&;Py08gq^@o-v+hMXTHU zy38N4sJ~k+orGfXFqeaag>Qe7B~bJ$x0iwg2V%Huq`B zQrBdAbtg|#Gj~v+R9)%IP24sEzv=46bKQhPuN*TF#q6;Xn};|MR#5&AfBbLif_r=4 z%H^QeYQ?s-Ec3!EXEeuM`D0AvZK%oJfA6tG{T)STgNA0q#5GVX1kXc~@eV#O-=n@L4!d`4x%ihSO=hmxXu%hY=h$qwJt==Z>w_hz zgW8?-X+6QpWb9eb`#})gZxGM{rg2fu;-CS*kgpE|_=;{81rXr)@#ag9Vnz;xPilBq z)0ffqS&@oHv#GGQ_rF-IaUA^5`*#VWR3Wb=v+}$vB{8XJb>!?_@w{OMjHXJ9+?>q5 zzI%k^t-Sw&Lqpp5k1!u07il_Q;BmDX>|epJ_BBWn(C}V@Oa+R*EzuY!9a4ZXRR9~2 zzCv+W%efn#BEx+ql6TWrItZHe$!*f(_19us3s#OmkY%T&;Zm<<8T_AwxHH+-Uw*-G z&S~wG4O<%YTXmn59{|cpbvPtz;w$!kb*w?$&qUYj=i&#e8q@YI-9FbBlFZegr}IGi z(O^pxt>IMevecdBcIdJiXhIu;XTYm&znP()%=)uF(Rk z7z7IS6+xt*92JNKD}>g5a*ix=AH82X89_;ms8-T2+z6~Z=RBD*u{m2WAI~*O_A|{5 zVr?MVR@Ag|sx&Xm&kg$cZ`AmjK?n;n8vp)LlU&NH(sBBqHHWghB_o&?UKeZSb8qD@ z>l9cU594ZAq0?@jrWGoN#VMVIue)B2q5XIo^P>dDsaA`pq&zTq&UG@{xK;rw_6gH2 zjd$HJbF0@9T6f{&i5h2nv)8|p-A`i&UF@bw9WI)p5#Q}%Hx0Lw!N!;O4)Y3rjl-71 z0%{|bRDaU(?z3;EN4<1UN7lDE{WfIRWKla|_66TjJX#cf5>vaBYYNNMkAkPExs55z zg4V!I7dv_c*sjCuE}8p^mUMl$>Wk?`Li`o^XR`dG>^=*wrw<-|=-n>Pd~3AU)f&tT zt(DTPt~kDCS4+VuBLJI1ockqvU`V?+H3r1bsa0gWBGO0gGEuO%l6ye! zX)1ddOqA|jrgB}>NqvmB=FG3?NuB{Q=aS!?ZNNSa-r1o^fXe;WljEF}ezzOfCVEPz z8bB-Fu}C`^x7kWm$a{G(M5WkycMq)8UXo18i0y*X3N^!gju)@@UZ9Mr{Ot4QnmDK% z6b(KVWhkujc+;Tp(Q||KQy4I)lB#+d2x6wt|th&vBif#5h8A?%^?AZ&G(N2LBuGR-^ zReMlemH{lqJh_vpt2U-iWuYRQ^#ORIG3}XBe$C{U-@vk_&!B>1`pU5f_kcf%q>{_nmF`_oTT`v;F*F*nrQS z^?LUAc`thhVz1sA?!0uwxb9zjE;pfN(oP+xleLwr4RKVHil$z76q!j+fA^^eSNE^U zfsE44P2eO-+}|2XyNM`Ok3^t;=(sp*yigj4WK;M*q2Lk6^ye|0 zwbK|^=;K+xV<3$5odWSmM`B~cFp2X_cpZUCVl1o-rZB6cF{$5f+;UJF!tA048 zFa;$N9F}|&SD96(OT=lWJyotYyHh>Qk|`ce>qI__!8NPXaAAh5wo_CNa{`+S(KjO*5A`>hYn%Dmv`0p_h(svN@Z2cnsedg@}?*ov)$=EC+ z|NqH`ZQ3`W|3|xET(ZYSd%9e?Sn!WOn53r=-otFA z!5IB$l@4~3_w(!;sb0oa*VYO{xrZE-vWQSatwF9Md?p5RQVH+>S@Qpk+Ac(>ls53) zwjv|6IZBj^=Q$$u``~)qe#6aAQvKe{K&kK!j6RTe=x&L7Qw#sW?7fh1#Z(B&$lWj7 zna(YWV~=(n_QZ&}AeK}4Q%|r(6YnGRs%bJ;?!3s{?dgB#bJ_}bHtYaaCcAX5RmOX z45!u=Swk&`YZ63Qf0b<2d2*aA50aEgn?iSkl$ZEre1EqEu#HeB3CY>wB0<`cb4e)v zZy);K+w)LFysxY#bjatV6cYSDj6W1=$_=xj zpeL23;WobahXYWb{O1Bli4i1de;9vwA4jMOZ8&?u8a#;i{T!lyIH14YtJh~7F@Fnh zWW`r9LlUG=Ak?INtJ^nHputxhf9?j^!KS**6T-U*iZi0O6D|=s|KnKeV~8Y$f6NuUkX$b z)|u9U^wx`dmorYRmj|9s`}Jpi0G~1e9@&U<=F{tu3`qi;o#M_lrq_g;9xyvLAi8z5 z20&2|jm%#k_OfOI%1);FbcI3XtUcS^dk;RfC~NxSg^24+0+k>m0obv8<@jihyi@=_ zvyNnln8Rj9bPYUeXe}J6GQVP~=K;_TfB>Y*-L506XZ)9*q*NUH^IL+^)iwZwCIR>1 zNhxTouU`Yuz5O)&V$dUw)P92UMY7gpp_ZTx;6v9G?l)W&@F`ta=m>bgFAR_7Z{Xw4 z#WLj9Ze@Ig+l`U|@v8X*=uCM45t!QQjUNHlQAdE65HIX=FBTMYCf~)rXlGI_>)IVD z(U&X*ZO^fQ=@So_Nh}o!x3U0z$%2h(-;zn+KsVV}(QAR4@Fe6EpGidPw)-Zmx&n2p9MBdiP#^r59rSK3UlAH6gqG-hFjK*$ zlYTb_WI4+O(&+JjM|gG4c`3t4k;zhb(9&fM zd5>FL$lB^b=6cXfpJ=#f3kaE+y-q+Hqcz^tbstdVcyEASimBP4LpvZBM{P}&oA&tg zZXVu}8(bY6E^G$?4ZC3z1}olD?~c4BNJZeqnCxu#9wgt=>UNwA^UJNHQcEBT8YaW( z;?;5O_P;G_1@V;O8u99s7;C%_Io1qg*jNJR+9p8KNkWCIn#gB?hFLq1Tu>kl1N2&J zY0iGk&yWL@HFb>UZuC1B_mu%lzAR6zCAvI8-04@R>iZ1Lmj_L@wYP$25c4gdoWrYi zb-F7LMP$;?kC21DVBi3nYNHBD8j&T6%A3xR3>jz%+U!9Gv1NLcib1R`jMv`dfvo;4 zkQ$&jO6i=GwwO^g&gXg7+QaPbi zqM4kNdf~P_P#hM0=A;)rs>6s-K&c4>UH^f@=7;Ow1kkaIZYdh0CVBZ$ES;(v8JDNK z@x#AduYYwCc0PtbX@JL-D!S*$roH8XLj&3L^Oxj6i-48{#C3WA@aR5aZ|-Y0l|-2m zUXwemgaVXyCT!TLx&@7~s$_IshX3S)vljkuE@TuBF>+X{rym6&PwdAR5^FK%5T@-s z%GZABklJXq%5-EVRtDwh@?-7k4!s^HJpwIPtINlFQZ`T(!wg8gin9g_f+SRF?vSx( zO3b?#NNz3n+_uhBO&|RfCC@;nMn#2kFuh1_L$$P{T3iI?5YVU8C86SL-f*#2;3gc9 zYlaB*Mn)fgHPypdnBWYwP^j`st(u0PL_r)tEjRqTt1yD(l5R!%X`<6w>?Zs%_b2VQ zQ1ISWDkaA8zeScnYe93aJap`5ey>tf9KVab#P}B^T4Fk8nqrpu^dn=?VsC%7rS1qM zv#1>KxW4IVwmAdZG}Vz4g5)dH3cXpC5x{Fmo-8RQ`{!0IGzNC^+^~Y2526zjujz^B zyHz|KA8DE?hapDY`{kYj?_(QGpRLiuh-ADKVWUU2;xtg|=_t0IG-t}Nb*e^U8cVIw z$7Zux>+9Om<6oVoGtK(MyOo_btS{E*FIlp5s1MuLy7BLg8|PHv$*GG}RHYv)H5{~^ zoP5LnEuz7_TD^ltMd70EV`Zl+GE*cgV;LqXZ&it2DBe3s)uu50@Ib!E6070i{@cc5 z_31;rq7~<-EI1F$`-*LOE|@0HHH&wE#g)l6~*vLk{$GhjeLj9kewPci?8|3}h) zdM~eB+V}Lc=`-((ni!~lx*|hxrMW4~+ws-7m9m~Lb`Io5@q+TS1{v{JUOYo78Ul7y z#1cgLL-T`qbpEYlp2{EtTtzfALgS0LUe<62|F&RqnGL6Sj+*dz!v8zWMz=~l=y}tkr9Zf8Go{K=FvjfZo`$aJz*$_MH0dJ?fGj!IXX|mIWLa4B|x;A zspwW^scd@Y;}=pzpA|b!i!cKDmEmaSZUw2kwyTkLAz?F9*9|3I4D5JMw4J!}Z+Wby z960K(E}-c-JX8i>(>*@%W6zkGmvE;xbpoHCsU?!I*Fz* zkzmWbOP=I(WlifVVnFzLd-@6)qW!(d>1ZvZH`f$Vu~4&~q_v1fp1VTn^3GlKEjCte zi90N!JxWa_r9?IMjBBK*znQKE)qANLarzzbE`2qP=7IU_;wM~43#YkV0(UG&v>?e8 z+Acn{)Up068Mxy3UOL9iP0opG8PMkvq^8v;)c6n~Pd-b!fJ{ZFord+1*jLod6v+jk zw23|QVYGzXe-;R<#roTb9v2v)4eicOSfeU~kRpLk@g(3dDhv&;i27mf9H;q|-UqdD zBqo(No7|YZ8x#Zt@74pCD(Ho3bX3LP_1Tkkp~+rtSvGkh5R&-AmIiyP9xGG5{Vq06 zOy`e3eecxgp9#DvT6{!`MblDz1nC)&t&-3ozDk#Xu)*@(2wU4#Dbbdvd1E53oG z4l~cGrWcxhGzifsG>wXmULi5DmeG?btA`ytS)^pLMb?#AjdNouxL)9_-fO2p#y)HD z^`5wjkObKZGi%Cc4N5n{3wQh{Kpd|+c=eIJ2*eaIDp^lETEkwvR>?UNF0T{yChb!g zN9rITIgEeiA~=~%MzO|7WH*+(lv(%H`O)34WS1-De?|++KL0SZgLSHu_fO&$a$*`y z?!T71eNBc~_{teW=(}oPJu@^`_p+Lc?{yQEH69O38W+F9SG5w4daXGTA|m^&o2a)l zih&*ao)S^ax3M`tW=%5?GG0HF2GKZW`&%@WIAj&ErRx+*eS4V_` z2xk9OUJW#|EgrkKGp*nhjTR8H8Kl1rCQG!(j=Y)yQ5Rco9xyhbiZJrP?xp{3hRS_A z2rs@z(pM|TwWbB93lM1X`MfUHs`JdaT!K3vZ+JN>FzNl{B?-N{4}t|0dS4M9Aft77 zDX+OJk3mn5sL0=3=2OWVpXq)bYwD84p{8{G7zhP1*>uxHKPJB0%cNPyU3jW2iKW|) ztDB$k4tV8$@G#~O)1=~3^tj8DZA0c(RTV;F^4`^3-L3B!kCQ?jvJ&lIC?Y)rx>-I~ zeG`w5RzY<1B9YI*p2zGvgRWsxZ(OZN0Dec!OCm;XLcX+*P*)IoazGEemC>1Wbu}`M zR1kWVdkN0m;MW%&1Mi~eGLg+oOXu_>?mGo117_vLHxgTy%$n z1s@oQ9?2r-1XK^LZDy=GGscaZ$%CWF-Hv5TZ$%5Ao0dFp>HCa|J9AoXvrfb)RHJW- zN=I4S;SSYdaAO&rIKM*MUNgyj7pnttNr`>wWL;rqFp$90p}Lb%sdlDh(}pdY-e@Yk zF4h@D+7Ddnj8oRpARVK2>}xFkQMd9^gSfkx+)dzK6(8A}cPSH||1fRyukqsO&|u@; zH+%0`3aJ13W+TqqekNu+Y?X7Wy0KULje^UMU)V38|HFhs91-nbJk!-xB;LNjb%8+B zdPsm0g8}fgLH(8KoQmNVa>LJ+e2A1Kh;zlokMTvSy{k}y$I&$Cs~=8D+j^9Ah3PA* zhcU{3!6a38XXF$yP^cr*GN8=092yo8hAxLyHua4AzQ^ZkwrxfxNT1GDL1?8n!dne) z_fYj>N#H-N#WRy*EUYWZV`X^eUR01xv3IK*Z9y=-$l@3uTf8HeH)zsmUD|ypAukl|Phd9} zs^ZzUro>m~RIUp}bOXw}M8qNdrm-akVeP>j<+e}*fi%ci+q=!wFJv#kWxvd?2$(Ne z=xWfgLA$+s(0JeC8vw}!y^e}1){>+!yhw<@UOsMxbC15)2?$Jiw<*Rb88d-`ZifOv zEwhoA-2l%zw|g_GUSMShktw%i!@}i(HSl`2Os8wuEOVfZjdl(AN=UIl)e|jrCKY4) z!eJ0k>I8uZM*I1u{&teFnHksFY)AbIuu$vOF!wBHP5Xg7@yM0Y$Dcn$2ArQ)4R_?f zD1pkAASx=NGXX;c(H~!xX~$vPH(aSoi`f}omDuj7@BajLuANZzO51Wddl~0nD{JFX zMUS-zjHOfK>w0B)TFm*kC#lmTTUPFw7pFgZpy6}`lQ&CMZ|-;V^;OnZ;o=>?=Vl-o zC-PJ6{5vThCzaYzZg&lZfm!cqdz^L+FM4rP$&zwhq;l^P?e)6hhesnI*zPp1MAWV! zM621?4N7#`tKK}ZLPvYaf=;&W92E*Cio^Z-{JXiYE9&VOP#%r3QSxx#dfba=)0bQu z_wgBv@e2fxh9E*VT2m;nLDoc>QnO1vGt}-9OEtaM~^w9~=1f)jkle0d2wDc-ldzVO$6{t8GE42i2 zPCeyk{8+_+vEug3j9869Uzc7Vc2wGsa}6l9tm+?D&QhL+_4>YN@nTS0lBr17KGJ-1 z9}TC+GT%Thkch*2x)NwVn~CT_Sl>1c2ewtFhR9Ug-wQAIw_g2f8bN{6m$y5o|5G&z znJc4*MjLtd(CjVeZM!*tO@>N)C&QR)(I@sM`)0+UJ1e;{$!;`be~^WxeW?T`@_BNIZ#MzMX-lnd() z{Y$Hc7nFac9M7s<0M;B=SP@g?wKlI3gh@qE9P%Fi8k2{*r0$>x1e=SkUusMAKb`>g z=H~$Gd2`QNTbKN8^}v^$Ar8*97(tr4E{-D45u-4^Cd=_H!Oc7mZ22I)F}=h=c6i^z zGbWFg!nTfKdb7A}B~ifV-%NQP7myKCJWC5YAXq&qy;eCJIavGANbp2kWn5?+YQH;` zVHR@P#hb5Y9H+*OANz)P@VEt?_4|xqRS9@hjF9AlGY}D>DmK6P$4+@bM@NAz=`ogY zo9O%E{-2x2vn7qt4~B$BxDrmPqgGBD5Oc*;{K|S&F6wczD!y?a9Z}W=1UQqA6^s#R zB;JSMg(V{YEWg!7`JOvaZOCCX)U>JsA`f{^=m$N4{6|!*Ex=M@%A1<}Qn(`n!x8ri zE2c~e@_}QqkbvsTitoj7+K2ZV>Y8V?AZ+#0Xy;h4qS2o>z9}{9?)YxK8+u32(4j9X zf8oUUzH%`Csd5d5EWR$z^z>7-Yl|^PS7X3z{uoE%$*}lcP)c^r~hL zl#4Ydslu6(T#0EI)PYn@j`2ulbsY{Fb;PVyCn>$k-npx+ckFqW)WE$q832v3mK2yV z9$^=i?F0Rg1Ph-wcH(P34#NQwB}iKkK-D-`b$xR3OP-=-S)(bBWXZ@3hSAvrs^}*j zx**OW4_?ezbq)`p+x#iqAFc`FG>N(eS}(;XQE%uoCQA*o?15G@`!wiLIlXvnx#dtz>Ad*iVuu=KQD?@1RXa!X2HNJ);|9JthQk2kG4z=gjcS$n z4f_~-ml9_iF30`RO98EZsNn)l8GNf6^qFwi zsX_PMAF>EDDKUI#isLYi3TR$MxxgXNBVE&=EQePu2lWz-^j5ClQv9u&TzM|dpb!;R z$iX%qTkn9*x*%)hoe-|?#z(oxjH=p zfXU@wtUL2@P^^Y}k$BTjL7O*6hlOhcb_M}0l5nR?-?g*3z zFxYqM>Tyk%YT9M=Aj{-m<_mZ{d@*A&?G+0d^s5gNu}1yCXMSa2>Afsto16s zBM=YE&>-?LR~S0wc4)9hS2hWT6zCbR>Ly*BZd^~AmG;ZUA(SLUDdo!Nyho6{61zYA zAQo$->g4)U;`h0#5NXSoEFCj6ZdRn{i z12{kqBu?sPJZ7JNOLqGILI-{2`FG7w-0e7}VCQV(r_!bs1*M%K>3(YH#JVCpx`tb9 ziWE<`h9E;a5dG*YHT_71+u%8{e4{6ii7}Iq*r7*xk+$%9wd)vAIpcr|f0r_WsO~IU zAf9fItl3X}FbP~8H7$hOuZ+x?=ymg<{w#SF4rTZs-(H)UG3p}E{>UAHGjyuj5Sp5A zTsCHVPyC*1BBD}@a0xd_EOd8M{)TY=r;LGp3!@zUe}<{Q$3*|<2K1kKrO;OB<_U=i z%En1xzx(e4ypXW}1Il|#OJE}ZdmQ0D5-No@vhjycJfJur{P_dMKb+cMp`p;L+o@g`OX}88x3$+HN#1j~nU@Rz;ayu%2R9GSTA@_&#bH965HprDuRT>);u{5ej zmKPPRjRF+&%XWT|9?rP^szDVFzCC6L@xQGXSa*mc$9At1%ZeNhq;Qnu+ruJT3O0dc z(}pX!C^N4^3vD2A%xbinU(;UD{hQw~;@jyEdx3y#cC(nJ)#tsB&sQl-YP#%qB2}xP zM!i&oOQoH|RY#-v#M#g1Z!7vop;-hJyjCLxuiv05^FD2FyR=`_DK+{PyaotV&lNrY zT$O%<`&(IDI5F4>Zx7Ojs=Ro2h3}s(@ZG=pStIj#nG5P?Ll!fsN-s z;_v@jc!~uW&7FpcZvUYG>?yPaRzFQc0FTfgUJS+iN-#RM3r{=w)0HWHfklfm-~Pt} z@Wbp|P;1Nn=BM+Yt_)J``^w+;bub_P`=uh>A2kP~cC|M~{C}Dbv6o!mEE6 z!GEU4t40dItQKeF`CtCDwS1%V^o%@bS-bPcmvH-fPh4*5uX{|_ws~xHTx=4{$6uJ{ zPf~Kq@NhN&E`Y(QVRHNlRHM_@sPQe2|Mf`JbN#K_HF5`7uUY+AlmYS8c%4(JfARU| zdU8LY1eqB0!~1{_d|9d!j@Or)2hriRS09Ab4NDa7I$wXw>RTdr&ki+g$BVDBc`*;; zn%2`T?O|XXe@a)iv}`=me?{(Uq*`WV0k}5-3z;QM9%r*pj{0l{<8NU59tIby+wmF> za7p1+aBq)X+*}Q|#_|m9=ZsNCQiOdbz#$8im2S1>6`WG>1shQw7pnwE2Wi3a9~ks2 zW^~v_a`k&BUX;nYowi7_*1Fd2)rFg19a=c8K_=IB>E-*;0*T{E9VQ0yk8T=n+>4!- za)4B3m&=`d0pX59H~4unx+Xc-|7=XM&B zZQL!>mb;@sxA00^W?Jye8C1SSSN9v1tfU>J_=D4hv#ULirt70UmjutLQqi-8%&=$< zvHI&=(~-_62o~2H*vOGCs~qF8>spT8yQN23_UxUodD-GCa*xAJi!0yy0WMQ}qvQcT z$BFxF=9hE^mM(#$7KP>NoAWmph1;)DJzG(*#0)*QVh#K4xMs{$D>cU+kWR4HYocqp z!OAx$`D`@a-n$Z6>aS2#=R5F(y-Rx=*b+Z`rp<%f8T5h?GQKASDgE7PwHSKPZ z4|z<^L%NPy)>+p|V|b|#)ZNE8)>?xFq?PESCf|(l!L6d5HbOfSCSvEBSvGiiK)<^U z8i$tKNqO~U4Y9c!IkJNcYh|%p<`o3VUvBueYyLB4Vl>W1OHMH!7uJLaIh~FHZr?Qr z(cHMlpdGN2SKbHDMadT(0TIMABv|whL;QUdR+PqE~l-TusRa%n&iE$YR-) ziMiBSX^nDd<#{w_#_0{{KR4EN+qEkN5PQ5hZin92On41eCEvLQ>pN+|)pVM}B}Qe| z-v8UoDRRIb?Y=+BR-0&w?{-r^savU0g84)ryByH%#xJXZ(;;iaWv%Y3gRiM=wlL6W zi;E3uYl$mTZ5LJ+T#ckC-R-WNOIoTZHy`OZ-kYQvmTSeb&}Saav@?y?x@jo>0kt*N zcrmSNXS`4cv!9N^y>U0gC~n!;qDPQa#6O$knnV>c$wC5z)AQj72JLRNyzz^5<$%EQ z;dd?QlSmLza*yE|vwTK9n&$>9MMQlqtH(8;JTI1dS^Jw&$h6@#^8%aw?iBHoO;f9^ ze6h69EopIl?Go?UUz_htL%F8&!|{~I*<{#wv06YrV>P8eB8u)=GW5KXN*w(DV&3Y2*rg4Zu`Ys+MVndPZvO^mMKbsh+fq`JbA`| zeMnOqg`Y^+5%fNVM*9kD4d7?}_o19j=eG z*1S;2Ijtl44vPi`_+>k1Y}@hrt9}w7=M7fxpln&kkKQRh$<2%Lf?bX-Y@zqiYKzxx zxX&R=zXN?4rHR=aXQ&3rzQ_`<#g1 zA0OX*_Yzu#0t%Vkc&dt8CTUFEmUXL~>r;*`R-Nh7>RYc;?YfwqK^t?8$?ECk#lqeG zSi`eV^Ix!v@s&?`F=!(_gp=XY5s@6SL;W9KbsvP{YzS~#Z|~W`tD7}uOZGMiPRY&I z+>ZiFp*2nZ3D)Bnne71{&&KB+OP#uFPI_9_>TGK8Xbv^3H}TfS0HJgJZM3}13pKL_ zl_DaC2Ur5v+0`SOcO`gFK?$3YD!5^#=Bj3y?qVniCt)SGBX_I!E@-L1Y-07Q;5nabaP{PS3v&p z=d10L5Ee!fj3jRsVSv;42c#{JdP+lybLrIN=91knyV=bqC`iAov$@P1HNZIYhzAm? zZ4x8DF10(3)0QjkMxFTd^h6yWz(JpWpF>GSkuB>5!^Qr$&&xt5!|cT_bW=-7Q#R5{YT`WXVTIsU7vD`zIFkcPebi@-sr5 zT8rX3ec8pheLxPtOfSc7=Z2IJ@}w2-dHlmQhx0*?eJ+Q2o5D%+@x=ZHmtEt5-O1_p z?YL+5dXqY6c&eSHgZ0`L)iBJXGuMgyI)#gfWh(b?+mSDx>a`1FtV+R-MyFb$grx6XXSHN#O!^yPE7K5I(NbZ=KE8 zi>oQm97eIf@Sx9qBD>K*gz7OaZ8h+G?CTIoQtM90vh8t%kJSH>+ANkX= zU4Mtp*oL_?&9_}Ya)jX?m3MOzpEExIzWPB6Bi`8lR=ekx0BIIjiM^sw0XHP6rZ*kBRudo6us7?%;1Ysf4fU$xfbZ@UIj zVTsb3u>P=fT$@?;ws!1Dz@A@MtO@?BGkGQevwo#3>c><%Y?WxPL?8W3{lnJ2V?~Y1 z-$A#K{(WkRrs2CYQe5+E_d3b4kbIYeVS?M7!!yUk+-+qhW5eG`I43OaldTuSIKGlK z-NUK^{RqWc$J!i@=VECK#o#ODo9D|f{D)sFk`pJ3<0CF|9fH0U{zr^tGS7m(&zL<5 zIqz!43Vd*XulFUq>V_?ln1i!&&MM2sQZ}vS`TGy>e244S>WquGjL(Yh5n0MObAXHblEP@o!uPRpRF`P*seoo zv2~*s7H)a<;jq962V3+3aRixB4u(m-T`gzFvvBsQklQ2C$_8^dwF$@o;#2c$Tihu z%fD=Uc17o<=COrNgX&l#y-fRHD4=+H|2oSF-X5J0vTt8@^QiK@)s~()p>%^3&d%Eh zq#H}y^(Utv3>CKb(Rrb+?f@JghHFl*cOL9JR!KMfouR*1LHveYbgXFo74N$%1e^cy zHswBu?d`E-zmQsogyM-rc&?JGU*DaeV>6iGifwFPH?F+gB81BN+D1=3$sQgq{_3K)5e7%m}0bL9Nn!X8RD=5*5gK z6$it6wojYpMc$W}%52u;(>B4g!zYn0!ioY!kB#3}ee}7itz2tI0}9?)Gt8-Pe&zfK z8{oqjg5510OcO4?*EwxbABoPrJ8pP2+6rfdKGCB$ZN_t#Paa%=Vztq9JY6WNM3Q&A z*x8>}AO8TQm6&X(oL9~aIZ@@N zzf-luZ~Txpl=0>E#~GoDhl}Fl3F@&N3%q%~#%~o}1Xk68mf#P_IENF@aCbdbS}OJj zF?j9R*OT0$SW7krtw*uxw8b5_><2Ci+|c~VX(UY2Xo-f3#UDjqCCm5+)8sMGp!R68 zA5EtTz=ZhJJWsOSY_TG_Q+0m^Aj}fm(46GMZG-#x2E6z9Z z%s)kO3A-4SmUP`tPv}khdDdj?d0kh(F zUz&sma%@OXH-HGsckUydtpswUZ3`%dDsSI()9#K=vDRB7^GCQE=nX9sl005O3EZ< z{R^<-B7vyCVT$aRUT^LzJD-!X!FA3K(zt?Wclt!;?A}|R6x74to<*rwo!rTO%-Ou6 zQK+}ZQtH6!eetqnCG;eO><5|@2yec+VO2AY3N+obJ z2Bxjyl|s{HM3KLeA3qa4557S=bHpN6I)lNH67e-V{mbT;-Mi=Jr@OhCBIJ7cGsm7P zd+A>m;P#y2^`V%m@exn7FO&sM^6s_rdU$uEqZ640))%Zm zrPkaFcH&zg<0!axk5l%Qh``m=Tc_qU&gF_W3=22D5;s2(t13jI7k&QxG$5WELDKGN zNG)W8bKVx$#voeW^uu<$0rI%wgOX1S(V+U`a#HTKWbSFDve1n)NavBX>5_n+Dj2nJ zk`p`Oe7dO=;Tu{gc&-w}3rZ;DmhbE|-MbwPL-8T=tXJpOL_3(}_(1{}lh|pW)swSG zlKu1PB%jl$U|(D%s>!xB{$-jkT{YS`gzuhA#rY166FUUX8!)@l^cWdveM7715V%=F zZ_LBhrV%1>a$NWJg#i03MvO`lXE$yh8=qUyyqD;Fh#G1Uws|*5`Ji#~vVU}^WbROY z@M*NBRV3~%&G+sfs?V?MBpdheUVjO;hN{jEyqxuyBG!-4+}ST92sl<7pKIXWo;&HY zHM+w}Bry}_o4VKP?DrlgpcXO#u~A}0@?q_BZEX{Ws-tnGd}DI0Iym~&c62aTrzX0lFJ#Al~IuQF+z7w2?>&TQ<4_y5*TJ#`Ubt)lmVV71A-V8rl(0^NUOh~EfRMrliAOQotO(` zeS}vTvpi|GB~(;QI6t(1IHV^>kQ`r~gxX0Lj}P$I=G9|D&uaNTs#>LCRu*u(?3ar= zyQQM9=2A&F9a{OY*G{)XBVVWu@7Ot8r3#laExR6$>zSh!<@RDt+0Cij|EeNV3~%7S za9{f?Kd}>U3cGW3$XH0I(dr*eE2{@Pfm#*7FY`wsxe}N8=U2s|qHs<9Wz_-rplH)D zoA5J()IC_T8n)`I5mi(BPiML?fk$!Imi8ZJ>K*2bneCv>6M0H;i&-9EOf%hIj?){@YtJ36O1?_RNN_d3tk*VnsuoX4}72KdDl zH9sPl0$^=GirK%Abz^K?lPh{6<~dsSOy!v+%PV)aoMh*aT|Vuv%RGA8^A99*`*$9`^kf=lSe2i9AJjny2+Dw5qqh;ug6kWMy9|*XZte&)CysOO`#5ZdmlmV6>0YG4c&((q3)A zk35}qDSR;ApZ(H3F*xxt{?N5O>2lZ4#%~YY6K^6?D7VwJ566v)$EzAy7&y>B9w?WQ zI0U*lFt3jEQo<|>b?DH4iJz5Eo-hW3I}{7xeKM@T(^US(LcZ!}ZAjz{M% zOvlt^p5pIv;QM+c97^q55u&#icTsj4EdzzUME6C$a(lI}V|ZLr%%Tb9qj2#v;l;To zFgMPBP37ba2$aQ+y!J6o@T9>uzC0#0I9*SU=doGit)!~1r59#R~Is0|nbC(w>i66`6m@^(DNMfa}Pc$dX zB^*2|U^~|+4ta#zopsRX;a)GWOs38uIU86xvt=-bzLzGfzOA5CUWz20|2(BvA+y4C z$iqJosu^YAPls#YdTe*GPzWpo{f>ZE!C>~6J@qTS={*fPJfBRhWb_wIGG#L0t@czc zuBip;?Cn%v6q=1Hil zKX3F9(23jcJ(%8eor<+g;@f6y5wKh>IMn4Bq}uofgE${DLP7Wi~N)+3^G|d zYe0TIx88qNnqUWtq9tE$D#UBrFGA`&belQ+_Y-{e#3e*Gbzdf>C;Q~$W^H^4x zJ*uStCc!(LAM8#1t8L5u71L&TGZA(?jxxd4%hm;Y$v4>J;>gB|a@8un%sXZMT4|~* zYeZ+`BAn=tBe&%L%u*>hM4Ea*$`!vB?gBWXhJBS`L1#Em^A;iCPj$Ofl> zZ}uF#uAgS|aX7UTj&GND9`F&BU8PSpJ<6kJ(0BPXMtqY>^_DMGoDFlg3TFSdlp}vM zH-k9+BBxue!e|lEAEkFd(csx&6J_h}yZ6Zk%7sXkrju&gpOGO-nr{6yuIj4>f;-qT z*i3beHx0RV1ivh0VKq7eClrM_n;ZcN>SAg4_Tt>c#QUgwo`#rx@~d>+iY)hp+++7W zuaYIGMlmKQra$N8QjV&8@L(_uzYkYE$|Y*4Iv-kL9(a1uY%YNRq4@=@1PKA-{%Qra zWP8<0eh_DQ@o0^oPEPx-Qdh+kP7$^A@g`T73jg_4GisKt6^w=vwLQH%$`w)y3P^oB z4cjaOZjLi;;sfQz=L-mv_Ka!|ASq%Tu3dKsh9;DVX7KUaU^ze*5Fm-AgJf6qKW%2R z7dbx9O(gDgSVM1j(aIkno~yH&XVZqP zBLHWHEgHHG#PW^TYll2$MrYb5OU#oZ^qpYUtipf?^)g6W-7Wotact8NAD@>n7Jf^7 zGAZ~>6mU~sUe#S(L?`zf#G5T4`G1P;;!XQP`fxMVc=+>kjwN*8qc4rU^|CsCGlJ}; z^UoMxZ6cU-c{W&7WPE~~VHLy$ivB94{@O)K$#mxyXEIny@0BV>ga&fW8?0JO^@FLXtT0$AecP_6zJt2Yq=|se&q%NuO``6|;xpXbjm7E*3BEEB z#FWS>k7KH;#=2Cx_L!zXSe2Zz>_4jFI<~tZXTq8oLwT7 zfWWG8x!FzS@207g!`lGlqSB@%XL5HX3HzPDRZ4U8J$_llDDoLoKcRX;EIRVhnwW)U z0nb`8ZhefDFUtH?+X$Lgp)139(vxKBF!xCvHzx!J65O||hKy{=l^%?Rj|r@|hhA$u z<3B&3T07k|=pZ3oDAFBP2;}KGlB?)EuUg{b%=tg9hvR@>OWS2F&F^0x6 zS&}FkV<`KUC1fy{vCEpRY%_LcU&lHIqkK=_Z}s@z`?!C>_i=wc=ZAC7=e$4L>-~Ja zKflcJ6<~BXqU7fTNv+@Fw!JeiC|C<7czV(m#~gxJqYzSA zQd&5Y%`eOA55EL4nRw zj>7>L(QFC0(vtAZ1^OOJ?37Ll3>2}H%$DGrrYD`Kq;2c2aAB;Q_OsCt0nHJ*q9WI3 ztcBrz^GbcH%GA9>R$p9Di)GmK2L4Tuas9Gk(8Hz-nAjnG)}X86u;xg(3SJ#5`l`+l zhms%D*5(qal|io`C!lnAPG2Ux-(4Lb^^ie*YSeizbbcm{IPYhdAhmWH79nC?xeLlY z>H>bPtH-($LN-#6Ph3KiKY2=0jN1`Mk6i}sejjKk5ve%Cc<04R?f9AwHTk3+pM@;L znelb!z1rTP*EVv&BU1{4f}Ew&P3q$<*Me1)f66^)=mCN%d~1?+`9d8l$=sK4#{FYK zJgZxE?Xzc;w1B-A?G_uxtn}Fo5YK?jpmUKoj`OlgNXG>oj4Y(AWHP;M=Z95{1mvkW ziW=1wZokh<$J1$1uOQcOHPBq6+l|c1x4I^Z5e;Tvzvcyg-VhneuLn zQHiy2B>7*O7oo7Y3%}azBhwwdqhWC4{j?e~{A^oH2TdM~;0L6DRN#Ee;VCnE9baXj zHJ>^98XbIUjvXgJ=q~GXZG<-L_9;P$E*9lG~~ zlF(_gHC>9OgsM>w^izol@?bTo3$5kR?el?HH?6p0$A7M(78u_s$mlEL>syJbMc~z5 zM-zpvbh0?h`CzBlwcF3}O!Y$(v4fA(lzIy|js=Fxeu&HFDVl5Yh9R-<-UxG6P7dE0s;X~!!<08bsRVSvz*Wyc8N zk5z%TPOduA%%$SQmU2T&_;dWv*G8dbJUPgzv@&69a!YRIGH;yF!0Jy?nKD;X;?1{m54t=ZbH7LbH4 zr-)2ma~~aKmGB$4Re%B6=MRL@19vyOEa7HtLiNz zG0hqlTnsahqA&aXA%!B_Z?ZUk2msTmb1BxKO%1GrEenS`HB2qa+6gY#vwmkI@BEzy zfCvya%NN)~k$pXe1;X~d5SQ`ruV!SexF@948+pgT;UPw5;_oG{+AxOUw zO$jaH$(k06=<2WQZ1?C|7(Vgde&p3!jpdI)^HhGPOBPrxtOayk_ ziM8=svQ;wi%>jfreXgp_B!h`|RJB6(9XU`M2r^lSGjM&2$HI$OIYBlO1+ErfgjbyO z6ti*?xj7{qN2e^^qtEVq@ooviW*-4Nl|lVf)219`vBBtNS<+hNSlipq6{#^8%1=Ta zm|j}{GZX7@l(x98hDT5Q{_a7#otca$aj`Mv(10^-d{pmS^E9 zCwHl$e;o(WW@q4KgOch>CgAXwzaGtFmUHWpl0Cr3fF%}TUdzsA#M7lX#EuR3x%FEP z0l$e{91tTnnMgc*O3i&)bl9l1rZ~*BVAXzRk!w9~nCI@-y+KDaxy8@k)pM_96ZlEy zAIz>Sy5|c71J+uxo5%Ab1p=h+$BDiq`IVaniWFZ~i3=Vd`+Vetgq;z4{+-vVhBEYt(()g!-Gp9ok@q)q zvp;KyK>+wt3QIpuQ_!WXXO9;mHMWIjFEy@Y>n@oKWPn&2Eu>A2MLpxxXp0pvY*tfu zU^D_e?^6b$2`vgIpZLHqLwO9(-9X7e?eyx|Gi6eXAXY&%@7_dl%-%voa1>7+vduiv zg*uuq4CtM3@O(-OPirHf4k@%c8GUpTU(k^!*++oA`=_Mvv5tk~!DH?g-3@`A?@eOK z`)s4M$!I_BTm0z;V#ux@Ss0~-pr5$HXIdvYdY(64(0}+TD*eE*%D@cup09YjDI~g< z4LpFZZ<~`40~?#QiE6tI*k9lb^mWI)(pfqRWGKqtUAku#gqMN(4uxM#ZqXOuz&8+E zl}-RUOu?aANFFRoJ(n4z>;h-{KV4%BYgS|Lca5-Os^`@e9@&NkxtHp^C zYJk%@W#hBB!h;%C#IVbXp#O$#_VwGE0z^4iIH!*EA~rV+@@^K*Bcf(lOcmm>&)V)z1u^ z!Zsj}wq(x+OW`z(=Jfrr)jE=ZAGYLG`Mv$XkX-}9FD{Mo;?VX|j{6qBC#n_2ZrLt7 z?F}^BE34@!JD~Gw8SK^lpw#UYuS;~%fTL3+`WVT->>xfn>hdS+Bp3SQdiJV6%m^7| zcCBz!Zsm5+0jm!#Q{*y9UWc_@IV8tzxG`i7Ld8^nfH8!lqzs9R6OBL+-pJ7 zn3iDoq^Sykq)BKbjh|`RMQ>(r`%G=p+JlzGHwv75%in3~N)7g2*C^Dd559*aoau~+ z``Pfb$%+m_&@qZhYwtN8<0C*asW zPtb*!z*j8HZxn&!6y79%W`TM4J<&I{Mur9K?w=pmP#VU&OpI2)>qg+5EA9*sBU_6X z(OcFlGc?hXXQ7eth4H9Z${;0Xp!;>Qn?>rg920hwY9B*YTeL>|a}#~lP4;UqV`AT4 z(haQJ_({Uwu4ER`Xyn{|DYJKAc~sx7l+&@Lqm3&NdAI6tU&h_`_!8RZ>_-TaI;k=u zDvEPFV|=G^X=t@#B@(XO(Zi0Z!5qRmLdh_N@}%i<(T*zx@+X}&@Sba!8NdOrZGIi< zr0a4HsAzbau4L0LA7_9+`*Ag+PU4~s_b`v^D@I?cCE~X+k8%^dZ1V1pwqd^^WJnL) z*yCb{PP1%cLXA(EL$BDiHWxNn1j$kYZISVRV?3Z^#zd;xF&1ro%KY1sUB@2je8cX2 z*>0=+9m0-Mg#eWLUB$neqyCGbv*$|#cXg=8C_i9=@7KSZ5L$o&E>ByVHGZTr{$y+T y=fQuW^Z#k;KR3uf!S$#9LdX1n*_|F8oruMDsIlnv-T(^P9@AFWzg41U6Z&tcf-h|V literal 0 HcmV?d00001 diff --git a/templates/batch-llm/configs/llama-3.1-8b-a10g.yaml b/templates/batch-llm/configs/llama-3.1-8b-a10g.yaml new file mode 100644 index 000000000..f6298d7c7 --- /dev/null +++ b/templates/batch-llm/configs/llama-3.1-8b-a10g.yaml @@ -0,0 +1,19 @@ +model_id: meta-llama/Meta-Llama-3.1-8B-Instruct +llm_engine: vllm +accelerator_type: A10G +engine_kwargs: + tensor_parallel_size: 1 + pipeline_parallel_size: 1 + max_num_seqs: 64 + use_v2_block_manager: True + preemption_mode: "recompute" + block_size: 16 + kv_cache_dtype: "auto" + enforce_eager: False + gpu_memory_utilization: 0.90 + enable_chunked_prefill: False + max_seq_len_to_capture: 32768 +runtime_env: + env_vars: + VLLM_ATTENTION_BACKEND: "FLASH_ATTN" + ENABLE_ANYSCALE_PREFIX_OPTIMIZATIONS: "0" diff --git a/templates/batch-llm/util/utils.py b/templates/batch-llm/util/utils.py index cd838f3e4..513a7669d 100644 --- a/templates/batch-llm/util/utils.py +++ b/templates/batch-llm/util/utils.py @@ -1,49 +1,12 @@ import os -import random import requests -import string import huggingface_hub -from transformers import AutoConfig HF_TOKEN_CACHE_PATH = "/mnt/local_storage/data/cache/huggingface/token" HF_TOKEN_LOCAL_PATH = "huggingface_token.txt" -def generate_output_path(output_path_prefix: str, model_id: str) -> str: - """ - Constructs unique output path to write data out. - """ - username = os.environ.get("ANYSCALE_USERNAME") - if username: - username = username[:5] - else: - username = "".join( - random.choices(string.ascii_lowercase, k=5) - ) - suffix = "".join(random.choices(string.ascii_lowercase, k=5)) - return f"{output_path_prefix}/{model_id}:{username}:{suffix}" - - -def _on_gcp_cloud() -> bool: - """Detects if the cluster is running on GCP.""" - try: - resp = requests.get("http://metadata.google.internal") - except: # noqa: E722 - return False - return resp.headers["Metadata-Flavor"] == "Google" - - -def get_a10g_or_equivalent_accelerator_type() -> str: - """Returns an accelerator type string for an A10G (or equivalent) GPU. - - Equivalence is determined by the amount of GPU memory in this case. - GCP doesn't provide instance types with A10G GPUs, so we request L4 GPUs - instead. - """ - return "L4" if _on_gcp_cloud() else "A10G" - - def prompt_for_hugging_face_token(hf_model: str) -> str: """Prompts the user for Hugging Face token if required by the model. Returns the token as a string. If a token is not required by the model, From bac0d25d2fb87ca6e860cd92876ea295c5acf0b6 Mon Sep 17 00:00:00 2001 From: rickyx Date: Tue, 24 Sep 2024 00:56:50 +0000 Subject: [PATCH 2/6] update readme --- templates/batch-llm/README.ipynb | 1139 +----------------------------- templates/batch-llm/README.md | 371 ++++------ 2 files changed, 126 insertions(+), 1384 deletions(-) diff --git a/templates/batch-llm/README.ipynb b/templates/batch-llm/README.ipynb index c8df2156b..8b05d1e19 100644 --- a/templates/batch-llm/README.ipynb +++ b/templates/batch-llm/README.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -54,17 +54,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Successfully read cached token at huggingface_token.txt.\n" - ] - } - ], + "outputs": [], "source": [ "# Prompts the user for Hugging Face token if required by the model.\n", "from util.utils import prompt_for_hugging_face_token\n", @@ -73,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -91,973 +83,6 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-09-24 00:44:00,222\tINFO worker.py:1601 -- Connecting to existing Ray cluster at address: 10.0.27.195:6379...\n", - "2024-09-24 00:44:00,230\tINFO worker.py:1777 -- Connected to Ray cluster. View the dashboard at \u001b[1m\u001b[32mhttps://session-5abw5nxh2chqdlhxiklnw6cu1k.i.anyscaleuserdata.com \u001b[39m\u001b[22m\n", - "2024-09-24 00:44:00,233\tINFO packaging.py:359 -- Pushing file package 'gcs://_ray_pkg_0fa039546672a8668c01da562dca2994d8a900a9.zip' (0.65MiB) to Ray cluster...\n", - "2024-09-24 00:44:00,240\tINFO packaging.py:372 -- Successfully pushed file package 'gcs://_ray_pkg_0fa039546672a8668c01da562dca2994d8a900a9.zip'.\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "6a2da2d3906046e990a8022911824d7d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Parquet Files Sample 0: 0%| | 0.00/2.00 [00:00 TaskPoolMapOperator[ReadParquet] -> TaskPoolMapOperator[MapBatches(random_sample)->Map(CNNDailySummary.parse_row)] -> LimitOperator[limit=1]\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7c4978315d74428e92e24e8bbd62866f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Running 0: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7bea3d3deeed4aa786d1a04cb1b37873", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- ReadParquet->SplitBlocks(11) 1: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "3ef40f88fa404097ae6a74a4452b61e1", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- MapBatches(random_sample)->Map(CNNDailySummary.parse_row) 2: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "6972c4c396994be48d6a28c919f4c9cc", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- limit=1 3: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-09-24 00:44:06,026\tWARNING progress_bar.py:122 -- Truncating long operator name to 100 characters.To disable this behavior, set `ray.data.DataContext.get_current().DEFAULT_ENABLE_PROGRESS_BAR_NAME_TRUNCATION = False`.\n", - "/home/ray/anaconda3/lib/python3.11/site-packages/rayllm_batch/main.py:59: UserWarning: The dataset must have an 'id' column to support Ray Data checkpoint. Please use the 'generate_id' method to generate the 'id' column.\n", - " ds = self.workload.load_dataset_and_process()\n", - "2024-09-24 00:44:13,738\tINFO streaming_executor.py:108 -- Starting execution of Dataset. Full logs are in /tmp/ray/session_2024-09-24_00-28-42_051202_2516/logs/ray-data\n", - "2024-09-24 00:44:13,739\tINFO streaming_executor.py:109 -- Execution plan of Dataset: InputDataBuffer[Input] -> TaskPoolMapOperator[ReadParquet] -> TaskPoolMapOperator[MapBatches(random_sample)->Map(CNNDailySummary.parse_row)] -> AllToAllOperator[Repartition] -> ActorPoolMapOperator[MapBatches(ChatTemplateTokenizer)]\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "24f6b01339c0487cac8dfe13b6314942", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Running 0: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "def0af2022914ae380cc15c55f119c0e", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- ReadParquet->SplitBlocks(11) 1: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "5bf31b53d17149318a712c3c071788eb", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- MapBatches(random_sample)->Map(CNNDailySummary.parse_row) 2: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7ba421437f154ebe840291ce84921d06", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- Repartition 3: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "770f1adc4d2b48a5abff5304d122aa45", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Split Repartition 4: 0%| | 0.00/1.00 [00:00 AllToAllOperator[Repartition]\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "33a9572a0ef2415ab50552b6e58782da", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Running 0: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "389e955f646348f6bd04fe9bb0c68ef2", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- Repartition 1: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "d3c6cba6ab21436f979350e312c306d6", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Split Repartition 2: 0%| | 0.00/1.00 [00:00 AllToAllOperator[Aggregate] -> LimitOperator[limit=1]\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "af8ab901881c44dba944852dfdf4c242", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Running 0: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "bbd5616aab024236a5956b48944526ac", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- Aggregate 1: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "1afa0b8a5e3549ca99e26e013b084a34", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Sort Sample 2: 0%| | 0.00/1.00 [00:00 AllToAllOperator[Aggregate] -> LimitOperator[limit=1]\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "758f92a707eb4fc4b4ffd834f9b7f225", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Running 0: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "48a99a31d1944cbd82bdf279aa63f6ab", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- Aggregate 1: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7ad0133687b8415d96f7885b849128ea", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Sort Sample 2: 0%| | 0.00/1.00 [00:00 AllToAllOperator[Aggregate] -> LimitOperator[limit=1]\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "06ec4d143bf142cbaf8ffecc6103e7a6", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Running 0: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "d290146e9a974eff9a337a23aa05d512", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- Aggregate 1: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "de254d90f2814caebc9292c6de80d184", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Sort Sample 2: 0%| | 0.00/1.00 [00:00 AllToAllOperator[Aggregate] -> LimitOperator[limit=1]\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b8e7ed02a15b4b1196e8b000bda32b77", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Running 0: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "73441e539cca44abbe689d2f596b1b12", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- Aggregate 1: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b07b21b615d24963b14a168cb93d762b", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Sort Sample 2: 0%| | 0.00/1.00 [00:00 ActorPoolMapOperator[MapBatches(AsyncLLMPredictor)] -> ActorPoolMapOperator[MapBatches(Detokenizer)]\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "a442fdab1fb64a2b9877cb85072aa662", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Running 0: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[36m(_MapWorker pid=29524)\u001b[0m GPU memory used (GB): 0=0.50\n", - "\u001b[36m(_MapWorker pid=29524)\u001b[0m Done waiting for free GPU memory on devices [0] (0.98 GB) 0.01 s\n", - "\u001b[36m(_MapWorker pid=29524)\u001b[0m Max pending requests is set to 71\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[36m(_MapWorker pid=29524)\u001b[0m INFO 09-24 00:44:25 llm_engine.py:223] Initializing an LLM engine (v0.6.1.post1) with config: model='meta-llama/Meta-Llama-3.1-8B-Instruct', speculative_config=None, tokenizer='meta-llama/Meta-Llama-3.1-8B-Instruct', skip_tokenizer_init=False, tokenizer_mode=auto, revision=None, override_neuron_config=None, rope_scaling=None, rope_theta=None, tokenizer_revision=None, trust_remote_code=False, dtype=torch.bfloat16, max_seq_len=2380, download_dir=None, load_format=LoadFormat.AUTO, tensor_parallel_size=1, pipeline_parallel_size=1, disable_custom_all_reduce=False, quantization=None, enforce_eager=False, kv_cache_dtype=auto, quantization_param_path=None, device_config=cuda, decoding_config=DecodingConfig(guided_decoding_backend='outlines'), observability_config=ObservabilityConfig(otlp_traces_endpoint=None, collect_model_forward_time=False, collect_model_execute_time=False), seed=0, served_model_name=meta-llama/Meta-Llama-3.1-8B-Instruct, use_v2_block_manager=True, num_scheduler_steps=1, enable_prefix_caching=False, use_async_output_proc=True)\n", - "\u001b[36m(_MapWorker pid=29524)\u001b[0m INFO 09-24 00:44:26 model_runner.py:997] Starting to load model meta-llama/Meta-Llama-3.1-8B-Instruct...\n", - "\u001b[36m(_MapWorker pid=29524)\u001b[0m INFO 09-24 00:44:27 weight_utils.py:242] Using model weights format ['*.safetensors']\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Loading safetensors checkpoint shards: 0% Completed | 0/4 [00:00 AllToAllOperator[Aggregate] -> LimitOperator[limit=1]\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7e35d71dc7e54b59aa7de6f1941d8b35", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Running 0: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "0f2a096477bd456c90ba3525ce1edc43", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- Aggregate 1: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "8e5196c0d0554778b1436beccb703ff8", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Sort Sample 2: 0%| | 0.00/1.00 [00:00 AllToAllOperator[Aggregate] -> LimitOperator[limit=1]\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "caf0d8f6064149ea9d316dd63930a3e7", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Running 0: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "64fa32b75ab74d8eb66300654fe53cb2", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- Aggregate 1: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "529589d6cafb4e1581ae41a40e0b37b3", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Sort Sample 2: 0%| | 0.00/1.00 [00:00 LimitOperator[limit=1]\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "47831c9f1f8845e987e66c3d1761e07b", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Running 0: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "ca3cd72b1f034178b597e0089aaa5d49", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "- limit=1 1: 0.00 row [00:00, ? row/s]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "\"In Kabul, Afghanistan, over 1,000 bottles of alcohol were destroyed as part of a crackdown on smuggling and sales. The bottles were confiscated from Afghan sources over a two-year period, mostly from international hotels and handed over to customs officials who burnt them. This movemade facilitates enforcement of Afghanistan's ban on alcohol due to its largely Muslim population, with only a few specifically designated areas allowing its sale for foreigners.\"" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[36m(autoscaler +4m31s)\u001b[0m Tip: use `ray status` to view detailed cluster status. To disable these messages, set RAY_SCHEDULER_EVENTS=0.\n" - ] - } - ], "source": [ "from rayllm_batch import RayLLMBatch\n", "\n", @@ -1083,162 +108,6 @@ "print(gen_texts)" ] }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "gen_texts = [r[\"generated_text\"] for r in ds.take_all()]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[\"In Kabul, Afghanistan, over 1,000 bottles of alcohol were destroyed as part of a crackdown on smuggling and sales. The bottles were confiscated from Afghan sources over a two-year period, mostly from international hotels and handed over to customs officials who burnt them. This movemade facilitates enforcement of Afghanistan's ban on alcohol due to its largely Muslim population, with only a few specifically designated areas allowing its sale for foreigners.\",\n", - " 'Here are the article\\'s highlights summarized:\\n\\nPhotographer Eiko Jones was taking underwater pictures of plants near Campbell River in Canada when he was suddenly surrounded by thousands of tadpoles swimming at the Cedar Lake. The 41-year-old photographer was initially startled by the large group of tadpoles, which appeared as a \"cloud\" swimming around him for about ten minutes. The rare sighting was a unique experience for Jones, who stated that he had never seen or heard of tadpoles schooling before.',\n", - " 'Two high-ranking officials were killed in a plane crash over the Escondido River in Mexico. \\n\\nKey points:\\n\\n- The victims were Mayor Jose Manuel Maldonado of Piedras Negras and Coahuila official Horacio del Bosque Davila.\\n- They were on a plane that took off from Piedras Negras and crashed into a lake known as the Fragua Dam.\\n- The pilot, whose name has not been released, is presumed dead.\\n- The aircraft involved in the incident was a twin-engine turboprop Piper Cheyenne.',\n", - " \"South African golfer Thomas Aiken won the Spanish Open, his first European Tour victory, with a score of 10-under-par 278. The win came on a somber day after the passing of golf legend Seve Ballesteros at the age of 54. Players observed a minute's silence to honor Ballesteros, and Aiken dedicated his victory to him. Aiken held his nerve on the final day, with Denmark's Anders Hansen finishing second on eight-under-par and Spain's Pablo Larrazabal, along with Scott Jamieson, taking third.\",\n", - " \"Chelsea is interested in signing Paul Pogba from Juventus for £60 million. Pogba, a 21-year-old French midfielder, has impressed with his performances at Juventus and France. He even has Premier League experience from his time as a scholar at Manchester United. Chelsea sees Pogba as a strong investment due to his Premier League background, which helps them comply with UEFA's Financial Fair Play rules. The deal would add to their impressive midfield, which already includes Cesc Fabregas, who recently joined from Barcelona for £30 million, and other players like Oscar and Eden Hazard.\",\n", - " \"Key highlights from the article include:\\n\\n* Professor Chris Wise, who helped design the Olympic velodrome, will give a talk at the Annual Stephen Lawrence Memorial Lecture in London.\\n* The event is held in memory of 18-year-old Stephen Lawrence, who was murdered in a racist attack in 1993 and had dreamed of becoming an architect.\\n* The lecture aims to raise money for the Stephen Lawrence Charitable Trust, which supports disadvantaged students pursuing a career in architecture.\\n* Tickets for the lecture are £15 for full price or £5 for students and can be bought through the event's website.\\n\\nOverall, the event aims to honor Stephen Lawrence's memory while supporting his legacy by helping students achieve their architectural dreams.\",\n", - " \"The article reports that both Delta and American Airlines have canceled hundreds of flights for voluntary inspections on wiring in their jets. Delta canceled 275 flights Thursday and 325 earlier, affecting flights through early Friday. American Airlines canceled 318 flights Wednesday and 132 scheduled flights Thursday, forcing passengers to spend the night at Atlanta's Hartsfield-Jackson International Airport. The inspections relate to concerns about how wires are secured to MD-80 aircraft, with Delta's MD-88 planes being the focus for inspections, which are expected to be completed by week's end. Passengers were inconvenienced, missing flights, job interviews, and comforts, with the airlines offering assistance such as rebooking flights and covering food and accommodation costs.\",\n", - " \"Here are the article's highlights:\\n\\nNathaniel Clyne, Southampton's right back, has been in phenomenal form this season. After a conversation with manager Ronald Koeman, where he was assured he would be the club's first choice right back, Clyne has delivered outstanding performances, including scoring the winning goal in a 2-1 win against Arsenal.\\n\\nKoeman believes Clyne is ready for England recognition, praising his experience and consistency. With Luke Shaw facing uncertainly at Manchester United, Clyne's performance has raised questions about whether Manchester United bought the wrong full back. Clyne's steady rise to prominence began at Crystal Palace in 2008, where he was promoted from the academy to the first team.\",\n", - " \"Here's a summary of the article's highlights:\\n\\nThe FA Cup second-round replay match between Scunthorpe and non-league side Worcester City ended in a thrilling penalty shootout. Scunthorpe secured a 14-13 victory, setting a new FA Cup record for the longest penalty shootout. Worcester City equalized early into the second half with a goal from Sean Geddes after Scunthorpe's Paddy Madden opened the scoring in the first half with a header from a corner. The match ended 1-1 after extra time, setting up the penalty shootout. Scunthorpe's Miguel Llera sealed the win with the decisive penalty kick, sending his team into the third round of the FA Cup.\",\n", - " \"According to a report by the American Customer Satisfaction Index (ACSI), Americans find flying even more stressful than going to the post office. Although airlines saw a 3% improvement in customer satisfaction, they still scored lower than the US Postal Service, with a score of 69 out of 100.\\n\\nHowever, two low-cost airlines, JetBlue and Southwest, scored highly in the survey with 83% and 81% respectively. \\n\\nThe main areas of customer dissatisfaction with airlines include:\\n\\n- Seat comfort\\n- Rising ticket prices\\n- Extra fees\\n- Poor in-flight services\\n\\nIn response to the low score, the airline industry argued that they compare favorably to other modes of transport like taxis, and that prices haven't increased in line with inflation.\",\n", - " \"Serena Williams, an 18-time Grand Slam champion, recently showcased her new $73,000 diamond-encrusted watch from Audemars Piguet after a win in her opening match of the WTA Finals. \\n\\nWilliams defeated Ana Ivanovic in a 6-4, 6-4 win, her first match in Singapore where she is defending her WTA Finals title.\\n\\nHowever, her victory comes after a week of controversy involving Russian Tennis Federation president Shamil Tarpischev. He made offensive comments on a TV talk show, referring to Williams and her sister Venus as 'brothers', leading to a $15,500 fine and a one-year ban from women's tennis.\\n\\nMeanwhile, the International Tennis Federation faced criticism for not taking immediate action, but the Women's Tennis Association acted swiftly in response to the incident.\",\n", - " 'A 33-year-old British tourist has been taken to court in Dubai for allegedly getting drunk and running naked through a building on the Palm Jumeirah. The man, identified as RS, has been charged with consuming alcohol without a license and committing an indecent act. He admits to drinking eight rums, but denies indecent behavior. \\n\\nAccording to witnesses, RS was seen arguing with security guards in his underwear, then proceeded to remove his clothes and stand naked in a brightly lit corridor on the second floor of the building. It took 30 minutes for police to apprehend him from his hiding place. RS claims he has no memory of the incident due to intoxication. The next court hearing is scheduled for March 27. This incident is the latest in a string of court cases involving British tourists in Dubai, where foreign residents must have a license to consume alcohol.',\n", - " 'The National Football League may soon have its first openly gay player as a current player reportedly plans to come out before the 2013 season. \\n\\nThis move could bring about a significant change as football has never had a gay active player in its nearly 100-year history. Chris Kluwe and Brendon Ayanbadejo, who are outspoken LGBT advocates, have expressed support for the player\\'s decision.\\n\\nDespite this positive outlook, there are also concerns and controversy surrounding the topic. San Francisco 49ers cornerback Chris Culliver sparked uproar when he said he did not welcome gay players in the locker room, and NFL Commissioner Roger Goodell has stated that asking potential players about their sexual orientation is \"unacceptable.\" This issue has gained attention following the Manti Te\\'o \\'fake girlfriend\\' hoax, where Te\\'o was questioned about his sexual orientation at the NFL scouting combine.',\n", - " 'Artist Jennifer Trouton from Northern Ireland is featured in the bestselling book series \"Fifty Shades of Grey\" by E L James. The series\\' author is a close friend of Trouton\\'s and spotted her work at a 2006 art exhibition in London. Trouton\\'s painting, \"Looking At the Overlooked,\" is a mosaic of 300 smaller paintings depicting everyday household objects, which specifically caught the author\\'s eye. It\\'s featured in all three books of the series, including when the main characters first meet and when Christian Grey recalls their first encounter.\\n\\nTrouton\\'s work is described as a metaphor for the mundane becoming extraordinary, reflecting the extraordinary bond between the characters. Another of her paintings is donated to a charity auction in the second book, \"Fifty Shades Darker.\" The artist\\'s involvement was kept hidden from friends and family until it was revealed through her Facebook page.',\n", - " 'Researchers at Cambridge University have found new evidence that challenges the traditional image of Neanderthals as brutish hunters. Instead, they discovered that Neanderthals may have spent most of their time performing domestic tasks, such as preparing animal hides for clothes. \\n\\nThe researchers found that Neanderthal arm bones showed unusual strength, particularly in the right arm, which was 50% stronger than the left arm. This is unlike most humans, who have a 10% difference in arm strength between their right and left arms. \\n\\nA study found that the strong right arm could not be attributed to hunting with spears as previously thought, but rather could be linked to tasks such as scraping animal hides, which was necessary for survival during the Ice Age.\\n\\nThe study also found that Neanderthals may have been more advanced than thought, living in communities, eating cooked food, and understanding its nutritional and medicinal qualities.',\n", - " \"Here are the article's highlights summarized:\\n\\nSerena Williams won her first match back at the Brisbane International, defeating Chanelle Scheepers 6-2 6-3 in straight sets. \\n\\nThe 30-year-old American, ranked fourth in the tournament, fired seven aces in the 68-minute win. However, she revealed plans to cut back on her tennis schedule in 2012, stating she doesn't love playing tennis but can't live without it.\\n\\nOther notable results in the tournament include:\\n\\n- Samantha Stosur beating Anastasiya Yakimova 6-2 6-3 and is likely to face Serena Williams in the semifinals.\\n- Andrea Petkovic defeating Shahar Peer 7-6 1-6 6-3.\\n- Ana Ivanovic winning over Tamira Paszek 6-3 6-3 and facing Kim Clijsters next.\",\n", - " \"The biggest European football stories include:\\n\\n- Italian football: \\n - Juventus manager Antonio Conte may be leaving the club after failing to make progress in the Champions League, despite winning three consecutive Serie A titles. Conte is being considered for other jobs, including at Monaco.\\n - Inter Milan captain Javier Zanetti is set to retire at the end of the season after a successful career.\\n - Roma owner James Pallotta is in Italy for Sunday's match against Juventus.\\n\\n- Spanish football:\\n - Barcelona's Lionel Messi wants to lead the team to a La Liga title by winning their remaining two league games.\\n - Barcelona legend Carles Puyol is close to leaving the club, while Atletico Madrid's title hopes may be affected by Diego Costa's hamstring injury.\\n - Cristiano Ronaldo is saying he's fit to play for Real Madrid, despite concerns about his fitness ahead of their match against Celta Vigo.\",\n", - " \"Here are the highlights from the article:\\n\\n- Norwich City dominated Huddersfield, winning 5-0 with key scores coming from Bradley Johnson (2 goals), Cameron Jerome, Lewis Grabban, and Nathan Redmond.\\n- Bolton drew 0-0 with Ipswich in a match where Eidur Gudjohnsen appeared as a second-half substitute.\\n- Brentford won 3-1 against Blackburn with goals from Jonathan Douglas, Andre Gray, and Jose Ignacio Peleteiro Ramallo.\\n\\nNarrow victories occurred for Wolves (1-0) against Sheffield Wednesday, thanks to Leon Clarke's goal, and Fulham (1-0) against Leeds, thanks to Hugo Rodallega's strike.\\n- Blackpool drew 2-2 with Charlton.\\n- Rotherham and Nottingham Forest played a goalless match.\\n- Wigan continued to struggle under Malky Mackay, having lost to Watford 2-1.\",\n", - " 'A 9-year-old boy from Solihull claims he was repeatedly substituted from matches because of his Asian background while playing for a local youth football team, Knowle Juniors. His mother, Fehnez Khan, has made a complaint to the police and British Football Association (FA), alleging racial discrimination. \\n\\nThe allegations have been denied by the club, which claims the boy was substituted for football-related reasons and that other children also received less playing time. \\n\\nKey points are as follows:\\n\\n- A meeting at a police station has been held to discuss the matter with Khan and club representatives.\\n - The football club, Knowle Juniors, received a Community Club Charter status from the FA for their good work in the area.\\n - Police are hoping to resolve the issue locally, but details on their investigation have not been released.\\n - The probe is also being investigated by the Birmingham FA, who have not provided detailed information on their investigation yet.',\n", - " 'Here are the highlights from the article:\\n\\n- Two rare bottles of whisky salvaged from the 1941 shipwreck of the SS Politician off the coast of Eriskay in the Outer Hebrides were auctioned off for £12,050 in 2013.\\n\\n- The bottles were part of the cargo of 28,000 cases of malt whisky that sank along with the ship, and are scarce due to only eight having been authenticated since 1987.\\n\\n- The whisky is now undrinkable, and the bottles were sold for their historical and scarcity value.\\n\\n- The bottles are part of the inspiration for the book and 1949 film \"Whisky Galore,\" based on the true story of Scottish islanders who salvaged the cargo.\\n\\n- The auction was held by Scotch Whisky Auctions in Glasgow, and the buyer remained unidentified.\\n\\n- The bottles come with authentication documents from Christie\\'s, where they were previously sold in the past for £4,000.',\n", - " \"Here are the article's highlights:\\n\\n1. Authorities in southern Indiana have arrested 54-year-old William 'Clyde' Gibson III, a convicted sex offender, in connection with the murders of two women and a suspected third victim.\\n2. Human remains were found in Gibson's backyard, which were later identified as those of 35-year-old Stephanie Marie Kirk, who was last seen on March 25.\\n3. Kirk's remains are believed to have been in the backyard for weeks or months. The cause of death is still under investigation.\\n4. Gibson is also suspected of killing Christine Whitis, 75, who was found strangled in his home last week, and Karen Hodella, 44, who was discovered near the Ohio River in 2003.\\n5. Gibson was arrested on drunken-driving charges after police spotted him driving Whitis' car, leading authorities to search his home and find Kirk's remains.\\n6. Gibson has a lengthy criminal record, including convictions for robbery,\",\n", - " \"Noted author Mitchell Gross, who writes under the pen names Mitchell Graham and Douglas Alan, has been accused of swindling millions of dollars from two women he met through online dating sites. \\n\\nHere are the key highlights:\\n\\n- Gross allegedly convinced two women to invest in a sham company, one of whom wired $3 million to a fake account, and the other who invested $1.4 million.\\n- He used the stolen funds to buy expensive artwork, a luxury car, a golf club membership, and other personal items.\\n- Gross falsely claimed that film adaptations of his books were being optioned by Steven Spielberg, featuring Pierce Brosnan and Kirsten Dunst.\\n- To further deceive his victims, he pretended to be a representative of a financial institution, 'The Merrill Company'.\\n- Gross' scam involved creating fake tax forms and account statements to conceal the scheme.\\n- He has pleaded not guilty to wire fraud and money laundering charges, which carry a potential prison sentence of decades.\\n- Two previous\",\n", - " \"Here are the highlights from the article about Myspace's comeback:\\n\\n1. **Myspace is making a comeback**: Since December, the site has added 1 million new users, with a significant increase from adding zero new users per day to 40,000 per day.\\n2. **New music player a key factor**: The introduction of a music player offering 42 million songs in December helped the site regain popularity.\\n3. **Tie-up with Facebook**: Myspace has formed a closer relationship with Facebook, allowing users to log in with their existing Facebook details and access Myspace content through the Facebook app.\\n4. **Improved user numbers**: Now, Myspace has 25.1 million users, a significant increase since its decline in popularity.\\n5. **Comparing to Spotify**: Myspace offers a larger music library than its streaming rival Spotify, which has 15 million songs, and other platforms, such as Pandora, offer less.\\n6. **Pan\",\n", - " \"Here are the article's main highlights:\\n\\n- Conservative Chief Whip Andrew Mitchell and Lib Dem leader Nick Clegg received £11,000 and £777,000 respectively from Brompton Capital, a company based in Jersey, a tax haven.\\n- The company's chairman, Rumi Verjee, has donated millions to the Lib Dems and the Conservative party, despite filing multiple losses in the company's financial accounts.\\n- Brompton Capital's shares are owned by an offshore firm called Integro Nominees (Jersey), which has since changed its name to EQ Nominees (Jersey).\\n- Despite Brompton Capital's losses, the company has made over £12 million in charitable donations in the past 10 years.\\n- Labour deputy leader Harriet Harman accused the Liberal Democrats of hypocrisy in accepting donations from a company using offshore companies to potentially avoid taxes.\\n- Both Mitchell and Clegg's parties have expressed support for cracking down on tax avoidance and wealth inequality, despite this new\",\n", - " \"The article reports on a recent development in the Madoff Ponzi scheme case. The key highlights are:\\n\\n1. **$2.48 billion payout**: Victims of Bernard Madoff's fraud will receive approximately $2.48 billion to cover their losses, making their total recovery around $3.63 billion.\\n\\n2. **New total recovery**: This payout triples their previous total recovery of $1.15 billion, but still only covers about half of the total losses estimated at $9.15 billion.\\n\\n3. **Trustee's work**: The recovery is attributed to the efforts of trustee Irving Picard, who has managed to recover $9.15 billion or 53% of the estimated losses.\\n\\n4. **Remaining funds**: Although Picard has recovered almost $9.15 billion, some funds are being held in reserve as victims pursue their own cases to recover more money.\\n\\n5. **Delayed distributions**: Picard is appealing court decisions that have limited his claims against banks such as JPM\",\n", - " 'Here are the highlights from the article:\\n\\n**Surrey County Council Faces Criticism for £4,000 Away Day at Historic Castle**\\n\\n* 26 senior Conservative councillors and officers attended a 2-day workshop at the 900-year-old Farnham Castle at a cost of £4,000.\\n* The council is set to make £200m in savings over the next four years due to government funding cuts, and up to 650 jobs are at risk.\\n* Opposition politicians and local residents accuse the council of wasting taxpayer money on a \"posh jolly\".\\n* Council Chief Executive David McNulty defends the trip, saying it was \"value for money\" and allowed the organization to develop its approach to complex issues.\\n* However, Communities Secretary Eric Pickles\\' recent paper suggests canceling away days at posh hotels as a way to save money, recommending instead to use council-owned properties or borrow a room from a neighboring council.\\n* The cost of the trip has sparked criticism, with',\n", - " 'Here are the article\\'s highlights:\\n\\n- Former UK hospital manager Gary Walker claims he was paid £500,000 to keep quiet about patient safety concerns at the United Lincolnshire Hospitals Trust after being removed as chief executive in 2010.\\n\\n- Gary Walker broke his silence, speaking out about a care scandal that may have led to 670 patient deaths, despite an email from NHS-funded lawyers warning him not to speak out and threatening repayment of the £500,000 settlement.\\n\\n- Jeremy Hunt, the Health Secretary, has expressed concern that Walker was \"leaned on\" to remain quiet and is willing to order NHS bosses to reverse the gagging order if it breaches NHS guidelines on whistle-blowing.\\n\\n- The Health Secretary has written to the trust chairman to inquire about the gagging order, citing the Francis Report\\'s call for a ban on such orders that prevent concerns being raised about patient safety.\\n\\n- United Lincolnshire Hospitals NHS Trust, where Walker was chief executive, is among 14 trusts being investigated',\n", - " \"Former French First Lady Carla Bruni-Sarkozy spoke to Vogue magazine, sharing her views on feminism and women's roles in society. Key points from the interview include:\\n\\n1. Bruni-Sarkozy stated she doesn't identify as a feminist, preferring a traditional role at home with her children.\\n2. She mentions pioneers who opened up opportunities for future generations of women, but asserts she is content with her life without actively pursuing feminist causes.\\n3. The former model and singer turned conservative shared that she disagrees with her husband, former President Nicolas Sarkozy, on gay marriage, supporting the right to adoption for same-sex couples.\\n4. Bruni-Sarkozy's life in the public eye has grown since Sarkozy lost the French presidential election, leading to her becoming a prominent figure on billboards, magazine covers, and through her new album.\\n5. Despite her husband's involvement in corruption scandals, Bruni-Sarkozy remains tight-lipped about the issues and prefers to step back and be\",\n", - " 'Here are the article\\'s highlights:\\n\\n- A growing number of travelers, known as \"flashpackers,\" are benefiting from cheap, well-furnished hostels. They are usually over 30, well-established in their careers, and can afford higher-end hotels but chose to save money by staying in hostels.\\n\\n- People like 49-year-old Paul Wampach, who prioritizes budget-friendly accommodations, especially for ski vacations. He has stayed in the same hostel, Fireside Inn in Breckenridge, Colorado, four previous times, booking a dorm-style room for less than $40 per night.\\n\\n- Flashpackers prefer to stay in hostels with shared living spaces and modern amenities, such as Wi-Fi, hot tubs, and community kitchens, allowing them to meet travelers from different cultures.\\n\\n- The number of hostel bookings has been increasing at U.S. vacation destinations after the 2001 recession, mainly due to the unstable economy. Popular destinations like New York and San Diego reported significant',\n", - " 'The article describes the author\\'s journey to Greenland to join the Arctic Sunrise, a ship belonging to the environmental group Greenpeace, on a three-month expedition around Greenland\\'s coast. Highlights from the article include:\\n\\n1. **Meeting William, a Greenland taxi driver who has engaged in whale hunting**, which is legal in Greenland as a means of subsistence.\\n2. **Observing the breathtaking landscape** of Sermilik Fjord, where the ship travels, featuring an \"inky blue body of water thick with floating, ancient ice\" and massive mountainous icebergs.\\n3. **Scientific research on the melting of the Greenland ice sheet**, which shows alarming rates of change, possibly leading to sea levels rising beyond current predictions.\\n4. **A warning from glaciologist Dr Gordon Hamilton**, who believes that if urgent action is not taken, the Earth\\'s climate will reach a \"tipping point\" with catastrophic consequences for society.\\n5. **The opportunity for CNN to participate in a Green',\n", - " '**Tragic Burns Survivor Michael Brewer Faces Long Recovery**\\n\\n15-year-old Michael Brewer suffered severe burns over 65% of his body after being set on fire by a group of teenagers in Deerfield Beach, Florida, in an alleged dispute over a video game, a bike, and $40. His mother, Valerie Brewer, is bracing for a lifelong recovery for her son, who still faces multiple surgeries, physical therapy, and rehabilitation.\\n\\n**Key Facts and Updates:**\\n\\n- Michael Brewer\\'s attackers, Denver Jarvis (Jarvis\\' brother), Matthew Bent, and Jesus Mendez, are accused of pouring alcohol over Michael and lighting him on fire.\\n- Michael Brewer\\'s treatment is extremely painful, with procedures like lengthy showers and physical therapy causing excruciating pain and distress.\\n- Ozzy Osbourne sent a CD to Michael, which he plays during the painful shower therapy to help him cope.\\n- Michael\\'s recovery is expected to be lifelong, with his mother saying it\\'s been a \"rollerco',\n", - " 'Here are the article highlights:\\n\\n- George Kenney, a 52-year-old high school principal in Florida, pleaded no contest to practicing hypnosis without a license after hypnotizing 75 students, teachers, and their families at North Port High School. \\n- As part of his plea deal, he received one year of probation.\\n- Kenney was accused of hypnotizing two students before they committed suicide last year: 16-year-old Wesley McKinley and 17-year-old Brittany Palumbo.\\n- An investigation found that Kenney was warned by his supervisor to stop the hypnosis sessions but did not issue a written directive.\\n- Kenney admitted to holding hypnosis sessions with five other students who later struggled with mental health issues or had tragic outcomes, including a car crash that killed a teenage student named Marcus Freeman.\\n- Many students defended Kenney, claiming the hypnosis helped them focus in class, and a Facebook group called \"Bring Back Dr. Kenney\" was set up to support him.\\n',\n", - " 'Here are the main highlights of the article:\\n\\n* The UN\\'s outgoing corruption investigator, Inga-Britt Ahlenius, has released a 50-page memo criticizing the leadership of UN Secretary-General Ban Ki-moon, accusing him of managerial incompetence and being \"responsible for undermining his own officials and failing to address key issues.\"\\n* Ahlenius alleges that Ban has repeatedly undermined the flow of information, interfered with staff appointments, and left crucial leadership positions vacant to maintain his own power.\\n* The report describes the UN Secretariat as \"decaying, falling apart, and drifting into irrelevance.\"\\n* Ahlenius\\' report highlights several instances of Ban\\'s failures, including:\\n\\t+ Failing to appoint an Under Secretary-General for Safety and Security for 11 months after a deadly bombing of the UN\\'s Algeria headquarters.\\n\\t+ Relying on a bureaucratic approach to accountability, rather than taking concrete steps to address issues.\\n* The report has put the White House in a difficult position,',\n", - " \"A 25-year-old drug dealer, Javad Malik, has pleaded guilty to multiple charges related to the death of 28-year-old Ahtia Tabasim and her unborn child. The incident occurred in January when Malik attempted to flee from police in a high-speed chase, crashing into Tabasim's car just yards from her home in Birmingham. \\n\\nTabasim, a newlywed and a care worker at an old persons' home, was three months pregnant and died from her injuries in the hospital. Her husband, Bahdar Zahman, and family members have paid tribute to her, describing her as a kind and caring person who loved her work with the elderly and disabled.\\n\\nMalik has pleaded guilty to causing death by dangerous driving, possession of heroin, cocaine, and cannabis with intent to supply, and not having a valid license or insurance. Judge William Davis warned Malik to expect a lengthy prison sentence, stating that his offenses are very serious and will result in a significant term of imprisonment\",\n", - " \"The main highlights of the article are:\\n\\n1. Former boxing champion Frank Bruno made an emotional plea for better mental health treatment after revealing he has been sectioned twice in the last 18 months due to suffering from bipolar disorder and depression.\\n2. Bruno, a Lib Dem supporter, recorded a video endorsing Health Minister Norman Lamb's mental health policies, expressing his gratitude for the progress made in mental health care.\\n3. Norman Lamb announced new initiatives, including a 'carers' bonus' worth £250 a year and a 'carers' passport' for access to benefits such as free hospital parking.\\n4. Lamb criticized Labour and the Conservatives for their handling of the NHS, accusing Labour of being'resistant to change' and the Conservatives of being potentially 'vulnerable' to cutting NHS funding under right-wing pressure.\\n5. The article compares the promises made by Labour and the Conservatives regarding NHS funding, with Labour pledging a £2.5 billion 'time to care' fund and the Conservatives\",\n", - " \"The UK's national tourism agency, VisitBritain, is launching a marketing push in Asia to attract more Chinese tourists. The agency plans to give iconic landmarks, such as Buckingham Palace and Stonehenge, Chinese names to make them more appealing to Chinese visitors. This move comes after a record-breaking 20 million tourists visited the UK between January and July, spending £11.3 billion.\\n\\nKey highlights include:\\n\\n* VisitBritain aims to give Chinese tourists a greater affinity with Britain by using Mandarin titles for famous sites.\\n* 20 million people visited the UK between January and July, a 7% increase from last year.\\n* The UK's heritage is a key selling point for Chinese tourists, with visiting Buckingham Palace and touring historic Chatsworth House as top attractions.\\n* The GREAT China Welcome programme aims to make Britain the destination of choice for Chinese tourists, with a new charter to help visitors identify China-ready hotels, attractions, and tour operators.\\n\\nOverall, the agency hopes to treble the number of\",\n", - " 'The article discusses the college football scandal at Penn State University and the crisis it presents for the sport. Key highlights from the article include:\\n\\n1. **Penn State\\'s inadequate response:** The university fired Joe Paterno and other officials, but more needs to be done, including whether Mike McQueary should be punished and whether others on the staff were aware of Jerry Sandusky\\'s alleged actions.\\n\\n2. **NCAA\\'s inadequate response:** The NCAA has stated it will defer to law enforcement but hasn\\'t provided a meaningful response, considering the severity of the scandal.\\n\\n3. **Worst scandal in college football history:** The article considers this scandal the worst in the sport\\'s history and calls for the toughest penalties, including the \"death penalty\" (a one-year ban), which has only been given to one program previously, Southern Methodist University.\\n\\n4. **Lack of accountability:** The NCAA allows the football program to make big money, but players, who are unpaid amateurs, often bear the consequences',\n", - " \"A 53-year-old convicted paedophile, Brett Barrett, was jailed for seven months for assaulting a teenager. Barrett, who had previously been jailed for two years in the late 1990s for sexual offenses against a teenage boy, had taken over a milk bar in Melbourne's south east near a high school. \\n\\nThe milk bar advertised 'after-school specials' in 2013. What's more, Barrett's latest crime was not known by detectives investigating him, as his previous conviction predates the introduction of the National Child Offender Register in Victoria in 2004.\\n\\nA public national sex offender register has been proposed but rejected by all states and territories except the Northern Territory. The Northern Territory's register will be named after murdered teenager Daniel Morcombe, and will allow the public to look up convicted sex offenders in their area.\\n\\nDerryn Hinch, a 'name and shame' campaigner, believes that a national public register would have allowed the public to identify Barrett and stay safe.\",\n", - " \"The article highlights several attractions and activities in the Swiss city of Basel, situated at the crossroads of Germany and France. Key points include:\\n\\n1. **Historical significance**: Basel is home to the oldest university in Switzerland and Europe's oldest five-star hotel, the Hotel Drei Kronige. A scenic walk through the beautifully preserved Old Town allows visitors to see the notable Munster, a red sandstone gothic cathedral.\\n\\n2. **Ancient Roman settlement**: Located 12 miles east of Basel, the 2,000-year-old Roman settlement of Augusta Raurica showcases a well-preserved theater, forum, amphitheater, and aqueduct. An open-air museum features a reconstructed Roman house and daily life recreations.\\n\\n3. **Thrill-seekers' delight**: The Hasenhorn toboggan run, 25 miles east of Basel, is Germany's longest and an adrenaline-packed 1.8-mile ride open year-round.\\n\\n4. **Art and culture**: The\",\n", - " \"According to the article, Facebook is reportedly planning to release its own smartphone by next year. They have hired over a dozen former Apple engineers who worked on the iPhone, and a former engineer claims Facebook CEO Mark Zuckerberg was very interested in learning about smartphone technology, which indicates a serious approach to developing a Facebook phone.\\n\\nThe new smartphone would allegedly allow users to seamlessly send messages, post updates, and share content, but it remains unclear if this is a necessary feature or a gimmick. There has been speculation that Facebook needs to develop new mobile revenue sources and more control over its mobile products as users spend more time on mobile devices.\\n\\nThe news comes as Google closed its acquisition of Motorola Mobility, increasing the pressure on Facebook to make a move. Many tech experts believe a Facebook phone would be a bad idea due to the company's lack of experience in hardware and low profit margins in the industry.\",\n", - " \"A mother and daughter, Kim Milhano (28) and Susan Scott-Williams (51), shared a joint wedding ceremony with their partners. The idea was suggested by their partners and after months of planning, they had a combined celebration at a hotel near their home in Bristol. \\n\\nKey highlights of their unique wedding include:\\n\\n- The mother and daughter wore matching bridesmaid dresses but had separate dresses.\\n- The pair shared the ceremony and reception with their respective partners, with a combined guest list of 180 people.\\n- They managed to save £2,000 (about a quarter of the total cost) by having a joint wedding instead of two separate ones.\\n- Kim and her husband Carlos had been engaged for eight years before finally getting married, while Susan married her partner Barry after rekindling the romance.\\n- The couple's children and grandchildren played a key role in the wedding, with Kim's kids serving as flower girls and page boys, and Susan's grandchildren also participating.\\n- The joint wedding\",\n", - " 'Ipswich Town is close to signing goalkeeper Paddy Kenny on loan from Bolton Wanderers until the end of the season. Kenny, a 36-year-old experienced keeper with 7 caps for the Republic of Ireland, has failed to make a first-team appearance for Bolton since joining them last summer. Ipswich manager Mick McCarthy seeks a temporary replacement for injured goalkeeper Dean Gerken. Kenny is expected to undergo a medical before completing the move, having previously played for Leeds, Sheffield United, and QPR.',\n", - " \"A viral YouTube video showcases a small dog in Japan's Kobe that found a creative way to pass the time during the summer. The dog plays fetch with an orange ball in a stream, picking it up, throwing it in the water, and then chasing after it, jumping from stone to stone. When the ball floats too far, the dog retrieves it by putting a paw in the water and doggy-paddling back to the shore. This entertaining video has garnered over a million views and demonstrates the dog's determination and resourcefulness.\",\n", - " \"Sebastian Vettel, a three-time Formula One world champion, believes his Red Bull team is in better shape than last year. The team is hoping to repeat their 2012 success and has focused on improving their car, with some advancements made after the 2012 season. Vettel remains motivated and expects the 2013 season to be close, with multiple drivers competing for wins, similar to the unpredictable start of the 2012 season. He emphasizes the importance of consistency and scoring points in every race to be a title contender, and is currently prioritizing Red Bull's preparation for the upcoming Australian Grand Prix.\",\n", - " \"**Girl Leaves with Horrific Scars After Dog Mauled Her Face**\\n\\nTwelve-year-old Georgia Sigourney was left with severe facial scars after her friend's Siberian Husky attack. The dog, named Dakota, suddenly flipped and clamped its jaw down on Georgia's face while she was lying on the floor, causing flesh around her mouth and cheeks to tear. Georgia was rushed to the hospital and underwent 51 stitches (31 external and 20 internal) to repair the damage.\\n\\n**Key Points:**\\n\\n* The incident occurred when Georgia accidentally nudged the dog, which was sleeping behind her.\\n* Georgia was left with severe pain and is now scared of dogs.\\n* Her father, Chris, says Georgia is lucky to be alive, as the attack could have been fatal or disfiguring.\\n* The dog's owners initially claimed it was not their pet, but later gave it to the police to destroy.\\n* The case is being investigated by Cambridgeshire Police, who have\",\n", - " 'Maria Sharapova, the world No 2 tennis player, faced a significant challenge in the Australian Open. She trailed 1-2 in the match against qualifier Alexandra Panova (world No 150) but managed to come back and win 6-1, 4-6, 7-5. Sharapova survived two match points in the decisive third set before taking the lead and sealing the victory. \\n\\nSharpova hit 51 unforced errors in the match but found a way to triumph through sheer determination. Despite a tough performance, she said that winning the match was more important. She praised Panova for her challenging play and accepted that winning despite a lackluster performance boosted her confidence.',\n", - " \"Here are the highlights from the article:\\n\\n**Ava's Story:**\\n\\n- Ava, a 14-month-old toddler, had a rare cancer-like disease called Langerhan's Cell Histiocytosis (LCH) diagnosed at just 5 months old.\\n- She underwent 15 weeks of aggressive chemotherapy and over 100 blood transfusions to keep her body functioning, but her treatment failed.\\n- A bone marrow transplant was her best hope of beating the disease, and thanks to a 21-year-old UK donor, the transplant was successful.\\n\\n**Disease Details:**\\n\\n- LCH is a rare disease affecting 1 in 250,000 children in the UK each year.\\n- It's a cancer-like disease treated with chemotherapy, and the cause is unknown.\\n- Symptoms include swollen lymph glands, poor appetite, bone pain, skin rash, ear discharge, breathing difficulties, and jaundice.\\n- The condition has an 80-90% survival rate.\\n\\n**Recovery and\",\n", - " 'A group of Heath Ledger fans has launched a petition to retire the Joker character from future Batman movies, citing Ledger\\'s iconic and chilling performance as the ultimate interpretation. \\n\\nThe petition, found on the website \"The Ultimate Joker,\" has garnered 2,431 supporters so far. The site\\'s leader, Fer Barbella, aims to reach 50,000 signatures, after which they may present the petition to Warner Brothers studios. \\n\\nHeath Ledger\\'s performance as the Joker in \"The Dark Knight\" left a lasting impression on fans and critics alike, earning him a posthumous Oscar nomination for Best Supporting Actor and multiple award wins. The fans behind the petition believe that no one can surpass Ledger\\'s portrayal of the character and want to honor his memory in this way.',\n", - " 'Here are the key highlights from the article:\\n\\n- An American Airlines flight, AA65, from Zurich to New York made an emergency landing at Heathrow Airport in London due to a cracked windscreen.\\n- The plane was around 45 minutes into its journey when the emergency was declared and landed safely at 11:30 am local time.\\n- Ground staff will attempt to replace the windscreen, and passengers may be rebooked on other flights to complete their journey to the US.\\n- The plane is expected to depart from Heathrow again around 1:30 pm after refuelling and a new windscreen replacement.\\n- Passengers were alarmed by the rapid descent, with some social media users speculating that the plane would land at Gatwick Airport instead of Heathrow.',\n", - " \"Here's a summary of the key points from the article:\\n\\nStoke City goalkeeper Jack Butland is eager to regain his place in the starting lineup after returning from a loan spell at Derby County. He has been restricted by Asmir Begovic since 2012, forcing him to spend time on loan to get match experience. Butland now aims to compete with Begovic for first-choice goalkeeping duties as he prepares for the European Under-21 Championship in the Czech Republic.\\n\\nButland shares his enthusiasm about England Under-21 manager Gareth Southgate's contract extension, believing it shows their team's growing confidence and positive squad dynamic. This added motivation, combined with the squad's team spirit, may push Butland to achieve his goal and make a strong showing in the upcoming European Under-21 Championship.\",\n", - " \"On a single day in Afghanistan, five Australian soldiers lost their lives in two separate incidents. \\n\\n1. **Green-on-Blue Attack**: A shooter in an Afghan National Army uniform killed three Australian soldiers at a base in Uruzgan province, wounding two others. The shooter escaped by scaling a fence.\\n\\n2. **Helicopter Crash**: Another two Australian soldiers were killed when their helicopter crashed in Helmand province, while trying to land. The cause is unclear, but enemy action is not suspected.\\n\\nThese incidents marked Australia's deadliest day in Afghanistan, with a total of 14 NATO troops killed this month due to 'green-on-blue' attacks. The rise in such incidents has led to increased precautions among allies, with US forces now carrying loaded weapons at all times. The incident marks a significant blow to morale, with Australian troops set to withdraw from the country ahead of schedule.\",\n", - " 'The article highlights Richard Sherman\\'s crucial play in the NFC Championship game, where he deflected a pass intended for San Francisco\\'s Michael Crabtree, allowing his teammate Malcolm Smith to intercept the ball and seal Seattle\\'s 23-17 win. \\n\\nSherman\\'s deflection and subsequent celebration, including a taunt towards Crabtree and a verbal rant on live TV, stole the show. He reinforced his claims by calling himself the best corner in the game and labeling Crabtree as a \"mediocre\" receiver. \\n\\nThe game was a high-scoring match-up with several pivotal moments for the Seattle defense. During the fourth quarter, they forced three turnovers, including two sacks and a fumble recovered by Michael Bennett, and an interception by Kam Chancellor.',\n", - " 'Here are the article highlights:\\n\\n- Dave Styles, a 30-year-old big cat handler, returned to work at Australia Zoo after nearly being killed by a 114kg tiger, Charlie, in November.\\n- The tiger used Styles as a \"teething toy\" and caused puncture wounds to his neck and shoulders.\\n- Styles had been working with big cats for over 9 years and even raised Charlie from a cub.\\n- Despite the attack, Styles still loves big cats and is focused on their conservation.\\n- Charlie was not euthanized but had been seen interacting calmly with other handlers after the attack, showing he wasn\\'t being vicious but rather overly excited.\\n- Styles received support from around the world during his recovery and is now \"thrilled to be back\" working with the tigers at the zoo, including Charlie.',\n", - " \"In a major breakthrough, US House and Senate negotiators have reached an agreement on a $662 billion defense authorization bill, aiming to address concerns from the White House about detainee language and potential vetoes. Key highlights of the agreement include:\\n\\n1. **Additional language to protect civilian law enforcement**: The bill clarifies that nothing in the new detainee rules will interfere with civilian law enforcement's ability to carry out investigations and interrogations in the US.\\n\\n2. **National security waiver for the President**: The bill includes a waiver for the President to transfer suspects from military to civilian custody, providing more flexibility.\\n\\n3. **Tough sanctions on Iran's Central Bank**: The bill includes sanctions aimed at punishing Iran for its nuclear program, which received broad support in Congress and is expected to pressure Iran.\\n\\n4. **New restrictions on Pakistan**: Lawmakers have added provisions to ensure Pakistan is not involved in manufacturing or transporting improvised explosive devices for use in Afghanistan.\",\n", - " '**Local Woman Receives Payout After Being Told to Stop Breastfeeding at Leisure Centre**\\n\\nSophie Howes, a 27-year-old mother, was asked to stop breastfeeding her eight-month-old daughter Connie at a leisure centre in Kent because a lifeguard was \"offended.\" The centre manager, Kim Walters, intervened and told Howes to move to the changing room to continue feeding her daughter.\\n\\n**Key Highlights:**\\n\\n1. **Discrimination Claim:** Sophie Howes claimed the centre had breached the Equality Act 2010, which protects breastfeeding mothers from discrimination.\\n2. **Payout:** The centre, Ashford Leisure Trust, agreed to an out-of-court settlement with Howes after admitting that staff made her feel \"embarrassed\" and \"humiliated.\"\\n3. **Support for Breastfeeding:** Ashford Leisure Trust now fully supports breastfeeding at its sites and recognizes the legal rights of mothers to do so.\\n4. **Staff Training:** The centre has promised to train its',\n", - " \"The article highlights the following:\\n\\n1. **Sale of powerful stun guns on eBay**: A Mail on Sunday investigation found that powerful stun guns, disguised as torches, were being sold on eBay that are capable of delivering an electric shock five times more powerful than a police Taser.\\n\\n2. **Danger to public safety**: The stun guns can paralyze victims instantly, leave them in excruciating pain, and have been linked to brain damage and even death in some cases.\\n\\n3. **eBay's failure to address the issue**: Despite the website claiming to ban the sale of illegal weapons, the Mail on Sunday was able to buy three illegal stun guns and two pepper sprays within minutes, with the packages arriving from Poland, Lithuania, Italy, and the US.\\n\\n4. **Investigation and response**: The Metropolitan Police launched an investigation into the eBay stun guns, and eBay removed the listings from its website before they reappeared just hours later.\\n\\n5. **MPs' concerns**: Tory MP\",\n", - " \"Here are the article's highlights:\\n\\n- The US is deploying an additional 350 troops to protect the American Embassy in Baghdad and its support facilities due to growing concerns about an ISIS attack.\\n- The deployment follows a request from the State Department and a review by the Defense Department.\\n- This move increases the total number of US forces in the country to over 1,000.\\n- The new troops will not be part of a combat role and are primarily for diplomatic security.\\n- The troops will be from the Army and Marines, with 820 currently assigned to augment security in Iraq.\\n- The deployment aims to replace 55 troops in Baghdad who will be redeployed outside Iraq and will be accompanied by medical personnel, helicopters, and an air liaison team.\\n- The US has also conducted 114 airstrikes in Iraq, including one near Mosul Dam on Monday that destroyed 16 armed vehicles.\",\n", - " \"Three young blind individuals from Arizona have made a remarkable achievement by completing the challenging Alcatraz Invitational Swim in San Francisco, California. The event required them to swim 1.25 miles from Alcatraz Island to the mainland. \\n\\nMax Ashton, 17, was the first to finish in over 50 minutes, guiding him were his 24-year-old supporters Mike and Paul Tiffany. \\n\\nNotably, this is not Ashton's first impressive feat, as he earlier climbed Kenya's Mount Kilimanjaro at 13 and crossed the Grand Canyon at 14.\\n\\nTwo others who braved the swim were Tanner Robinson, 24, who crossed the finish line in over an hour and 16 minutes, and Katie Cupp, 19, who finished in one hour and 24 minutes.\\n\\nThese remarkable individuals hope to show the world that the blind can achieve anything a sighted person can do.\",\n", - " 'Here are the highlights from the article about Jane Lynch:\\n\\n**Career:** \\n- Jane Lynch plays Sue Sylvester in the hit TV series \"Glee,\" winning her critical acclaim and several awards, including a Screen Actor\\'s Guild Award, Golden Globe Award, and Primetime Emmy Award.\\n- She starred in various other movies and TV shows, including \"Best in Show,\" \"Wreck-It Ralph,\" and \"Saturday Night Live.\"\\n\\n**Personal Life:**\\n- Lynch married Dr. Lara Embry in 2010 and has daughters Haden and Chase.\\n- She co-authored an audio book \"Elfbot\" with her daughter Haden and friends, aiming to start a new holiday tradition.\\n\\n**Family Involvement in Showbiz:**\\n- Lynch expressed excitement and nerves about her daughter Haden getting into show business, emphasizing the importance of her own path and how she wants her kids to find their own way in life.\\n- Her family\\'s involvement in the audio book \"Elfbot\" makes',\n", - " 'A recent study by Cambridge University academics has revealed the vast amount of personal information that can be obtained from analyzing Facebook user data. Here are the key highlights:\\n\\n* Researchers analyzed data from 58,000 Facebook users and were able to predict sensitive information such as:\\n - Male sexual orientation with 88% accuracy\\n - Racial identity with 95% accuracy\\n - Religion and politics with 80% accuracy\\n - Personality types and emotional stability with accuracy ranging from 62-75%\\n* Even users who did not openly identify as such were accurately identified in some cases (e.g., less than 5% of gay users were connected to gay groups)\\n* The study\\'s methods were not complicated and could be easily replicated by companies to gain more accurate information.\\n* The study also found unusual correlations between online behaviors and traits (e.g., liking \"curly fries\" is associated with higher IQ, and liking a specific Facebook page is associated with lower drug usage).\\n* The findings',\n", - " \"Here are the article highlights:\\n\\n**Australia:** A third rescue operation in two weeks occurred in the waters between Australia and Indonesia, with 162 passengers being plucked from a distressed boat. However, authorities have not confirmed if the passengers were seeking asylum.\\n\\n**Global Asylum Seeker Issue:** The issue of asylum seekers has become a divisive and politically charged topic, with wealthy nations like Australia and the US hesitant to welcome refugees.\\n\\n**Statistics:**\\n\\n- Eighty percent of the world's refugees are hosted in developing countries, with Pakistan hosting 1.7 million refugees, followed by Iran and Syria.\\n- 17% of refugees live outside their region of origin, mainly in countries with available immigration channels.\\n- Major destinations for asylum seekers include South Africa, the US, France, Germany, and Italy.\\n- Asia is the leading continent of origin for asylum seekers (45%), followed by Africa (27%), Europe (15%), and the Americas (8%).\\n\\n**UNHCR's Report:** A \",\n", - " 'Here are the article highlights summarized in clear and concise language:\\n\\nA group of high-profile individuals, including former US President Jimmy Carter and musician Sting, has sent a letter to UK Prime Minister David Cameron urging him to reconsider the country\\'s drug laws. The group, which also includes Yoko Ono, Nobel Prize winners, and several British MPs, suggests that the UK\\'s \"war on drugs\" is causing more harm than good.\\n\\nThe letter argues that the estimated £285 billion spent annually on drugs could be better spent on measures to minimize the harm caused by the drug trade. The signatories, led by Countess of Wemyss, claim that legalizing drug use could prevent thousands of deaths associated with the black market trade.\\n\\nKey supporters of the proposal include:\\n\\n- Countess of Wemyss, leading the initiative\\n- Former US President Jimmy Carter\\n- Musician Sting\\n- Yoko Ono\\n- Businessman Sir Richard Branson\\n- Professor AC Grayling\\n- Professor David',\n", - " \"Former England rugby player Paul Sackey believes England national team coach Stuart Lancaster should start fly-half Danny Cipriani in the Six Nations tournament. Sackey, a former teammate of Cipriani's, says that Cipriani is the most skilled attacking player in the England team and would be a great asset due to his pace and passing accuracy. Cipriani was expected to be on the bench for the opening match against Wales, but Sackey thinks he deserves to start and potentially reignite his career.\\n\\nSackey emphasizes that Cipriani's recent form with the Sale Sharks club has made him a strong contender for the position. He also notes that the team's midfield is still uncertain, with several options, including George Ford, Luther Burrell, and Billy Twelvetrees, competing for spots. However, Sackey believes that if England can solidify their midfield, they will pose a significant threat to opponents.\\n\\nIn summary, Paul S\",\n", - " \"**Woman Abandoned in Hospital Waiting Room Identifies After 3 Years**\\n\\n* A 68-year-old woman, identified as Edith Allen, was found abandoned in an Alabama hospital waiting room in August 2010, wearing an adult diaper and hospital gown.\\n* Despite the medical staff caring for her, they were unable to identify her due to her lack of identification and inability to speak, leading to a three-year search.\\n* The investigation revealed that her carer, Cathy Jean Thomas, had been receiving over $25,000 in Allen's social security checks, which she used for personal benefits.\\n* Thomas, 59, has been charged with identity theft and is being held on a $50,000 bond.\\n* A tip from a non-profit group, LostNMissing, led authorities to Thomas, and consequently, to Allen's identity.\\n* Allen's medical bills have built up to $200,000 over the past three years due to her inability to qualify for Medicaid due to not having\",\n", - " \"Here are the highlights from the article:\\n\\nRolls-Royce has unveiled a unique, one-off limousine called the Celestial Phantom, designed to celebrate the 10-year anniversary of the Phantom model. The luxury car features a starry night sky replica on its roof, achieved with over 1,000 fibre optic lights, and a team of designers spent nine months perfecting it. \\n\\nThe car's exterior is painted with a color scheme that evokes the night sky, and its interior features leather seats in a 'dusk' hue. The clock in the car is decorated with diamonds, adding to the luxurious features.\\n\\nThe Celestial Phantom is the first car to leave Rolls-Royce's West Sussex factory under the BMW regime, which took over the company. The car's 6.75-liter V12 engine produces a significant amount of power, with a 0 to 60mph time of 5.8 seconds and a top speed of 150mph.\\n\\nThe car\",\n", - " \"Here are the highlights from the article about the 100-year-old identical twin sisters Marjorie Gilbert and Winifred Witt:\\n\\n- Identical twin sisters Marjorie Gilbert and Winifred Witt from Cwmbran, South Wales, turned 100 years old on the same day, a rare occurrence, making them one of just 15 sets of twins worldwide to achieve this milestone.\\n- The twins are inseparable and have lived together for most of their lives, even still sharing a nursing home.\\n- They were born in 1913 and grew up sharing clothes, books, and a bed, and remained so close that their own children and families would often treat them as one.\\n- After marrying at 21 and having children, they deliberately moved their families to live together during World War II, solidifying their bond.\\n- After their husbands passed away in 1992, they resumed living together, enjoying activities like playing bingo until they were 95 years old.\\n- The twins'\",\n", - " '**Article Highlights:**\\n\\nHospitals in Aurora, Colorado, received multiple victims after a shooting at a movie theater on Friday. \\n\\n- **Tragic Events**: The shooting resulted in multiple casualties with reports of at least a few hundred rounds fired by a single gunman using a 100-round rifle magazine.\\n- **Denver Health Hospital**: The emergency department received 7 victims and activated a \"mass casualty situation,\" coordinating transport logistics to avoid hospital overloading.\\n- **Staff Response**: Hospitals like Denver Health, Aurora South, and Swedish Medical Center prepared for the influx of patients, having conducted regular drills anticipating such a scenario.\\n- **Injured Patients**: At Denver Health, 5 patients were transferred from another hospital and survived. At Aurora South, 18 patients were treated, including 12 gunshot victims, with some in critical condition.\\n- **Staff Training**: Medical professionals, including experienced physicians and surgeons, treated patients while also dealing with a traumatic situation.\\n- **Team Response**: Hospitals coordinated closely to',\n", - " \"Here are the highlights from the article:\\n\\n**Intermittent Fasting's Rise to Popularity**\\n\\nThe 5:2 diet, a method of intermittent fasting, has gained popularity worldwide with the support of health experts and celebrities, including Beyoncé. Proponents claim it improves cognitive function, increases insulin sensitivity, and may guard against conditions like dementia and diabetes.\\n\\n**Drawbacks of Traditional Fasting**\\n\\nFasting for a few days a week requires counting calories, which can be challenging and tedious, particularly when limiting daily intake to 500-600 calories.\\n\\n**Introduction of LighterLife Fast Packs**\\n\\nTo alleviate the difficulties of fasting, LighterLife has introduced a range of nutritionally complete meal packs designed for 5:2 fasting days. These packs are available exclusively at Superdrug high street stores.\\n\\n**Key Features of LighterLife Fast Packs**\\n\\n* Nutritionally complete meals and snacks in various flavors (e.g., chocolate shakes, vegetable soup, snack bars)\\n* Convenient, just-add-water\",\n", - " \"Here are the article's highlights:\\n\\n1. **Pipe retrieval delay**: The removal of drill pipe from inside the Macondo oil well's blowout preventer is taking longer than expected due to a buildup of hydrates that temporarily jammed the cap.\\n\\n2. **Removal of old blowout preventer**: Once the drill pipe is removed, the old blowout preventer will be replaced with a new one from the nearby ship, Development Driller II.\\n\\n3. **Continued state of emergency**: Certain Florida counties, including seven in the Panhandle, will remain under a state of emergency to qualify for economic aid due to the ongoing spill.\\n\\n4. **Haunting uncertainty**: The condition of a third, longer piece of drill pipe is unclear, which may affect the progress of the operation and lead to a potentially complex solution.\\n\\n5. **Missed timelines**: Due to the uncertainty surrounding the third pipe, Thad Allen, the lead coordinator for the US response, hesitates to give\",\n", - " '**Shocking Abuse of Child Victims in Court**\\n\\nA harrowing trial in 2011 at Stafford Crown Court saw vulnerable child victims of a sex grooming gang being subjected to aggressive questioning by defense lawyers. The victims, some as young as 13, were grilled for 12 days, reliving their traumatic experiences. \\n\\n**Inhumane Treatment of Victims**\\n\\n* One victim was accused of lying and being \"naughty\" by a lawyer.\\n* Another victim was forced to read out her police statement detailing alleged abuse by her stepfather, even though she had withdrawn the allegations.\\n* The victims suffered from psychological distress, with one breaking down in tears.\\n\\n**Judge\\'s Outrage**\\n\\nJudge Robin Onions described the trial as \"shocking\" and \"apalling,\" stating he felt like he\\'d been \"hit over the head with a hammer.\"\\n\\n**Reaction from Authorities**\\n\\n* Keir Starmer, Director of Public Prosecutions, proposed pre-recorded cross-examination sessions to avoid similar treatment in',\n", - " 'A Paris judge has ordered the seizure of luxury goods worth over £11 million from Saudi Princess Maha Al-Sudairi to settle her debts, including unpaid bills from a £5.5 million stay at the Shangri-la Hotel. \\n\\nKey highlights of the case include:\\n\\n- The Princess failed to pay her £5.5 million bill at the Shangri-la Hotel after occupying an entire floor with 60 servants for six months.\\n- She claimed diplomatic immunity when King Abdullah refused to pay her bill, and later moved to the Royal Monceau Hotel.\\n- The Princess has run up unpaid bills of over £14 million in France since 2009 and is known to have used \"payment to follow\" notes, which were often accepted due to her wealthy credentials.\\n- She has been implicated in looting luxury goods from shops, including £100,000 worth of stock from the Key Largo leisure wear store.\\n- A judge has ordered the sale of contents from three storage units',\n", - " 'Comedian Gilbert Gottfried comments on the backlash comedian Daniel Tosh received after making rape jokes at one of his stand-up shows. \\n\\nThe Controversy surrounding Daniel Tosh: \\n- Tosh made rape jokes during a show, sparking outrage online.\\n- A woman called out the jokes from the audience, saying \"rape jokes are never funny.\"\\n- Tosh allegedly replied, \"Wouldn\\'t it be funny if that girl got raped by like five guys right now?\"\\n\\nGilbert Gottfried\\'s Perspective:\\n- As a comedian, Gottfried thinks people should be able to gauge what they find funny and laugh or show their discomfort accordingly.\\n- He shares his own experiences of performing comedy after 9/11, making jokes about terrorism and aftermath, and after a tsunami in Japan.\\n- During these times, Gottfried received backlash, but was able to recover without losing his TV show.\\n- He argues that comedians often face criticism for pushing boundaries and finding humor in serious topics.\\n\\nMain Takeaway',\n", - " \"The article discusses how California's ongoing drought has severe consequences, particularly in rural communities and farmland, but has inadvertently sparked a modern-day Gold Rush. \\n\\n**Key Points:**\\n\\n- The drought in California has exposed previously inaccessible areas, making it easier for prospectors to search for gold.\\n- The dry conditions are estimated to be as bad as during the 1977 drought.\\n- A beginner prospector can make around $5-$200 per day, thanks to low water levels.\\n- Modern prospectors are discovering gold in areas that were previously untouched by the 1849 Gold Rush participants.\\n- The prolonged drought has caused a serious economic impact on farmland, with ten rural communities at risk of running out of water within 60 days.\\n- California has received only 1.2 inches of rain in Los Angeles since July, leading to concerns of traffic accidents and mudslides with the upcoming rain.\\n- A storm is predicted to hit the Los Angeles area this weekend, which could put an end\",\n", - " \"Here are the article's highlights summarized:\\n\\nA sinkhole has formed at Pembroke Dock war cemetery in Wales, swallowing the grave of Private Ryan, a soldier who died in 1915 during World War I. The 20-foot-deep and 6-foot-wide hole was caused by heavy rain that shifted the limestone beneath the coffin.\\n\\n- The Ministry of Defence (MoD) is attempting to fill the sinkhole without exhuming the remains.\\n- Five other graves are at risk of falling into the sinkhole, including those of five other soldiers.\\n- The cemetery, Wales' only military graveyard, is closed temporarily while work is carried out to ensure the graves are safe.\\n- The MoD has been unable to find living relatives of Private Ryan to notify them of the situation.\\n- The cemetery will reopen by the end of March after the sinkhole is filled, in time for a service to mark the centenary of World War I in August.\\n- The incident is a major concern for the\",\n", - " 'Here are the highlights from the article:\\n\\n- Patrick Rock, a key advisor to the Prime Minister, has been arrested on suspicion of child porn offenses.\\n- Rock, a 62-year-old senior figure in David Cameron\\'s inner circle, was a fellow Tory adviser in John Major\\'s government.\\n- He resigned from his position at Number 10, the UK government\\'s official residence, after the National Crime Agency (NCA) was called in to investigate a potential offense, but the reason for his resignation was not publicly disclosed.\\n- Rock was arrested almost three weeks ago, but the arrest was kept secret until details were leaked to the press.\\n- His relative, Simon Rock de Besombes, claims that Rock\\'s resignation and arrest could be the result of \"revenge or jealousy\" and maintains that Rock is \"to date, innocent.\"\\n- The government has faced criticism over why it took three weeks for the arrest to be made public, and Labour is demanding an investigation into the timing of the arrest',\n", - " \"The Tour de France is rolling into Yorkshire, UK, bringing a £100 million boost to the local economy. Locals are showcasing their entrepreneurial spirit by renting out homes and gardens along the route, with some charging up to £10,000. Hotels have seen a significant increase in room rates, and farmers' fields and village pitches have been transformed into campsites and car parks.\\n\\nThe county has invested £6 million in road repairs to ensure a smooth journey for the cyclists. However, some residents have criticized the lack of attention given to roads in poor condition. Cyclist Marcel Kittel has expressed concerns about the narrow roads, but the event is expected to be a huge success.\\n\\nA variety of creative preparations are underway, including:\\n\\n* A handmade Eiffel Tower in Burley-in-Wharfedale\\n* A model of a cyclist on a house in North Stainley\\n* The Bank View Cafe in Langsett repainted in the colors of the King of the Mountains jersey\\n*\",\n", - " 'Frank Cramp, a 94-year-old Royal Marine veteran, has been awarded his second green beret after he mistakenly gave his original one away 60 years ago. \\n\\nKey Points:\\n\\n- Frank Cramp, a veteran of D-Day, single-handedly took out a German machine-gun post during the Normandy landings in 1944.\\n- He gave up his first green beret when he left the army in 1954, unaware he was allowed to keep it.\\n- After six decades, Frank was finally given a new green beret as a replacement by the Navy as a token of recognition.\\n- The ceremony took place on Dartmoor, Devon, where modern-day Royal Marines receive their green berets.\\n- Frank Cramp was praised by Lt Col Richard Cantrill, Commanding Officer of 42 Commando, for his bravery and selflessness.\\n- The Royal Marines Association was instrumental in re-presenting Frank with the recognition he deserved.',\n", - " \"Here are the article highlights in brief:\\n\\nThe Marussia Formula One team has concluded its investigation into the test crash that left Maria de Villota with serious injuries, including the loss of her right eye. \\n\\nKey points:\\n\\n* The team ruled out a mechanical fault in the MR01 car as the cause of the crash.\\n* Multiple investigations were conducted by the team, the Health and Safety Executive (HSE), and an external forensic body.\\n* The team has finished its investigation and is focusing on supporting Maria de Villota's recovery.\\n* The team will continue its preparations for the German Grand Prix, taking place on the weekend.\\n\\nOverall, the team has absolved the car as the cause of the unfortunate incident but is now shifting its focus to Maria's wellbeing.\",\n", - " \"The key highlights from the article are:\\n\\n1. Sporting Gijon is expected to lose striker Stefan Scepovic to Celtic in a deal worth less than the originally asked £3.2 million.\\n2. The Serbian striker didn't play for Sporting Gijon recently to avoid getting injured and affecting the negotiations.\\n3. The club needs to sell Scepovic urgently and is expected to accept a lower offer from Celtic within the next 72 hours.\\n4. Celtic manager Ronny Deila is also set to finalize a loan deal for Rubin Kazan winger Wakaso Mubarak, who could join the team this week.\",\n", - " \"Middlesbrough are on the verge of signing Genk's 25-year-old striker Jelle Vossen for around £5 million. However, Genk is holding out for the full price, while Middlesbrough wants to pay less.\\n\\nAdditionally, Middlesbrough has welcomed back Nigerian centre-back Kenneth Omeruo on a loan from Chelsea, with Omeruo citing his positive experience with the team's manager Aitor Karanka and the club's atmosphere as reasons for returning.\\n\\nThe signings come at a time when Middlesbrough is in need of a goal-scorer, with their previous six strikers failing to reach double-digit goal totals last season.\",\n", - " \"Here are the highlights from the article about The Players Championship at TCP Sawgrass:\\n\\nMartin Kaymer wins his first tour triumph since 2011 after overcoming adverse weather conditions and a tough finish. He trailed for a brief period on Sunday, but regained his lead with a clutch putt on the 17th hole and secured a 13-under-par one-shot victory.\\n\\nJim Furyk came in second, while Jordan Spieth finished tied for fourth after carding his first bogey of the week on the fifth hole and struggling with his game for the rest of the round. \\n\\nThe victory secures Kaymer's first win in over a decade and earns him a prize of $1.8 million.\",\n", - " \"The article highlights the following key points:\\n\\n* Britain's aid spending increased by 28% in 2013, making it the largest jump among European countries.\\n* The UK's aid budget rose to £10.6 billion, placing it second only to the US, with the US spending £18.9 billion on overseas aid.\\n* Britain achieved its target of spending 0.7% of its GDP on overseas development.\\n* Despite the increase, Germany, France, and Russia had lower aid spending ratios at 0.38%, 0.41%, and 0.03% respectively.\\n* The Organisation for Economic Co-operation and Development (OECD) expressed concern over declining aid spending in sub-Saharan Africa, while countries like China and India experienced rising aid budgets.\",\n", - " \"The results of the Reader's Digest annual trust rankings survey have been released. Here are the highlights:\\n\\n* Malcolm Turnbull ranks 69th, 10 spots ahead of Prime Minister Tony Abbott, who ranks 79th.\\n* Opposition leader Bill Shorten is joint 81st with Nationals MP Barnaby Joyce.\\n* Neurosurgeon Charlie Teo remains the most trusted individual for the second consecutive year.\\n* Paramedics remain the most trusted professionals for the 10th year running, followed by firefighters, rescue volunteers, nurses, and doctors.\\n* Business leaders have mixed results, with billionaire James Packer ranking 85th and electronics entrepreneur Dick Smith ranking 10th.\\n* Convicted drug smuggler Schapelle Corby ranks 99th and her sister Mercedes ranks 100th as the least trusted Australians.\",\n", - " \"The article discusses the debate on gun control and background checks in the US, following various mass shooting incidents. Here are the highlights:\\n\\n**Background Checks and Their Limitations**\\n\\n- Over 90% of Americans support background checks, particularly at gun shows.\\n- Background checks did not prevent mass shootings in Newtown, Aurora, Tucson, and Virginia Tech.\\n- The National Instant Criminal Background Check System (NICS) missed potential gun buyers, including the gunman in Tucson.\\n\\n**Notable Shooting Cases**\\n\\n- Newtown: Adam Lanza used legally purchased guns, and background checks were not conducted on his mother's firearm purchases.\\n- Aurora: James Holmes purchased guns legally, despite his name being submitted to NICS.\\n- Tucson: Jared Loughner's application was not flagged due to a system mistake.\\n- Virginia Tech: Seung-Hui Cho was deemed mentally ill by a judge, a disqualifying factor, but the background check system failed to identify him.\\n\\n**Current Proposals and Controversies**\\n\\n\",\n", - " 'Here are the article\\'s highlights:\\n\\n- Hackers claiming to be from the group Anonymous threatened to release sensitive information about the US Department of Justice in response to the death of Internet activist Aaron Swartz. \\n\\n- Swartz, 26, had faced federal computer fraud charges that could have resulted in 35 years in prison.\\n\\n- The hacker group claims the justice system is responsible for Swartz\\'s death and threatened to release \"embarrassing information\" to news outlets if the system isn\\'t reformed.\\n\\n- Anonymous hacked the website of the US Sentencing Commission and posted a lengthy, eloquently written message signed \"Anonymous.\"\\n\\n- The FBI confirmed it is investigating the threat and considers it a crime.\\n\\n- Anonymous also accused the FBI of infiltrating its ranks and criticized the federal government\\'s \"highly disproportionate sentencing.\"\\n\\n- The hacking incident temporarily brought down the US Sentencing Commission\\'s website, but it was restored later the same day.\\n\\n- The hacktivists created \"warheads\" (chunks',\n", - " \"Highlights from the article are as follows:\\n\\nA 9-year-old boy named Hector Montoya was initially saving for a PS4 gaming system but decided to spend his $300 to purchase smoke detectors after hearing a tragic story about a fire that claimed the lives of a mother and child due to no smoke detector.\\n\\nWith the help of the Grand Prairie Fire Department, Hector installed over 100 smoke detectors in the homes of needy residents, mostly the elderly.\\n\\nHector's act of kindness inspired his new friends, siblings Ashton and Peyton Harder, to buy him a PS4 as a thank-you gift. They drove 45 minutes from Dallas to deliver the gift, along with $150, to continue Hector's mission.\\n\\nDespite initially giving away his gift money, Hector was overjoyed with the kind response and expressed his intention to continue saving and donating to those in need of smoke detectors.\",\n", - " 'The UK census is set to transition to an online format to save taxpayers around £400 million. The change comes with the next census in 2021. The online census will:\\n\\n- Replace paper forms with online submissions, with paper forms available for those unable to use technology.\\n- Hire enumerators with iPads to assist those struggling with the online format.\\n- Use tax and NHS records to fill gaps and keep population estimates up-to-date between censuses.\\n\\nKey points from the article include:\\n\\n- The move requires new legislation to use publicly-held data for the census, which raises concerns about personal privacy.\\n- The 2011 census showed 94% participation and detected an extra 500,000 immigrants. \\n- Cabinet Office Minister, Francis Maude, aimed to reduce costs by reforming the census, with an estimated £1 billion expense for a repeat paper-based census in 2021.\\n- The online approach could be implemented for £625 million.\\n- A backup survey of 4',\n", - " \"A California police officer, Laura Weintraub, has been placed on administrative leave after a video she posted to YouTube sparked controversy. The video, part of her 'Cup Holder Commentary' series, expresses her hatred towards bicyclists. In the video, she asks her husband how much he would have to be paid to run over a cyclist and ends with an image of a 2008 bike crash in Mexico that killed one person and injured 10 others. The video gained attention from her supervisors, and her department, the Santa Paula Police Department, placed her on leave pending an investigation. A second reserve officer was also placed on leave for responding to comments on the department's Facebook page. The video was removed from Weintraub's YouTube channel, but a copy remains online.\",\n", - " \"**New York City Agrees to Pay $98 Million to Minority Firefighters in Discrimination Settlement**\\n\\nNew York City has agreed to pay $98 million in back pay and benefits to entry-level firefighters who claim the city's fire department used a biased entrance exam to discriminate against African-American and Latino candidates. The settlement follows a 2007 lawsuit filed by the US Department of Justice, which alleged the exam was unfair and didn't properly assess candidates for the job.\\n\\n**Key Highlights:**\\n\\n1. **Settlement:** New York City will pay $98 million to back pay and benefits to minority firefighters.\\n2. **Background:** The US Justice Department sued the city in 2007, alleging bias in the entrance exam since 1999.\\n3. **Settlement ordering:** A US district judge ordered the city to pay $128 million and hire 293 black and Latino applicants who pass the hiring process.\\n4. **Implementation:** The first groups of minority firefighters joined the FDNY in 2013\",\n", - " '**Highlights from the Article:**\\n\\n1. **Tory plans to scrap stamp duty on properties worth up to £250,000 in Wales**: A proposal to abolish stamp duty in Wales, making home ownership more affordable for first-time buyers.\\n\\n2. **Different tax rates between England and Wales**: This move will put pressure on Chancellor George Osborne to promise the same for England, as it may make buying a home in England more expensive compared to Wales.\\n\\n3. **Cost of £20 million for Wales**: The cost of scrapping stamp duty on properties up to £250,000 in Wales is estimated to be around £20 million.\\n\\n4. **Increased house prices**: House prices in Wales are up 5.4%, London is up 11.6%, the South East is up 4.5%, and the West Midlands is up 4.4%.\\n\\n5. **Tory goal for Wales as a nation of homeowners**: Welsh Conservatives aim to make Wales a place of low tax and',\n", - " 'Here are the key highlights from the article:\\n\\n* Ahmed Raofi, 29, an Afghan minicab driver, was jailed for 6 years for attempting to abort his unborn child with his mistress Irene Santos while she was pregnant.\\n* Raofi became enraged when Santos refused to terminate the pregnancy and hatched a plan to kill the fetus without her consent after researching online.\\n* On April 9, 2023, he invited Santos to his flat, taped her hands and feet, and forced poisonous pills into her womb.\\n* Santos miscarried a 19-week-old fetus, which showed signs of life and breathed and moved for at least 10 minutes outside the womb.\\n* The court heard that Raofi had initially tried to take Santos to an abortion clinic, but she refused, and he then planned to \\'punch the baby out\\' of her at 7 months pregnant.\\n* Judge Aidan Marron stated that Raofi \"denied a woman a much-wanted child\" and',\n", - " \"During World War One, a unique chapter in women's football emerged when thousands of female munition factory workers formed teams. The Blyth Spartans Munitionettes from Northumberland stood out, playing beautifully and remaining unbeaten for two years. \\n\\nTheir star center-forward, Bella Raey, a coal miner's daughter, scored an impressive 133 goals in one season. The Munitionettes won the Munitionettes Cup, a knockout tournament in 1918, with a record-breaking crowd of 22,000 spectators. The team defeated Bolckow-Vaughan from Middlesbrough with Bella Rae scoring a hat-trick.\\n\\nBella Raey went on to play for England, showcasing the women's football team's skills. However, after the war, the munition factories closed, and female teams disbanded. The Football Association also banned women's football at their grounds in 1921.\",\n", - " \"Here are the article's highlights:\\n\\n**Robot Submarine Completes First Scan**\\n\\n- The U.S. Navy's Bluefin-21 underwater drone has finished its first full scan of the Indian Ocean, collecting data to find Malaysia Airlines flight MH370.\\n\\n**Depth and Coverage**\\n\\n- The Bluefin-21 spent 16 hours scanning the seabed 4.5 km deep and covered approximately 90 square kilometers.\\n\\n**Search Efforts**\\n\\n- The search for MH370, which has been ongoing for 40 days, is now in a new phase, with the Bluefin-21 drone leading the methodical search under the Indian Ocean.\\n- Up to 10 military aircraft, 2 civil aircraft, and 11 ships continue to search an area of about 40,000 square kilometers.\\n\\n**Missing Aircraft Analysis**\\n\\n- Authorities believe the Indian Ocean, 2,000 km west of Perth, is the most likely area where the plane crashed, but so far, there have been no signs of\",\n", - " 'David Moyes\\' return to Everton\\'s Goodison Park as Manchester United\\'s manager ended in a disastrous 2-0 defeat, dashing their chances of Champions League qualification. Everton\\'s win, their 20th under manager Roberto Martinez, marked a turning point in their season, just one point behind fourth-placed Arsenal. \\n\\nMoyes was left disappointed with his team\\'s performance, labeling their defending as \"rank and rotten,\" after they conceded two sloppy goals. Phil Jones\\' handball led to Leighton Baines\\' penalty, and Alex Buttner\\'s mistake allowed Kevin Mirallas to score from a tight angle. \\n\\nEverton dominated the midfield, while Wayne Rooney and Jonny Evans struggled against Romelu Lukaku, who caused problems for the United defense. Despite Moyes\\' attempts to put a positive spin on the loss, the season is now over for United, marking the first time in 19 years they have failed to qualify for the Champions League under a manager.\\n\\nIn contrast,',\n", - " \"Here are the highlights from the article:\\n\\n1. Illinois Congresswoman Tammy Duckworth, a Iraq veteran, has given birth to her first child, a daughter named Abigail O'kalani Bowlsbey, two weeks after winning a second term in the U.S. House.\\n\\n2. Duckworth, 46, used assisted reproductive technology to conceive and gave birth seven weeks before her due date of December 5.\\n\\n3. Abigail's middle name O'kalani comes from Hawaiian Senator Daniel Akaka, who acted as a Hawaiian elder and friend of the family.\\n\\n4. Duckworth and her husband Bryan, a Major in the National Guard, were overjoyed with the early arrival of their baby girl.\\n\\n5. As a disabled veteran who lost both legs in a 2004 helicopter crash in Iraq, Duckworth inspires with her determination and perseverance, making history as the first disabled female veteran to serve in the House.\\n\\n6. Interestingly, Duckworth joins a group of four\",\n", - " \"Highlights from the article include:\\n\\n1. **Pope Francis' act of compassion**: The Pope showed kindness to a severely disfigured man during a weekly audience in St. Peter's Square, embracing and blessing him, just like he did with Vinicio Riva two weeks prior.\\n\\n2. **The Pope's 'Papal' style**: Known for making personal calls, inviting the homeless to dine at St. Peter's Square, and washing the feet of young offenders, Pope Francis' actions have revitalized the Catholic Church, making a huge impact on the faithful.\\n\\n3. **Catholic congregations surge worldwide**: The so-called 'Pope Francis Effect' has seen a 20% rise in Catholic congregations in Britain, with increases reported in Europe, the US, and Latin America.\\n\\n4. **Italy's priestly support**: Half of priests in Italy have noted a significant rise in support for the Church, with youth and lapsed Catholics surging back to the confessional.\\n\\n\",\n", - " \"**Libya Conflict Continues: 9 Soldiers Killed in Benghazi**\\n\\n Libyan government forces clashed with Islamist militants in Benghazi earlier this week, resulting in the deaths of at least 9 soldiers and 19 wounded. The attack began when Ansar al Sharia and other armed groups targeted the Benghazi security directorate headquarters. The government condemned the attack and praised the bravery of the special forces that intervened to regain control of the area.\\n\\n**Key Points:**\\n\\n- At least 9 soldiers killed and 19 wounded in Friday's fighting\\n- Ansar al Sharia and other armed groups attacked the Benghazi security directorate headquarters\\n- The United States has designated Ansar al Sharia a terrorist organization for its role in 2012's US consulate attack\\n- The security situation in Benghazi has been plagued by near daily assassinations and kidnappings targeting security forces\\n- US officials have expressed concern over Libya's instability and pledged support to the country in its fight against radical militant groups\",\n", - " 'Here are the article highlights:\\n\\n**Far-Right Rise in Germany**: The article highlights the growing presence of neo-Nazis in the small village of Jamel in northeastern Germany. The village is predominantly settled by neo-Nazis who identify as \"free, social, and national.\"\\n\\n**Violent Extremism**: Reports have surfaced of pro-Hitler parties, vandalism, and harassment targeting non-extremist residents. Residents use guard dogs and fences to warn off outsiders, underlining their degree of isolationism.\\n\\n**NPD Connections**: The village is near the headquarters of the German National Democratic Party (NPD), a far-right organization with 5 MPs in the regional parliament and close ties to one of its members, Sven Krueger, who was jailed for possessing a machine gun and handgun.\\n\\n**Recent Trial**: The trial of Beate Zschaepe, accused of complicity in the National Socialist Underground\\'s murder of eight men, a policewoman, and a bombing campaign',\n", - " \"The article highlights two key matches from La Liga. \\n\\nIn the first match, Atletico Madrid won 2-1 at the Bernabeu, the home stadium of their rivals Real Madrid. This was Atletico's second win in a row at the Bernabeu. They were led by goals from Tiago and Sergio dies after being down to 1-1 with Real. Real's poor performance has put them 11th in the table with just three points from three matches, while Atletico moved to second in the table with seven points.\\n\\nIn the second match, Barcelona maintained their 100% start to the season with a late victory over Athletic Bilbao, securing their third win out of three under new manager Luis Enrique. Neymar scored a brace in the final 10 minutes of the match to seal the win. Barcelona started their match in their home stadium wearing a special red and yellow kit to mark the 300th anniversary of Catalan National Day.\",\n", - " 'Here are the highlights from the article:\\n\\n**Big Cat Sightings in Gloucestershire and Essex**\\n\\n- After a reported lion sighting in Essex, leading to a 24-hour search by police, some wildlife experts claim they have identified a shadowy beast in the Gloucestershire countryside.\\n- A photo taken by a trip camera in February 2012 appears to show a large, furry black figure sprinting through woodland, sparking speculation it could be the \"Five Valleys big cat.\"\\n- Big cat tracker Frank Tunbridge believes this image suggests big cats, possibly a puma or leopard, roam the area and says it matches similar sightings in Gloucestershire and beyond.\\n- Residents in Gloucestershire have reported seeing a large black panther-like creature, which also matches eyewitness descriptions of the Essex lion.\\n- Eventually, the Essex search found no trace of the lion, but witnesses still insist they saw a large cat, which is now believed to be a domestic cat named Teddy Bear, a 25',\n", - " '**Scotland\\'s Largest Pedophile Ring Dismantled**\\n\\nA Scottish court has convicted eight men of child sexual abuse in what is described as the largest pedophile ring ever dismantled in Scotland. \\n\\n**Key Highlights:**\\n\\n1. **Convictions:** Eight men were convicted of child sexual abuse-related offenses, with three also found guilty of sexually abusing young children and five conspiring to do the same to a child known as Child F.\\n2. **Evidence Gathered:** Investigators recovered \"tens of thousands\" of child abuse images and videos, aided by international collaboration, including the FBI and Microsoft.\\n3. **Expert Help:** The police received invaluable assistance from academics and organizations specializing in forensic techniques, such as steganalysis.\\n4. **Sentencing:** Two men, Neil Strachan and James Rennie, may face up to life in prison, while the others will receive lesser sentences.\\n5. **Child Abuse Network:** The investigation revealed a network of individuals',\n", - " \"Here are the article highlights:\\n\\nHope Solo, a US women's soccer star, was arrested at her sister's house in Seattle after a domestic violence altercation. \\n\\n- Solo was at a family barbecue on June 11, arriving intoxicated and argumentative after missing a flight.\\n- The 17-year-old nephew alleges Solo physically and verbally assaulted him and his mother, hitting the nephew with a broomstick.\\n- The attack allegedly started when Solo became upset over an argument with her nephew, calling him names, including 'fat' and 'p****'.\\n- Police responded to a 911 call and found Solo intoxicated and upset, with her nephew and sister sustaining visible injuries.\\n- Solo was arrested and charged with two counts of fourth-degree domestic violence assault.\\n- Her next court appearance is scheduled for August 11.\\n- Solo's defense team maintains she was the victim in the altercation and is innocent.\\n- This is not Solo's first incident involving police, as she was involved in a similar altercation in \",\n", - " \"A mother's frustration is revealed in an article as she recounts the struggles of allowing her 10-year-old daughter Sophie to have a love for the color pink. Despite society's perception that girls who like pink are being limited in their aspirations, the mother and daughter's story emphasizes that it's not about pink stymieing girls' development, but about allowing children to express themselves freely.\\n\\nKey highlights include:\\n\\n1. The mother's daughter, Sophie, has consistently chosen pink as her preferred color, even in the face of her family having three brothers and a more tomboyish environment.\\n2. Critics, such as the Independent Association of Prep Schools and some MPs, claim that-girls being exposed to pink leads to being confined to traditional feminine roles.\\n3. Research suggests that there is no link between the marketing of pink-toy and career aspirations.\\n4. Modern feminism has, ironically, contributed to constraining girls' identities by urging for the elimination of traditional colors like pink, highlighting the failure\",\n", - " \"Here are the article's highlights:\\n\\n1. **Cold weather forecast**: Britain is expected to witness a deep freeze, with temperatures plunging to -8C (18F) in rural areas. This is part of a prolonged cold snap that will last throughout the month.\\n\\n2. **Snow and ice warnings**: Weather warnings have been issued for ice and snow across the country, with forecasters predicting snow in London, Surrey, and Hampshire by Thursday.\\n\\n3. **Flooding concerns**: Residents who were affected by last week's floods are warned to expect around an inch of rain, posing a risk of localised flooding and hazardous driving conditions.\\n\\n4. **Snow and winter conditions**: The UK can expect sleet, snow, and hail for most of the week, with Scotland seeing the most significant effects, including four inches of snow expected tomorrow and another four inches later in the week.\\n\\n5. **Record-breaking winter**: Many believe that Britain could be heading towards one of its coldest winters on record\",\n", - " \"Here are the highlights from the article:\\n\\n**Prince Philip receives birthday gift from the Queen**\\n\\n* The Queen gave Prince Philip the title of Lord High Admiral of the Navy, a position that dates back to the 14th century, as a 90th birthday gift.\\n* Prince Philip received the Letters Patent in the Admiralty Boardroom at Admiralty House, where he also watched a display of precision drumming by the Royal Marines Corps of Drummers.\\n\\n**The Royal Navy's decline**\\n\\n* The article suggests that the Queen may have been concerned about the decline of the Royal Navy's strength since 1977, with a chart showing the current strength of the Navy.\\n* The number of warships in the Royal Navy has fallen dramatically over the past 30 years.\\n\\n**Prince Philip's naval career**\\n\\n* Prince Philip was a promising naval officer who had to give up his career to support the Queen after his father-in-law's health declined.\\n* He left the Navy in 1951 to become\",\n", - " \"For the first time, U.S. public schools are expected to have more minority students than non-Hispanic white students this fall, a shift driven by growth in Hispanic children due to immigration and higher birth rates. \\n\\nHere are the key highlights:\\n\\n- Minority students, including Hispanic, black, Asian, and Pacific Islanders, will make up the majority in U.S. public schools for the first time.\\n- Hispanic students account for about one-quarter of minority students, while 15% are black and 5% are Asian and Pacific Islanders.\\n- U.S. school demographics mirror the changing nation as a whole, with the country's population expected to have more minorities than whites by 2043.\\n- The shift brings challenges like increased need for English language instruction, changing school menus, and addressing racial tension.\\n- Some schools are experiencing racial divisions, reflecting broader U.S. housing patterns, with minority students often attending under-resourced schools and facing harsher discipline.\\n- Educators emphasize the importance of\",\n", - " 'Some remarkable moments and people throughout 2014 showcased the resilience and kindness of humanity. Here are five inspiring highlights that demonstrate gratitude and positivity:\\n\\n1. Ibrahim Hamadto, a young Egyptian para-table tennis player, did not let a life-changing accident stop him from chasing his dreams. Despite losing both arms, he practiced diligently for three years and achieved success.\\n\\n2. Through the power of social media, several people were reunited with long-lost family members this year. Twins separated at birth used Facebook to reconnect, and a woman found her birth mother after searching online.\\n\\n3. Favorable acts of kindness were witnessed throughout the year, such as a bartender receiving a $1,000 tip, and a community raising over $22,000 for a man wrongly targeted by police due to his resemblance to a suspect.\\n\\n4. North America experienced a rare occurrence – two blood moons – giving people a rare experience.\\n\\n5. A 100-year-old woman, Ruby Holt, fulfilled her lifelong dream of',\n", - " \"Here are the article's key highlights:\\n\\n- Raúl Castro, the brother of Fidel Castro, is expected to take over as Cuba's new president after Fidel's announcement to resign as president and commander-in-chief of the armed forces after 49 years in power.\\n\\n- Raúl Castro has been known for his ruthlessness but has also attempted to bring in more capitalism to Cuba, especially through free enterprise farmers markets.\\n\\n- He has been preparing for the transition, initiating a national debate six months ago to address high unemployment and economic concerns in Cuba.\\n\\n- Raúl Castro is seen as more down-to-earth and practical in contrast to Fidel, who is known for being more charismatic but stiff in social situations.\\n\\n- Despite a reputation for being a hard-liner early in the revolution, Raúl Castro says only the Communist Party can guarantee continuity, with the military firmly behind him.\\n\\n- As Fidel steps down, Raúl Castro is expected to introduce a more democratic society,\",\n", - " 'Here are the article\\'s highlights:\\n\\n**Regime Status:** Leaders of the rebellion against Libya\\'s Moammar Gadhafi are in control most of Tripoli, but fighting continues. Gadhafi\\'s forces still hold some strongholds, including the Rixos Hotel.\\n\\n**Capture Claim:** Gadhafi son Saif al-Islam appeared at the Rixos Hotel, stating his father and several sisters are safe in Tripoli. He claimed to have been tricked into being thought captured by the rebels and went on to say that government forces had defeated the rebels.\\n\\n**ICC Involvement:** Gadhafi\\'s son, Saif al-Islam, who is wanted for war crimes, said, \"To hell with the ICC,\" in response to a warrant for his arrest.\\n\\n**NATO Involvement:** NATO has been providing airstrikes against pro-Gadhafi forces, and their warplanes have been seen over the city. The alliance has condemned the use of Scud missiles by G',\n", - " \"Here's a summary of the article's highlights:\\n\\nA Delta Air Lines flight, Delta 1921, made an emergency landing at the Colorado Springs airport after the captain reported engine problems. The Boeing 757, flying from Detroit to Phoenix, experienced issues with one engine and a faulty rear wheel alarm during landing. A fire occurred in the main landing gear. Two passengers suffered minor injuries during the evacuation process, which was carried out using emergency slides from the side of the aircraft.\",\n", - " \"Tamara Beckwith-Veroni, a 44-year-old television celebrity, was fined £900 for failing to reveal who was driving her Porsche when it was caught speeding. Beckwith-Veroni, who has appeared on various TV shows, pleaded guilty to the charge through a letter, citing that she was seven months pregnant and unsure who was driving at the time. \\n\\nShe stated that a visitor claimed to have been in the area, but not driving, and that she found it difficult to clarify the situation. \\n\\nAs a result, the court imposed six penalty points on her driver's license and ordered her to pay £175 in costs, including £85 for costs and £90 as a victim surcharge.\",\n", - " \"Muhammad Ali, the legendary boxer, has made a significant recovery after being hospitalized over the weekend with a mild case of pneumonia. His team of doctors aims to discharge him soon. Here are the highlights from his remarkable career and life:\\n\\n- Ali won an Olympic gold medal at 18 in the light-heavyweight division.\\n- He became the world heavyweight champion in 1964 after beating Sonny Liston.\\n- Ali converted to Islam and changed his name from Cassius Clay to Muhammad Ali in 1964.\\n- He was an outspoken opponent of the Vietnam War and refused to serve in the military due to his religious beliefs.\\n- Ali retired from boxing in 1981 and was diagnosed with Parkinson's disease in 1984.\",\n", - " \"Here are the highlights from the article:\\n\\nA video has been shared on YouTube by Alex Steel, showing a brushtail possum breaking into his kitchen in search of food. The possum, native to Australia, was distracted by a loaf of bread and refused to leave the premises despite Steel's requests. \\n\\nSteel used a wooden spoon to gently coax the possum outside, eventually nudging it in the right direction after it got stuck between a toaster and kettle. After almost three minutes, the possum finally left the kitchen with a piece of bread clutched in its paws. The video has gained over 65,000 views and has been described as the 'cutest home invasion' by some viewers.\",\n", - " \"Mathew Vaea, the manager of the Samoan rugby team, has been fined by his village after misbehaving at the 2011 World Cup. He was ordered to provide 100 pigs as payment for tarnishing his village's honor by drinking regularly and treating the campaign like a holiday. Vaea instead paid a fine of 2,000 Samoan tala (£535) and made a formal apology to village leaders. His actions followed a damning report by Samoan captain Mahonri Schwalger, who accused Vaea of being unprofessional and distracted. The incident led to Vaea's village, Leauva'a, lowering his ceremonial title and raising a significant fine.\",\n", - " \"**Syrian Refugee Crisis in Lebanon: Key Highlights**\\n\\n* Over a million Syrians have fled to Lebanon, making up nearly 30% of its population, due to the ongoing war.\\n* Most refugees have limited financial resources and struggle to find affordable shelter, sometimes settling for cramped and makeshift living quarters like garages without basic amenities like plumbing and electricity.\\n* The cost of renting land or shelter has increased significantly, with many families struggling to make payments.\\n* Many refugees, like Adla's family, face extreme difficulties making ends meet, leading to sacrifices in basic necessities like food and healthcare.\\n* The UNHCR reports that only 1% of Syrian refugees live in rent-free collective shelters, leaving hundreds of thousands without a stable and secure place to live.\\n* Organizations like Concern Worldwide are working to convert unused buildings into safe, rent-free housing, but more options are desperately needed to support the influx of new arrivals.\\n* The future of Syria's next generation hangs in the balance, as many families\",\n", - " 'US federal prosecutors have charged two men, Daniel Cowart (20) and Paul Schlesselman (18), both self-described white supremacists, with plotting a violent attack on African-Americans. The plan included attempting to kill more than 100 people and behead 14 of them. They also planned to target and attempt to assassinate President Barack Obama, dressed in white tuxedos, by crashing a car into him while shooting from the windows.\\n\\nThe suspects were arrested outside Jackson, Tennessee, after an aborted robbery attempt and shot out a church window on their way back to their home. They claimed they were willing to die in their mission, but backed out when they saw people near the target.\\n\\nThis is not the first time there have been threats against Obama. The Secret Service is investigating and taking the matter seriously, despite the suspects having no history of attending any Obama events or drawing Secret Service attention.',\n", - " 'British Transport Minister Baroness Susan Kramer gave a pocket watch to the Taipei mayor, Ko Wen-je, which is considered an inauspicious gift in Chinese culture as the word for watch/clock translates to \"the end\" or death-related terms. Kramer apologized for the oversight, citing her lack of knowledge about Chinese customs.\\n\\nMayor Ko Wen-je received the gift poorly, saying he\\'d give it away or sell it for money, despite the alleged rudeness, he has since apologized and plans to take diplomacy etiquette training.\\n\\nThis situation parallels a 2009 controversy involving then-US President Barack Obama\\'s gifts of DVDs to British Prime Minister Gordon Brown (non-compatible format) and a Victorian-era ship timber pen holder from Brown, which Obama also made an unconventional gift: an iPod loaded with US footage to Queen Elizabeth II in the same year.',\n", - " \"Here are the key highlights from the article:\\n\\n**Resignations in Turkish Government:**\\n\\n- Three cabinet ministers (Urbanization and Environment Minister Erdogan Bayraktar, Economy Minister Zafer Caglayan, and Interior Minister Muammer Guler) resigned due to an anti-graft probe involving allegations of corruption, money laundering, and bribery.\\n- Erdogan Bayraktar also asked Prime Minister Recep Tayyip Erdogan to step down.\\n\\n**New Appointments and Cabinet Reshuffle:**\\n\\n- Prime Minister Erdogan announced a cabinet reshuffle, naming 10 new ministers, including Efkan Ala as the new interior minister, Idris Gulluce as urbanization and environment minister, and Nihat Zeybekci as the nation's new economy minister.\\n\\n**Power Struggle with Fethullah Gulen:**\\n\\n- The crackdown is believed to be a move against former ally turned rival Islamic cleric Fethullah Gulen, who lives in the US and is accused of trying to establish\",\n", - " \"Here are the highlights from the article:\\n\\n- Kraft, the owner of Cadbury, has invested £6 million to change the way Dairy Milk bars are displayed at store checkouts.\\n- For the past 186 years, Cadbury bars have been stacked flat in boxes, but Kraft wants to display them upright to increase impulse purchases.\\n- Research found that customers are more likely to buy a Dairy Milk bar if they see a complete bar of chocolate rather than just its side.\\n- The new packaging will be implemented at Cadbury's factory in Birmingham, starting in the new year.\\n- The change aims to make the bars stand out on store shelves and will be rolled out in the first half of 2012.\\n- Kraft has made this investment despite announcing its plan to cut 200 jobs earlier this month, with some job losses set to take place in March.\",\n", - " \"Here's a summary of the article in clear and concise language:\\n\\n**Abandoned Hotel in Germany**\\n\\n* A hotel in Germany has been abandoned for over two decades.\\n* The hotel, once a popular destination, is now overgrown with moss and vines.\\n* The hotel's interior is in a state of decay, with broken furniture and crumbling walls.\\n* Despite its disrepair, the hotel still contains interesting features, such as a retro bar and a swimming pool.\\n* A photographer, Andre Govia, captured the hotel's abandonment through a series of haunting pictures.\\n\\n**Abandoned Observatory in Spain**\\n\\n* The Mohon del Trigo observatory in Spain has been abandoned for nearly 40 years.\\n* Built in 1902, the observatory was once a hub for astronomers from around the world.\\n* The observatory is still owned by the University of Granada and features a rusting dome and mangled telescope.\\n* The interior is in a pitiful state, with graffiti and signs of\",\n", - " \"The article highlights four international styles for a New Year makeover: French, Spanish, New York, and Italian. Each stylist from a different country shared their approach to fashion. \\n\\n- French style emphasizes following strict rules, including wearing hemlines below the knee, navy, white, grey, and black colors, which results in a classic look.\\n- Spanish style is about being bold with figure-hugging, overtly feminine clothes, short, fitted jackets, and bright colors.\\n- New York style is characterized as relaxed elegance, featuring tailored suits, soft blouses, and muted colors.\\n- Italian style is described as flamboyant, showcasing figure-hugging clothes that accentuate curves, with an emphasis on looking polished and glamorous.\\n\\nAnnabel's verdicts reflected a personal take on each outfit, with a more reserved response to the French and New York styles compared to the bolder Spanish and Italian outfits, which she enjoyed more and graded higher.\",\n", - " 'Here are the main points from the article:\\n\\n- Darren Wilson, a 28-year-old white police officer with 6 years of experience, shot and killed an unarmed 18-year-old African-American man named Michael Brown in Ferguson, Missouri.\\n- The officer\\'s name was initially withheld due to death threats, but was later revealed by Police Chief Thomas Jackson, citing the officer\\'s devastation over the incident.\\n- The Ferguson police department released documents stating that the officer, Wilson, believed he was responding to a \"strong-arm\" robbery at a convenience store where Brown was the suspect, although some in the community are skeptical of this claim.\\n- The police also released surveillance footage allegedly showing Brown committing the robbery, which some attribute to a police cover-up and others question the circumstances.\\n- The timing of the release of this information has been met with anger and accusations from Brown\\'s family, who claim that the police are trying to justify the shooting of their family member, which they consider an \"execution-style murder.\"\\n',\n", - " \"The article reports on the Obama administration's response to the Supreme Court's decision on immigration laws. Key highlights include:\\n\\n1. **No Federal Cooperation**: The administration will not assist Arizona in enforcing immigration laws unless the individuals meet federal immigration criteria, such as being a convicted criminal, a recent border crosser, or someone previously removed from the US and re-entered unlawfully.\\n2. **Rescinded Agreements**: The administration is ending the 287(g) agreements with Arizona, which allowed local law enforcement to enforce federal immigration laws. These agreements were initiated under the Bush administration but fell out of favor under the Obama administration.\\n3. **Limited Resources**: The Department of Homeland Security (DHS) will focus its resources on individuals posing a public safety threat or challenging border integrity, rather than responding to every situation.\\n4. **New Hotline**: A telephone hotline and e-mail address (855-353-1010 and SB1070@usdoj.gov) have been set up for\",\n", - " \"Here are the major highlights from the article:\\n\\n- A multi-millionaire businessman, Darren Browne, and his family have been left homeless after a fire damaged their £3.5m mansion in Caversham, Berkshire.\\n- The fire started in a first-floor bedroom of the three-story house at around 2:30 pm on Sunday afternoon and caused significant damage to the property, including a collapsed roof and windows.\\n- The family was alerted by their teenager son, Conor, who called the fire service after spotting the fire, and they managed to evacuate safely with their family dogs and a dead pet rabbit.\\n- No human casualties were reported, but the house's interior and exterior suffered from water damage and debris from the blaze.\\n- A joint investigation by Thames Valley Police and the Royal Berkshire Fire and Rescue Service has been launched but the fire's origin is not believed to be suspicious.\\n- The damage is estimated to cost over £1m to repair, and the family is currently looking for temporary accommodation\",\n", - " 'A California woman, Tania Warchol, is suing E.L. James, the author of the novel \"Fifty Shades of Grey,\" and a British sex toy company, Lovehoney, for allegedly failing to deliver on the promised performance of their sex lubricant, \"Fifty Shades of Grey: Come Alive Pleasure Gel for Her.\" The $14.99 product, released in conjunction with the novel, promised to enhance orgasms and stimulation but reportedly failed to meet expectations. Tania Warchol claims the product also has some incompatibility issues with latex and may be mislabeled as an \"aphrodisiac\" without FDA approval. She is seeking a refund and punitive damages, and has filed a class-action lawsuit to represent other California residents who have had similar experiences with the product. The lawsuit is set to face several obstacles, including proving that the lubricant did not work.',\n", - " \"Here are the highlights of the article:\\n\\n**Researchers Develop a Potential Solution for Sensitive Teeth:**\\n\\n* Researchers in Taiwan have created a paste that mimics and helps rebuild worn tooth enamel, providing relief from sensitive teeth.\\n* The paste enters exposed dentine tubes, crystalizes, and seals them, preventing fluid disturbance and pain.\\n* In animal tests, the paste provided relief for at least 70 days.\\n\\n**How the Paste Works:**\\n\\n* It uses calcium carbonate and silica to seal exposed dentine tubes and catalyze enamel regeneration.\\n* The paste plugs tubes more deeply than other treatments, reducing pulp irritation.\\n* It has been shown to stimulate the regeneration of hard tissue in teeth.\\n\\n**Alternative Solutions for Sensitive Teeth:**\\n\\n* A study in China has created a compound inspired by mussels' natural 'glue' that can help teeth rebuild enamel and dentine simultaneously.\\n* This compound, made from polydopamine, calcium, and phosphate, has shown promising results in lab\",\n", - " \"Here are the article's main highlights:\\n\\n- A 30-year-old Samoan woman was charged with attempted murder for allegedly dumping her newborn baby in a western Sydney stormwater drain on November 18. \\n- The baby was found alive but severely dehydrated and with bleeding on the brain after being left in the drain for five days. \\n- A man believed to be the baby's father has been located by police.\\n- The accused woman had kept her pregnancy a secret for nine months, posting photos on social media of her aunt and uncle's children and even boasting about a new boyfriend.\\n- The woman was living with her aunt and uncle in the western Sydney suburb of Quakers Hill at the time of the incident.\\n- Police are waiting to interview the baby's father and are still gathering evidence, including from Blacktown hospital where the baby was born.\\n- The baby, over eight weeks old, has been released from the hospital and is in care.\\n- The woman was refused bail and\",\n", - " \"A neighbor, Mark Taylor, witnessed his next-door neighbor, Richard Wight, attempting to break into his home with an axe, similar to the film 'The Shining.' Wight, a 55-year-old lorry driver, had a history of harassing his neighbors, including Mark Taylor and Alan Taylor (59), with whom he had a long-standing feud over parking. \\n\\nThe bodies of both men were found in their homes, with Wight's cause of death attributed to stab wounds, and Alan Taylor's cause of death attributed to cardiac arrest. An investigation is ongoing, but it is believed that Alan Taylor may have killed Wight before suffering a fatal heart attack. Wight had a history of violent behavior and was known for smoking pot and drinking.\\n\\nNotable points from Wight's history include:\\n\\n- A prison sentence in 2002 for threatening Mark with an axe\\n- An Anti-Social Behavior Order (Asbo) in 2007 for threatening and abusive behavior toward neighbors\\n\"]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "gen_texts" - ] - }, { "cell_type": "code", "execution_count": null, diff --git a/templates/batch-llm/README.md b/templates/batch-llm/README.md index 09395e354..942e4083c 100644 --- a/templates/batch-llm/README.md +++ b/templates/batch-llm/README.md @@ -1,16 +1,23 @@ -# LLM offline batch inference with Ray Data and vLLM +# LLM offline batch inference with RayLLMBatch APIs **⏱️ Time to complete**: 10 min -This template shows you how to: -1. Read in data from in-memory samples or files on cloud storage. -2. Use Ray Data and vLLM to run batch inference of a LLM. -3. Write the inference outputs to cloud storage. + + +This template shows you how to run batch inference for LLMs using RayLLMBatch. For a Python script version of the code in this workspace template, refer to `main.py`. **Note:** This tutorial runs within a workspace. Review the `Introduction to Workspaces` template before this tutorial. +## Prerequisites + +This tutorial requires a workspace with A10G GPU, to configure the workspace with A10G GPU, please configure the head node type to have an A10G GPU: + +![title](assets/configure-a10g-1.png) +![title](assets/configure-a10g-2.png) + + ### How to decide between online vs offline inference for LLM Online LLM inference (e.g. Anyscale Endpoint) should be used when you want to get real-time response for prompt or to interact with the LLM. Use online inference when you want to optimize latency of inference to be as quick as possible. @@ -18,309 +25,175 @@ On the other hand, offline LLM inference (also referred to as batch inference) s 1. Scale your workload to large-scale datasets 2. Optimize inference throughput and resource usage (for example, maximizing GPU utilization). -In this tutorial, we will focus on the latter, using offline LLM inference for a sentence completion task. +In this tutorial, we will focus on the latter, using offline LLM inference for a summarization task using real-world news articles. -## Step 1: Set up model configs -First, import the dependencies used in this template. +## Step 1: Set up the workload +RayBatchLLM is a library for running batch inference for LLMs using Ray Data for data processing, and defines an easy and flexible interface for the user to define their own workload. In this tutorial, we will implement a workload based on the [`CNNDailyMail`](https://huggingface.co/datasets/abisee/cnn_dailymail) dataset, which is a collection of news articles. And we will summarize each article with our batch inferencing pipeline. ```python -import os -from typing import Dict -import numpy as np -import ray -from vllm import LLM, SamplingParams +from rayllm_batch.workload import ChatWorkloadBase +from typing import Optional, Dict, Any +import ray +from ray.data.dataset import Dataset +from dataclasses import dataclass, field -from util.utils import ( - generate_output_path, - get_a10g_or_equivalent_accelerator_type, - prompt_for_hugging_face_token, -) -``` -Set up values that will be used in the batch inference workflow: -* The model to use for inference ([see the list of vLLM models](https://docs.vllm.ai/en/latest/models/supported_models.html)). - * This workspace template has been tested and verified with the following models: - * [`meta-llama/Meta-Llama-3-8B-Instruct`](https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct) - * [`meta-llama/Llama-2-7b-chat-hf`](https://huggingface.co/meta-llama/Llama-2-7b-chat-hf) - * [`mistralai/Mistral-7B-Instruct-v0.1`](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.1) - * [`google/gemma-7b-it`](https://huggingface.co/google/gemma-7b-it) - * [`mlabonne/NeuralHermes-2.5-Mistral-7B`](https://huggingface.co/mlabonne/NeuralHermes-2.5-Mistral-7B) - * Support for the following larger models are actively a work-in-progress, and will be supported very soon: - * [`meta-llama/Meta-Llama-3-70B-Instruct`](https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct) - * [`meta-llama/Llama-2-13b-chat-hf`](https://huggingface.co/meta-llama/Llama-2-13b-chat-hf) - * [`mistralai/Mixtral-8x7B-Instruct-v0.1`](https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1) - * [`meta-llama/Llama-2-70b-chat-hf`](https://huggingface.co/meta-llama/Llama-2-70b-chat-hf) - * [`codellama/CodeLlama-70b-Instruct-hf`](https://huggingface.co/codellama/CodeLlama-70b-Instruct-hf) -* The [sampling parameters object](https://github.com/vllm-project/vllm/blob/main/vllm/sampling_params.py) used by vLLM. -* The output path where results will be written as parquet files. +@dataclass +class CNNDailySummary(ChatWorkloadBase): + """The CNN/DailyMail summarization workload.""" + # We directly load the dataset from Hugging Face. + dataset_file: Optional[str] = None + # We will load only a portion of the dataset to run inference faster for the tutorial. + dataset_fraction: float = 0.0003 # 0.03% of the 300K entries. + # The sampling params for the LLM inference workload. + sampling_params: Dict[str, Any] = field(default_factory=lambda: {"max_tokens": 150}) -```python -# Set to the name of the Hugging Face model that you wish to use from the preceding list. -# Note that using the Llama models will prompt you to set your Hugging Face user token. -HF_MODEL = "mistralai/Mistral-7B-Instruct-v0.1" - -# Create a sampling params object. -sampling_params = SamplingParams(n=1, temperature=0, max_tokens=2048, stop=["<|eot_id|>", "<|end_of_text|>"]) - -# Output path to write output result. You can also change this to any cloud storage path, -# e.g. a specific S3 bucket. -output_path = generate_output_path( - # `ANYSCALE_ARTIFACT_STORAGE` is the URI to the pre-generated folder for storing - # your artifacts while keeping them separate them from Anyscale-generated ones. - # See: https://docs.anyscale.com/workspaces/storage#object-storage-s3-or-gcs-buckets - os.environ.get("ANYSCALE_ARTIFACT_STORAGE"), - HF_MODEL, -) -``` + def load_dataset(self) -> Dataset: + # Load the dataset from Hugging Face into Ray Data. + import datasets # type: ignore -Some models will require you to input your [Hugging Face user access token](https://huggingface.co/docs/hub/en/security-tokens). This will be used to authenticate/download the model and **is required for official LLaMA, Mistral, and Gemma models**. You can use one of the other models which don't require a token if you don't have access to this model (for example, `mlabonne/NeuralHermes-2.5-Mistral-7B`). + df = datasets.load_dataset("cnn_dailymail", "3.0.0") + return ray.data.from_huggingface(df["train"]) -Run the following cell to start the authentication flow. A VS Code overlay will appear and prompt you to enter your Hugging Face token if your selected model requires authentication. The token will be cached to a file in the workspace so it can be used to launch an Anyscale Job later without needing to re-authenticate. + def parse_row(self, row: dict[str, Any]) -> dict[str, Any]: + # Parse the row into the format expected by the model. + # We will use the article as the user prompt, and ask the model to + # generate a summary with the system prompt. + return { + "messages": [ + { + "role": "system", + "content": "You are a commentator. Your task is to " + "summarize highlights from article.", + }, + { + "role": "user", + "content": f"# Article:\n{row['article']}\n\n" + "#Instructions:\nIn clear and concise language, " + "summarize the highlights presented in the article.", + }, + ] + } -```python -# Prompts the user for Hugging Face token if required by the model. -HF_TOKEN = prompt_for_hugging_face_token(HF_MODEL) +workload = CNNDailySummary() +sample_data = workload.load_dataset().take(1) +print(sample_data) ``` -Start up Ray, using the Hugging Face token as an environment variable so that it's made available to all nodes in the cluster. +We will cover more details on how to customize the workload in the later sections. +## Step 2: Define the model configs -```python -if ray.is_initialized(): - ray.shutdown() -ray.init( - runtime_env={ - "env_vars": {"HF_TOKEN": HF_TOKEN}, - } -) -``` +We will also need to define the model configs for the LLM engine, which configures the model and compute resources needed for inference. -## Step 2: Read input data with Ray Data -Use Ray Data to read in your input data from some sample prompts. +Some models will require you to input your [Hugging Face user access token](https://huggingface.co/docs/hub/en/security-tokens). This will be used to authenticate/download the model and **is required for official LLaMA, Mistral, and Gemma models**. You can use one of the other models which don't require a token if you don't have access to this model (for example, `mlabonne/NeuralHermes-2.5-Mistral-7B`). +Run the following cell to start the authentication flow. A VS Code overlay will appear and prompt you to enter your Hugging Face token if your selected model requires authentication. If you are using a model that does not require a token, you can skip this step. For this example, we will be using the `meta-llama/Meta-Llama-3.1-8B-Instruct` model, which requires a token. ```python -# Create some sample sentences, and use Ray Data to create a dataset for it. -prompts = [ - "I always wanted to be a ...", - "The best way to learn a new language is ...", - "The biggest challenge facing our society today is ...", - "One thing I would change about my past is ...", - "The key to a happy life is ...", -] -ds = ray.data.from_items(prompts) - -# View one row of the Dataset. -ds.take(1) +# Prompts the user for Hugging Face token if required by the model. +from util.utils import prompt_for_hugging_face_token +HF_TOKEN = prompt_for_hugging_face_token("meta-llama/Meta-Llama-3.1-8B-Instruct") ``` -Construct the input prompts for your model using the format required by the specific model. Run the cell below to apply this prompt construction to each row in the Dataset with Ray Data's [`map`](https://docs.ray.io/en/latest/data/api/doc/ray.data.Dataset.map.html) method. +In this example, we will be using the `meta-llama/Meta-Llama-3.1-8B-Instruct` model, +We will also need to define a model yaml associated with the model we want to use to configure the compute resources, engine arguments and other inference engine specific parameters. For more details on the the model configs, see the [API doc](https://docs.anyscale.com/llms/serving/guides/bring_any_model/) on bringing your own models. ```python -model_name_to_input_prompt_format = { - "meta-llama/Llama-2-7b-chat-hf": "[INST] {} [/INST]", - "mistralai/Mistral-7B-Instruct-v0.1": "[INST] {} [/INST]", - "google/gemma-7b-it": "model\n{}\n", - "mlabonne/NeuralHermes-2.5-Mistral-7B": "<|im_start|>system\nYou are a helpful assistant that will complete the sentence in the given input prompt.<|im_end|>\n<|im_start|>user{}<|im_end|>\n<|im_start|>assistant", - "meta-llama/Meta-Llama-3-8B-Instruct": ( - "<|start_header_id|>system<|end_header_id|>\n\nYou are a helpful assistant. Complete the given prompt in several concise sentences.<|eot_id|>\n" - "<|start_header_id|>user<|end_header_id|>\n\n{}<|eot_id|>\n" - "<|start_header_id|>assistant<|end_header_id|>\n\n" - ), -} - -def construct_input_prompt(row, text_column): - """Given the input row with raw text in `text_column` column, - construct the input prompt for the model.""" - prompt_format = model_name_to_input_prompt_format.get(HF_MODEL) - if prompt_format: - row[text_column] = prompt_format.format(row[text_column]) - return row - -ds = ds.map(construct_input_prompt, fn_kwargs={"text_column": "item"}) -``` - -So far, we have defined two operations of the Dataset (`from_items()`, `map()`), but have not executed the Dataset yet and don't see any results. Why is that? - -Ray Data uses [lazy, streaming execution](https://docs.ray.io/en/latest/data/data-internals.html#execution) by default, which means that: -- Datasets and any associated transformations are not executed until you call a consuming operation such as [`ds.take()`](https://docs.ray.io/en/latest/data/api/doc/ray.data.Dataset.take.html), [`ds.take_all()`](https://docs.ray.io/en/latest/data/api/doc/ray.data.Dataset.take_all.html), [`ds.iter_batches()`](https://docs.ray.io/en/latest/data/api/doc/ray.data.DataIterator.iter_batches.html), or [`Dataset.write_parquet()`](https://docs.ray.io/en/latest/data/api/doc/ray.data.Dataset.write_parquet.html). -- The entire Dataset is not stored in memory, but rather, the Dataset is executed incrementally on parts of data while overlapping execution of various operations in the Dataset. This allows Ray Data to execute batch transformations without needing to load the entire dataset into memory and overlap data preprocessing and model training steps during ML training. - -We will trigger Dataset execution after the next step, which is applying the vLLM model to the formatted input prompts. -## Step 3: Run Batch Inference with vLLM +from rayllm_batch import init_engine_from_config +# Read the model configs from the path. +model_config_path = "configs/llama-3.1-8b-a10g.yaml" -Create a class to define batch inference logic. +# One could potentially override the engine configs by passing in a dictionary here. +override = {"runtime_env": {"env_vars": {"HF_TOKEN": HF_TOKEN}}} # Override Ray's runtime env to include the Hugging Face token. Ray is being used under the hood to orchestrate the inference pipeline. +engine_config = init_engine_from_config(config=model_config_path, override=override) - -```python -# Mapping of model name to max_model_len supported by model. -model_name_to_args = { - "mistralai/Mistral-7B-Instruct-v0.1": {"max_model_len": 16832}, - "google/gemma-7b-it": {"max_model_len": 2432}, - "mlabonne/NeuralHermes-2.5-Mistral-7B": {"max_model_len": 16800}, -} - -class LLMPredictor: - def __init__(self, text_column): - # Name of column containing the input text. - self.text_column = text_column - - # Create an LLM. - self.llm = LLM( - model=HF_MODEL, - **model_name_to_args.get(HF_MODEL, {}), - # Note: add additional args to LLM constructor below. - ) - - def __call__(self, batch: Dict[str, np.ndarray]) -> Dict[str, list]: - # Generate texts from the prompts. - # The output is a list of RequestOutput objects that contain the prompt, - # generated text, and other information. - outputs = self.llm.generate(batch[self.text_column], sampling_params) - prompt = [] - generated_text = [] - for output in outputs: - prompt.append(output.prompt) - generated_text.append(' '.join([o.text for o in output.outputs])) - return { - "prompt": prompt, - "generated_text": generated_text, - } ``` -### Scaling with GPUs -Next, apply batch inference for all input data with the Ray Data [`map_batches`](https://docs.ray.io/en/latest/data/api/doc/ray.data.Dataset.map_batches.html) method. When using vLLM, LLM instances require GPUs; here, we will demonstrate how to configure Ray Data to scale the number of LLM instances and GPUs needed. -To use GPUs for inference in the Workspace, we can specify `num_gpus` and `concurrency` in the `ds.map_batches()` call below to indicate the number of LLM instances and the number of GPUs per LLM instance, respectively. For example, if we want to use 4 LLM instances, with each requiring 1 GPU, we would set `concurrency=4` and `num_gpus=1`, requiring 4 total GPUs. +## Step 3: Run the batch inference through RayLLMBatch -Smaller models, such as `Meta-Llama-3-8B-Instruct` and `Mistral-7B-Instruct-v0.1`, typically require 1 GPU per instance. Larger models, such as `Mixtral-8x7B-Instruct-v0.1` and `meta-llama/Meta-Llama-3-70B-Instruct`, typically require multiple GPUs per instance. You should configure these parameters according to the compute needed by the model. +With the workload and model configs defined, we can now run the batch inference through RayLLMBatch. ```python -ds = ds.map_batches( - LLMPredictor, - # Set the concurrency to the number of LLM instances. - concurrency=4, - # Specify the number of GPUs required per LLM instance. - num_gpus=1, - # Specify the batch size for inference. Set the batch size to as large as possible without running out of memory. - # If you encounter out-of-memory errors, decreasing batch_size may help. - batch_size=5, - # Pass keyword arguments for the LLMPredictor class. - fn_constructor_kwargs={"text_column": "item"}, - # Select the accelerator type; A10G or L4. - accelerator_type=get_a10g_or_equivalent_accelerator_type(), -) -``` -Finally, make sure to either enable *Auto-select worker nodes* or configure your workspace cluster to have the appropriate GPU worker nodes (A10G or L4): +from rayllm_batch import RayLLMBatch - +batch = RayLLMBatch( + engine_config=engine_config, + workload=workload, + # Specify the batch size for inference. Set the batch size to as large as possible without running out of memory. + # If you encounter out-of-memory errors, decreasing batch_size may help. + batch_size=None, + # Set the number of replicas to use for the inference. Each replica will run one instance of inference pipeline. + num_replicas=1, +) -Run the following cell to start dataset execution and view the results! +# This will runs until completion. +ds = batch.run() -```python -ds.take_all() +# Read the results +gen_texts = [r["generated_text"] for r in ds.take_all()] +print(gen_texts) ``` -### Scaling to a larger dataset -In the example above, we performed batch inference for Ray Dataset with 5 example prompts. Next, let's explore how to scale to a larger dataset based on files stored in cloud storage. - -Run the following cell to create a Dataset from a text file stored on S3. This Dataset has 100 rows, with each row containing a single prompt in the `text` column. +### Customizing your LLM inference workload +As shown in the example above, one can easily customize the workload by overriding the `load_dataset` and `parse_row` methods. The workload class is defined with the below APIs that one can override: ```python -ds = ray.data.read_text("s3://anonymous@air-example-data/prompts_100.txt") -ds.take(1) +@dataclass +class MyChatWorkload(ChatWorkloadBase): + """My chat workload.""" + + # Path to the dataset file. + dataset_file: Optional[str] = "/path/to/dataset.jsonl" + + # Sampling parameters such as max_tokens, temperature, etc. + sampling_params: Dict[str, Any] = field( + default_factory=lambda: {"max_tokens": 150, "ignore_eos": False} + ) + + # Other workload parameters + # ... + + def load_dataset(self) -> Dataset: + """Load dataset using Ray Data APIs.""" + pass + + def parse_row(self, row: Dict[str, Any]) -> Dict[str, Any]: + """Parse each row in the dataset to make them compatible with + OpenAI chat API messages. Specifically, the output row should only + include a single key "messages" with type List[Dict[str, Union[str, List[Dict]]]]. + """ + pass ``` -### Customizing your LLM instance -If you wish to further customize vLLM, you can modify the `LLMPredictor` class defined earlier in Step 3 as follows: -- Add kwargs for initializing the `LLM` object in `LLMPredictor.__init__()` as indicated by the comment, in Step 3. -- Modify the `SamplingParams` object defined earlier in the notebook, in Step 1. -- For a more advanced usage case of using a different `SamplingParams` for each `LLM.generate()` call, follow these steps: - 1. Add a new argument to `LLMPredictor.__call__()`, which takes a function that returns a `SamplingParams` object to be used for the subsequent `LLM.generate()` call. - 2. This function should be passed to `LLMPredictor` in the `fn_constructor_kwargs` argument of the `map_batches()` call in the next section. - 3. Finally, in `LLMPredictor.__call__()`, call this function, and pass the generated `SamplingParams` object to `LLM.generate()`. -Similar to before, we apply batch inference for all input data with the Ray Data [`map_batches`](https://docs.ray.io/en/latest/data/api/doc/ray.data.Dataset.map_batches.html) method. +### Monitoring the execution -```python -ds = ds.map(construct_input_prompt, fn_kwargs={"text_column": "text"}) -ds = ds.map_batches( - LLMPredictor, - # Set the concurrency to the number of LLM instances. - concurrency=4, - # Specify the number of GPUs required per LLM instance. - num_gpus=1, - # Specify the batch size for inference. Set the batch size to as large possible without running out of memory. - # If you encounter CUDA out-of-memory errors, decreasing batch_size may help. - batch_size=5, - # Pass keyword arguments for the LLMPredictor class. - fn_constructor_kwargs={"text_column": "text"}, - # Select the accelerator type; A10G or L4. - accelerator_type=get_a10g_or_equivalent_accelerator_type(), -) -``` - -### Output Results -Finally, write the inference output data out to Parquet files on S3. - -Running the following cell will trigger execution for the full Dataset, which will execute all of the operations (`read_text()`, `map_batches(LLMPredictor)`, `write_parquet()`) at once: - - -```python -ds.write_parquet(output_path, try_create_dir=False) -print(f"Batch inference result is written into {output_path}.") -``` - -### Monitoring Dataset execution -We can use the Ray Dashboard to monitor the Dataset execution. In the Ray Dashboard tab, navigate to the Job page and open the "Ray Data Overview" section. Click on the link for the running job, and open the "Ray Data Overview" section to view the details of the batch inference execution: +RayLLMBatch uses Ray Data to implement the execution of the batch inference pipeline, and one can use the Ray Dashboard to monitor the execution. In the Ray Dashboard tab, navigate to the Job page and open the "Ray Data Overview" section. Click on the link for the running job, and open the "Ray Data Overview" section to view the details of the batch inference execution: ### Handling GPU out-of-memory failures -If you run into CUDA out of memory, your batch size is likely too large. Decrease the batch size as described above. - -If your batch size is already set to 1, then use either a smaller model or GPU devices with more memory. - -### Reading back results -We can also use Ray Data to read back the output files to ensure the results are as expected. - - -```python -ds_output = ray.data.read_parquet(output_path) -ds_output.take(5) -``` - -### Submitting to Anyscale Jobs - -The script in `main.py` has the same code as this notebook; you can use `anyscale job submit` to submit the app in that file to Anyscale Jobs. See [Introduction to Jobs](https://docs.anyscale.com/examples/intro-jobs/) for more details. - - -After modifying the configurations at the top of `main.py` (model name, input/output path, input text column), run the following cell to submit a job: - - -```python -!anyscale job submit -- python main.py -``` +If you run into CUDA out of memory, your batch size is likely too large. Set an explicit small batch size or use a smaller model (or a larger GPU). ## Summary This notebook: -- Read in data from in-memory samples or input files from cloud storage. -- Used Ray Data and vLLM to run offline batch inference of a LLM. -- Wrote the inference outputs to cloud storage and read back the results. - - +- Created a custom workload for the CNN/DailyMail summarization task. +- Defined the model configs for the Meta Llama 3.1 8B model. +- Ran the batch inference through RayLLMBatch and monitored the execution. From d2c62a5bc65f264506996945181379f513f54a2c Mon Sep 17 00:00:00 2001 From: rickyx Date: Tue, 24 Sep 2024 19:52:53 +0000 Subject: [PATCH 3/6] update --- configs/batch-llm/aws.yaml | 85 +-------- configs/batch-llm/gcp.yaml | 56 +----- templates/batch-llm/README.ipynb | 165 ++++++++++++++++-- templates/batch-llm/README.md | 76 ++++---- .../batch-llm/assets/configure-a10g-1.png | Bin 72970 -> 0 bytes .../batch-llm/assets/configure-a10g-2.png | Bin 44859 -> 0 bytes templates/batch-llm/assets/ray-data-gpu.png | Bin 21797 -> 0 bytes .../batch-llm/configs/llama-3.1-8b-l4.yaml | 19 ++ 8 files changed, 206 insertions(+), 195 deletions(-) delete mode 100644 templates/batch-llm/assets/configure-a10g-1.png delete mode 100644 templates/batch-llm/assets/configure-a10g-2.png delete mode 100644 templates/batch-llm/assets/ray-data-gpu.png create mode 100644 templates/batch-llm/configs/llama-3.1-8b-l4.yaml diff --git a/configs/batch-llm/aws.yaml b/configs/batch-llm/aws.yaml index 06744ca23..6d8abbf5c 100644 --- a/configs/batch-llm/aws.yaml +++ b/configs/batch-llm/aws.yaml @@ -1,84 +1,3 @@ head_node_type: - name: head-node - instance_type: m5.2xlarge - resources: - cpu: 0 -worker_node_types: - - name: worker-g5-xlarge-nvidia-a10-1 - instance_type: g5.xlarge - resources: - custom_resources: - "accelerator_type:A10G": 1 - min_workers: 0 - max_workers: 4 - use_spot: true - fallback_to_ondemand: true - - name: worker-g5-2xlarge-nvidia-a10-1 - instance_type: g5.2xlarge - resources: - custom_resources: - "accelerator_type:A10G": 1 - min_workers: 0 - max_workers: 4 - use_spot: true - fallback_to_ondemand: true - - name: worker-g5-4xlarge-nvidia-a10-1 - instance_type: g5.4xlarge - resources: - custom_resources: - "accelerator_type:A10G": 1 - min_workers: 0 - max_workers: 4 - use_spot: true - fallback_to_ondemand: true - - name: worker-g5-8xlarge-nvidia-a10-1 - instance_type: g5.8xlarge - resources: - custom_resources: - "accelerator_type:A10G": 1 - min_workers: 0 - max_workers: 4 - use_spot: true - fallback_to_ondemand: true - - name: worker-g5-12xlarge-nvidia-a10-4 - instance_type: g5.12xlarge - resources: - custom_resources: - "accelerator_type:A10G": 1 - min_workers: 0 - max_workers: 1 - use_spot: true - fallback_to_ondemand: true - - name: worker-g5-16xlarge-nvidia-a10-1 - instance_type: g5.16xlarge - resources: - custom_resources: - "accelerator_type:A10G": 1 - min_workers: 0 - max_workers: 4 - use_spot: true - fallback_to_ondemand: true - - name: worker-g5-24xlarge-nvidia-a10-4 - instance_type: g5.24xlarge - resources: - custom_resources: - "accelerator_type:A10G": 1 - min_workers: 0 - max_workers: 1 - use_spot: true - fallback_to_ondemand: true - - name: worker-g5-48xlarge-nvidia-a10-8 - instance_type: g5.48xlarge - resources: - custom_resources: - "accelerator_type:A10G": 1 - min_workers: 0 - max_workers: 1 - use_spot: true - fallback_to_ondemand: true -aws: - TagSpecifications: - - ResourceType: instance - Tags: - - Key: as-feature-multi-zone - Value: "true" + name: head + instance_type: g5.xlarge diff --git a/configs/batch-llm/gcp.yaml b/configs/batch-llm/gcp.yaml index ee9ed5930..88abf4be3 100644 --- a/configs/batch-llm/gcp.yaml +++ b/configs/batch-llm/gcp.yaml @@ -1,55 +1,3 @@ head_node_type: - name: head-node - instance_type: n2-standard-8 - resources: - cpu: 0 -worker_node_types: - - name: worker-g2standard4-nvidia-l4-1 - instance_type: g2-standard-4-nvidia-l4-1 - resources: - custom_resources: - "accelerator_type:L4": 1 - min_workers: 0 - max_workers: 50 - use_spot: true - fallback_to_ondemand: true - - name: worker-g2standard8-nvidia-l4-1 - instance_type: g2-standard-8-nvidia-l4-1 - resources: - custom_resources: - "accelerator_type:L4": 1 - min_workers: 0 - max_workers: 50 - use_spot: true - fallback_to_ondemand: true - - name: worker-g2standard12-nvidia-l4-1 - instance_type: g2-standard-12-nvidia-l4-1 - resources: - custom_resources: - "accelerator_type:L4": 1 - min_workers: 0 - max_workers: 50 - use_spot: true - fallback_to_ondemand: true - - name: worker-g2standard16-nvidia-l4-1 - instance_type: g2-standard-16-nvidia-l4-1 - resources: - custom_resources: - "accelerator_type:L4": 1 - min_workers: 0 - max_workers: 50 - use_spot: true - fallback_to_ondemand: true - - name: worker-g2standard24-nvidia-l4-2 - instance_type: g2-standard-24-nvidia-l4-2 - resources: - custom_resources: - "accelerator_type:L4": 1 - min_workers: 0 - max_workers: 25 - use_spot: true - fallback_to_ondemand: true -gcp_advanced_configurations_json: - instance_properties: - labels: - as-feature-multi-zone: "true" + name: head + instance_type: g2-standard-48 diff --git a/templates/batch-llm/README.ipynb b/templates/batch-llm/README.ipynb index 8b05d1e19..68e827c9c 100644 --- a/templates/batch-llm/README.ipynb +++ b/templates/batch-llm/README.ipynb @@ -1,5 +1,39 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# LLM offline batch inference with RayLLM-Batch APIs\n", + "\n", + "**⏱️ Time to complete**: 10 min\n", + "\n", + "\n", + "\n", + "This template shows you how to run batch inference for LLMs using RayLLM-Batch.\n", + "\n", + "**Note:** This tutorial runs within a workspace. Review the `Introduction to Workspaces` template before this tutorial.\n", + "\n", + "\n", + "### How to decide between online vs offline inference for LLM\n", + "Online LLM inference (e.g. Anyscale Endpoint) should be used when you want to get real-time response for prompt or to interact with the LLM. Use online inference when you want to optimize latency of inference to be as quick as possible.\n", + "\n", + "On the other hand, offline LLM inference (also referred to as batch inference) should be used when you want to get reponses for a large number of prompts within some time frame, but not required to be real-time (minutes to hours granularity). Use offline inference when you want to:\n", + "1. Scale your workload to large-scale datasets\n", + "2. Optimize inference throughput and resource usage (for example, maximizing GPU utilization).\n", + "\n", + "In this tutorial, we will focus on the latter, using offline LLM inference for a summarization task using real-world news articles.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Set up the workload\n", + "\n", + "RayLLM-Batch is a library for running batch inference for LLMs using Ray Data for data processing, and defines an easy and flexible interface for the user to define their own workload. In this tutorial, we will implement a workload based on the [`CNNDailyMail`](https://huggingface.co/datasets/abisee/cnn_dailymail) dataset, which is a collection of news articles. And we will summarize each article with our batch inferencing pipeline. We will cover more details on how to customize the workload in the later sections.\n" + ] + }, { "cell_type": "code", "execution_count": null, @@ -17,15 +51,17 @@ "class CNNDailySummary(ChatWorkloadBase):\n", " \"\"\"The CNN/DailyMail summarization workload.\"\"\"\n", "\n", - " # We directly load the dataset from Hugging Face.\n", + " # We directly load the dataset from Hugging Face in this example. You can specify the dataset file path in your workload.\n", " dataset_file: Optional[str] = None\n", " # We will load only a portion of the dataset to run inference faster for the tutorial.\n", - " dataset_fraction: float = 0.0005 # 0.2% of the 300K entries.\n", + " dataset_fraction: float = 0.0003 # 0.03% of the 300K entries.\n", " # The sampling params for the LLM inference workload.\n", - " sampling_params: Dict[str, Any] = field(default_factory=lambda: {\"max_tokens\": 200})\n", + " sampling_params: Dict[str, Any] = field(default_factory=lambda: {\"max_tokens\": 150})\n", "\n", " def load_dataset(self) -> Dataset:\n", - " # Load the dataset from Hugging Face into Ray Data.\n", + " # Load the dataset from Hugging Face into Ray Data. If you're using your own dataset,\n", + " # refer to Ray Data APIs https://docs.ray.io/en/latest/data/api/input_output.html to load it.\n", + " # For example, you can use ray.data.read_json(dataset_file) to load dataset in JSONL.\n", " import datasets # type: ignore\n", "\n", " df = datasets.load_dataset(\"cnn_dailymail\", \"3.0.0\")\n", @@ -49,7 +85,23 @@ " \"summarize the highlights presented in the article.\",\n", " },\n", " ]\n", - " }" + " }\n", + "\n", + "\n", + "workload = CNNDailySummary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Define the model configs\n", + "\n", + "We will also need to define the model configs for the LLM engine, which configures the model and compute resources needed for inference. \n", + "\n", + "Some models will require you to input your [Hugging Face user access token](https://huggingface.co/docs/hub/en/security-tokens). This will be used to authenticate/download the model and **is required for official LLaMA, Mistral, and Gemma models**. You can use one of the other models which don't require a token if you don't have access to this model (for example, `neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8`).\n", + "\n", + "Run the following cell to start the authentication flow. A VS Code overlay will appear and prompt you to enter your Hugging Face token if your selected model requires authentication. If you are using a model that does not require a token, you can skip this step. For this example, we will be using the `meta-llama/Meta-Llama-3.1-8B-Instruct` model, which requires a token.\n" ] }, { @@ -63,6 +115,14 @@ "HF_TOKEN = prompt_for_hugging_face_token(\"meta-llama/Meta-Llama-3.1-8B-Instruct\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this example, we will be using the `meta-llama/Meta-Llama-3.1-8B-Instruct` model.\n", + "We will also need to define a yaml configuration file associated with the model we want to use to configure the compute resources, engine arguments and other inference engine specific parameters. For more details on the the model configs, see the [API doc](https://docs.anyscale.com/llms/serving/guides/bring_any_model/) on bringing your own models." + ] + }, { "cell_type": "code", "execution_count": null, @@ -71,11 +131,22 @@ "source": [ "from rayllm_batch import init_engine_from_config\n", "# Read the model configs from the path.\n", - "model_config_path = \"configs/llama-3.1-8b-a10g.yaml\"\n", + "model_config_path = \"configs/llama-3.1-8b-a10g.yaml\" \n", + "# Use model_config_path=\"configs/llama-3.1-8b-l4.yaml\" if on GCP.\n", "\n", "# One could potentially override the engine configs by passing in a dictionary here.\n", "override = {\"runtime_env\": {\"env_vars\": {\"HF_TOKEN\": HF_TOKEN}}} # Override Ray's runtime env to include the Hugging Face token. Ray is being used under the hood to orchestrate the inference pipeline.\n", - "engine_config = init_engine_from_config(config=model_config_path, override=override)\n" + "engine_config = init_engine_from_config(config=model_config_path, override=override)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3: Run the batch inference through RayLLM-Batch\n", + "\n", + "\n", + "With the workload and model configs defined, we can now run the batch inference through RayLLM-Batch." ] }, { @@ -86,26 +157,35 @@ "source": [ "from rayllm_batch import RayLLMBatch\n", "\n", - "\n", - "workload = CNNDailySummary()\n", "batch = RayLLMBatch(\n", " engine_cfg=engine_config,\n", " workload=workload,\n", - " # Specify the batch size for inference. Set the batch size to as large as possible without running out of memory.\n", - " # If you encounter out-of-memory errors, decreasing batch_size may help. \n", + " # Specify the batch size for inference. Set the batch size to as large as possible without running out of memory to maximize the throughput.\n", + " # Meanwhile, a reasonable batch size can offer better fault tolerance. \n", " batch_size=None,\n", " # Set the number of replicas to use for the inference. Each replica will run one instance of inference pipeline.\n", " num_replicas=1,\n", ")\n", "\n", - "\n", - "# This will runs until completion.\n", + "# This will runs until completion. If you specify output_path=..., then\n", + "# the results will be written to local disk (local://) or AWS S3 (s3://).\n", + "# In this example, we only keep results in memory for demo purpose.\n", "ds = batch.run()\n", "\n", "\n", - "# Read the results\n", - "gen_texts = [r[\"generated_text\"] for r in ds.take_all()]\n", - "print(gen_texts)" + "# Peak the first 3 entries. \n", + "gen_texts = [r[\"generated_text\"] for r in ds.take(3)]\n", + "print(\"==================GENERATED OUTPUT===============\")\n", + "print(\"\\n\".join(gen_texts))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Customizing your LLM inference workload\n", + "\n", + "As shown in the example above, one can easily customize the workload by overriding the `load_dataset` and `parse_row` methods. The workload class is defined with the below APIs that one can override:" ] }, { @@ -113,7 +193,58 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "@dataclass\n", + "class MyChatWorkload(ChatWorkloadBase):\n", + " \"\"\"My chat workload.\"\"\"\n", + "\n", + " # Path to the dataset file.\n", + " dataset_file: Optional[str] = \"/path/to/dataset.jsonl\"\n", + "\n", + " # Percentage of the dataset to use for the workload.\n", + " dataset_fraction: float = 1.0\n", + "\n", + " # Sampling parameters such as max_tokens, temperature, etc.\n", + " sampling_params: Dict[str, Any] = field(\n", + " default_factory=lambda: {\"max_tokens\": 150, \"ignore_eos\": False}\n", + " )\n", + "\n", + " # Other workload parameters\n", + " # ...\n", + "\n", + " def load_dataset(self) -> Dataset:\n", + " \"\"\"Load dataset using Ray Data APIs.\"\"\"\n", + " pass\n", + "\n", + " def parse_row(self, row: Dict[str, Any]) -> Dict[str, Any]:\n", + " \"\"\"Parse each row in the dataset to make them compatible with\n", + " OpenAI chat API messages. Specifically, the output row should only\n", + " include a single key \"messages\" with type List[Dict[str, Union[str, List[Dict]]]]. \n", + " \"\"\"\n", + " pass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Monitoring the execution\n", + "\n", + "RayLLM-Batch uses Ray Data to implement the execution of the batch inference pipeline, and one can use the Ray Dashboard to monitor the execution. In the Ray Dashboard tab, navigate to the Job page and open the \"Ray Data Overview\" section. Click on the link for the running job, and open the \"Ray Data Overview\" section to view the details of the batch inference execution:\n", + "\n", + "\n", + "\n", + "### Handling GPU out-of-memory failures\n", + "If you run into CUDA out of memory, your batch size is likely too large. Set an explicit small batch size or use a smaller model (or a larger GPU).\n", + "\n", + "## Summary\n", + "\n", + "This notebook:\n", + "- Created a custom workload for the CNN/DailyMail summarization task.\n", + "- Defined the model configs for the Meta Llama 3.1 8B model.\n", + "- Ran the batch inference through RayLLM-Batch and monitored the execution." + ] } ], "metadata": { diff --git a/templates/batch-llm/README.md b/templates/batch-llm/README.md index 942e4083c..6cf133f6f 100644 --- a/templates/batch-llm/README.md +++ b/templates/batch-llm/README.md @@ -1,22 +1,13 @@ -# LLM offline batch inference with RayLLMBatch APIs +# LLM offline batch inference with RayLLM-Batch APIs **⏱️ Time to complete**: 10 min - -This template shows you how to run batch inference for LLMs using RayLLMBatch. - -For a Python script version of the code in this workspace template, refer to `main.py`. + +This template shows you how to run batch inference for LLMs using RayLLM-Batch. **Note:** This tutorial runs within a workspace. Review the `Introduction to Workspaces` template before this tutorial. -## Prerequisites - -This tutorial requires a workspace with A10G GPU, to configure the workspace with A10G GPU, please configure the head node type to have an A10G GPU: - -![title](assets/configure-a10g-1.png) -![title](assets/configure-a10g-2.png) - ### How to decide between online vs offline inference for LLM Online LLM inference (e.g. Anyscale Endpoint) should be used when you want to get real-time response for prompt or to interact with the LLM. Use online inference when you want to optimize latency of inference to be as quick as possible. @@ -30,10 +21,11 @@ In this tutorial, we will focus on the latter, using offline LLM inference for a ## Step 1: Set up the workload -RayBatchLLM is a library for running batch inference for LLMs using Ray Data for data processing, and defines an easy and flexible interface for the user to define their own workload. In this tutorial, we will implement a workload based on the [`CNNDailyMail`](https://huggingface.co/datasets/abisee/cnn_dailymail) dataset, which is a collection of news articles. And we will summarize each article with our batch inferencing pipeline. +RayLLM-Batch is a library for running batch inference for LLMs using Ray Data for data processing, and defines an easy and flexible interface for the user to define their own workload. In this tutorial, we will implement a workload based on the [`CNNDailyMail`](https://huggingface.co/datasets/abisee/cnn_dailymail) dataset, which is a collection of news articles. And we will summarize each article with our batch inferencing pipeline. We will cover more details on how to customize the workload in the later sections. -```python + +```python from rayllm_batch.workload import ChatWorkloadBase from typing import Optional, Dict, Any import ray @@ -45,7 +37,7 @@ from dataclasses import dataclass, field class CNNDailySummary(ChatWorkloadBase): """The CNN/DailyMail summarization workload.""" - # We directly load the dataset from Hugging Face. + # We directly load the dataset from Hugging Face in this example. You can specify the dataset file path in your workload. dataset_file: Optional[str] = None # We will load only a portion of the dataset to run inference faster for the tutorial. dataset_fraction: float = 0.0003 # 0.03% of the 300K entries. @@ -53,7 +45,9 @@ class CNNDailySummary(ChatWorkloadBase): sampling_params: Dict[str, Any] = field(default_factory=lambda: {"max_tokens": 150}) def load_dataset(self) -> Dataset: - # Load the dataset from Hugging Face into Ray Data. + # Load the dataset from Hugging Face into Ray Data. If you're using your own dataset, + # refer to Ray Data APIs https://docs.ray.io/en/latest/data/api/input_output.html to load it. + # For example, you can use ray.data.read_json(dataset_file) to load dataset in JSONL. import datasets # type: ignore df = datasets.load_dataset("cnn_dailymail", "3.0.0") @@ -81,77 +75,75 @@ class CNNDailySummary(ChatWorkloadBase): workload = CNNDailySummary() -sample_data = workload.load_dataset().take(1) -print(sample_data) ``` -We will cover more details on how to customize the workload in the later sections. - ## Step 2: Define the model configs We will also need to define the model configs for the LLM engine, which configures the model and compute resources needed for inference. -Some models will require you to input your [Hugging Face user access token](https://huggingface.co/docs/hub/en/security-tokens). This will be used to authenticate/download the model and **is required for official LLaMA, Mistral, and Gemma models**. You can use one of the other models which don't require a token if you don't have access to this model (for example, `mlabonne/NeuralHermes-2.5-Mistral-7B`). +Some models will require you to input your [Hugging Face user access token](https://huggingface.co/docs/hub/en/security-tokens). This will be used to authenticate/download the model and **is required for official LLaMA, Mistral, and Gemma models**. You can use one of the other models which don't require a token if you don't have access to this model (for example, `neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8`). Run the following cell to start the authentication flow. A VS Code overlay will appear and prompt you to enter your Hugging Face token if your selected model requires authentication. If you are using a model that does not require a token, you can skip this step. For this example, we will be using the `meta-llama/Meta-Llama-3.1-8B-Instruct` model, which requires a token. + + ```python # Prompts the user for Hugging Face token if required by the model. from util.utils import prompt_for_hugging_face_token HF_TOKEN = prompt_for_hugging_face_token("meta-llama/Meta-Llama-3.1-8B-Instruct") ``` +In this example, we will be using the `meta-llama/Meta-Llama-3.1-8B-Instruct` model. +We will also need to define a yaml configuration file associated with the model we want to use to configure the compute resources, engine arguments and other inference engine specific parameters. For more details on the the model configs, see the [API doc](https://docs.anyscale.com/llms/serving/guides/bring_any_model/) on bringing your own models. -In this example, we will be using the `meta-llama/Meta-Llama-3.1-8B-Instruct` model, -We will also need to define a model yaml associated with the model we want to use to configure the compute resources, engine arguments and other inference engine specific parameters. For more details on the the model configs, see the [API doc](https://docs.anyscale.com/llms/serving/guides/bring_any_model/) on bringing your own models. ```python - from rayllm_batch import init_engine_from_config # Read the model configs from the path. -model_config_path = "configs/llama-3.1-8b-a10g.yaml" +model_config_path = "configs/llama-3.1-8b-a10g.yaml" +# Use model_config_path="configs/llama-3.1-8b-l4.yaml" if on GCP. # One could potentially override the engine configs by passing in a dictionary here. override = {"runtime_env": {"env_vars": {"HF_TOKEN": HF_TOKEN}}} # Override Ray's runtime env to include the Hugging Face token. Ray is being used under the hood to orchestrate the inference pipeline. engine_config = init_engine_from_config(config=model_config_path, override=override) - ``` +## Step 3: Run the batch inference through RayLLM-Batch -## Step 3: Run the batch inference through RayLLMBatch +With the workload and model configs defined, we can now run the batch inference through RayLLM-Batch. -With the workload and model configs defined, we can now run the batch inference through RayLLMBatch. - ```python - from rayllm_batch import RayLLMBatch batch = RayLLMBatch( - engine_config=engine_config, + engine_cfg=engine_config, workload=workload, - # Specify the batch size for inference. Set the batch size to as large as possible without running out of memory. - # If you encounter out-of-memory errors, decreasing batch_size may help. + # Specify the batch size for inference. Set the batch size to as large as possible without running out of memory to maximize the throughput. + # Meanwhile, a reasonable batch size can offer better fault tolerance. batch_size=None, # Set the number of replicas to use for the inference. Each replica will run one instance of inference pipeline. num_replicas=1, ) - -# This will runs until completion. +# This will runs until completion. If you specify output_path=..., then +# the results will be written to local disk (local://) or AWS S3 (s3://). +# In this example, we only keep results in memory for demo purpose. ds = batch.run() -# Read the results -gen_texts = [r["generated_text"] for r in ds.take_all()] -print(gen_texts) +# Peak the first 3 entries. +gen_texts = [r["generated_text"] for r in ds.take(3)] +print("==================GENERATED OUTPUT===============") +print("\n".join(gen_texts)) ``` ### Customizing your LLM inference workload As shown in the example above, one can easily customize the workload by overriding the `load_dataset` and `parse_row` methods. The workload class is defined with the below APIs that one can override: + ```python @dataclass class MyChatWorkload(ChatWorkloadBase): @@ -160,6 +152,9 @@ class MyChatWorkload(ChatWorkloadBase): # Path to the dataset file. dataset_file: Optional[str] = "/path/to/dataset.jsonl" + # Percentage of the dataset to use for the workload. + dataset_fraction: float = 1.0 + # Sampling parameters such as max_tokens, temperature, etc. sampling_params: Dict[str, Any] = field( default_factory=lambda: {"max_tokens": 150, "ignore_eos": False} @@ -181,10 +176,9 @@ class MyChatWorkload(ChatWorkloadBase): ``` - ### Monitoring the execution -RayLLMBatch uses Ray Data to implement the execution of the batch inference pipeline, and one can use the Ray Dashboard to monitor the execution. In the Ray Dashboard tab, navigate to the Job page and open the "Ray Data Overview" section. Click on the link for the running job, and open the "Ray Data Overview" section to view the details of the batch inference execution: +RayLLM-Batch uses Ray Data to implement the execution of the batch inference pipeline, and one can use the Ray Dashboard to monitor the execution. In the Ray Dashboard tab, navigate to the Job page and open the "Ray Data Overview" section. Click on the link for the running job, and open the "Ray Data Overview" section to view the details of the batch inference execution: @@ -196,4 +190,4 @@ If you run into CUDA out of memory, your batch size is likely too large. Set an This notebook: - Created a custom workload for the CNN/DailyMail summarization task. - Defined the model configs for the Meta Llama 3.1 8B model. -- Ran the batch inference through RayLLMBatch and monitored the execution. +- Ran the batch inference through RayLLM-Batch and monitored the execution. diff --git a/templates/batch-llm/assets/configure-a10g-1.png b/templates/batch-llm/assets/configure-a10g-1.png deleted file mode 100644 index 132cf2b456461df20d4ecdf6182d327b8e36755f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72970 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℞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 diff --git a/templates/batch-llm/assets/ray-data-gpu.png b/templates/batch-llm/assets/ray-data-gpu.png deleted file mode 100644 index adf07f3fe723f0cb008a13b122517e2812bf7670..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21797 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%0De!Cp{dmH#bP zFXB-8Th_1dpzaSaG)JtaZ*GsaJ%g4YfHU!J;}w zJsq|UNkPi!q~bZbSHm6bZ0T%Lr>ARU4+-MJ6$4+!=^8X*XsNtjmLRw1&j=r$8Wg2W zuiB?^y5*`+);lu{iEU`YQiwiO-nZ88baR*w5to}XJA9sr9x47dpyl;`RASQIsnRdF z4NcbgbCm?&>3ZtJdI8zW8sI6C)|>JsbL4f6mNc(vhSER#Ok3o4_wv#hnr$&O$|aN4 zvoEQvD6C?@ni{F5MkBa*J(7Q;p3&HSi0my?U;EqX67fh1R_mfKm0S9@5J+Kw=X3(z zU6m}@cT9TCSlLvwTcJz{dnT$QsoREA_AMZjZlgcr)w1 zz?RNuGRXq`^5tN1src)oNYCf9l-Ol>CW4FoR(DmZ;l*;bjj4;ObAXTj5q?m9*By4I z?xXb(t_8fwkx;>H@FV_`G3cp3M5tWaT|Uh=YKlmgZcZrcohCyFDX8Wz>0bi?9VR!v zA@7(B_192pBJ4^@zmaYd$qXQA(gG4f$!g>_AdhKy$2-*v?3}MPR^*K4O;5|RC3qvP z0z#WN{~u_g=Wi1gHHQs9`fUMKR5HuqSDOgHCk|0RJyk;MjZNC`qJZaBXp9|!KYlT= zxIhwQ_ltA720iopjCMDpw^)wVXThb9A?jkkyHb0hodGH$OXu83E5Hl+IseKOeRk@a zE0j_L_$>{6_i<#&mk#GN7s~_IoQE)}_6{cMc-w@ZZgaVvAKmNyf+q#m8?Ehb0Y*mo z%YY#oN9=TwqGjNGLf~4`<@TaZvJdOUUq|P6$dX)ubdw=Y-W)%^RQi-7cif0)dUO?TlrYsz7S}RfU@d_KcSTx z)w&u$Ph|}67v8+Qyx7Y7NOm*DS_Ae5$2)m>oQ$p*5fxe`KcEh>#ZQ6nzddX?PN{ed z^!4?vPcZjXInk&VMGixi{2|Wh(MDjq`6p^Mheyfn0Pa2~@@m!)W+#z=Pto<=?X8-< zY!+v=jqllVb#;v;(+ZqnXMQ*;uHEa*b>IRPBTFLXwjczc^)2wapB5RT)(d#_3|d;Q z(oY!tYGnI`XwT=iyaRup?xZqn%Wkh5#+It|XDlbl4+hD|wcaKf`pdy4O2%PC<^V)c@&mH_dl7OZiR#uZM6c?se7mc(?Fun+2-S zs7#$dy_W14-qQIo3D9xn7%av`eAyYKQtC~1kd*;(;43R@)ZEEJskhal`*;=?v;W%@lZcz7f1Zfpjjg~K-T6D3=Pn;?~Rhl{pYf?a|$TQKLS^(UG%v_ zLO`tM1w;bImfXTq_h~;ft`Fc>ryRP4zo}1UacMoBoLp{)yJ9hD=dVK{1KQ-!-B#eo z9H2|w@19?|9#F~U1?=k;c6=vlaY@1Rv=Eo>HHWg}VBRoILv;Cu_F6wbBLSMf+R60zR{&s8?1&_F2segY!3K~AXs5u;11T8qcAp#KkmKaA zIWfuuKi=>Dp4C>;a3V%2s1^qoFunH911gVsvGHdeRiLvkQsd6}FrMbOsY8Y6S^#a1 zN>c({&dM0b|4{iOpN@d)N@ZnreQ_elNANQwtsO}K=>j9&?`bE(C;3*u)X4hoGiuj% zt_;@2D-Xx;7Pb}oH;teOoJ&Fu*)Rw`ZbE`6K%UxH$QxF=Y-2ML7 zR-%C$hIZGOsMms>;5SXun>Li1RvM77qe_WH>8$p&BqkPtqOq?5_!+I!Fq|wxQ&}02 zDywBGg~_J(;n)WG@EBAyiOrs9*(2+$$OPQ8(jJ)1Z(&M;&tXnEfG4eH{7!{VflyjI z(ccy$jtZXc#&Th_JH+9gF~OCUG*{VvW+|Yi@Pl_`Yiks(+aC6reOqP0qX~;V2_KxZ zD{_j%1Xkewcuwqj;%;H*3PNQvlS59T;Abk~Y&6YRRN@-T#-FeS`BHPaK}e*t!;{|E zL82S;&?}*-CiHfvbk*PappOBeU0s~ZdY0HAWXei{0YB^J6(Ekp&t!dnCFFIRE&M%ub;{Q>{TKWHmM6y7^CymzEw!<`$TlR21573OT*lslZ5g2HrWo8SEg{%ZE-%M zVFvH?_02--83(4ZIutVmQi4@WUBi8<96#CLT@ zh7Ly|Gb4iF<)ztzcZ$Imu$iL)=R+IQbc4#$YiCf)&|f1X+lSN&n|+N29w~`uI$Lok zf{fjqL&WS2#)q}R6Ae5^+)ZI}XyMB=jNEY5$qDsoQ8>FmRq4>-raMNW0#%;p`uE{X zaEfe861a#fvz2(9l_S8t*Po$K~$!=BA+>%Q#4RgQFZQ1Tcdf+j_1u4a1bC}MC)XoK;1 zCUgKJXfPI+E!OJJ=mrGYTp)!`RjFfSV>&tQ@8@cRen%5xrq9X&q=r@dfGd>JUyRzt z7dnubJPo8W>Eo3X)$E#gf8{}n^}>m9-P$zI{cZBZ^{K@=#<}83uIkSb8uBFAU^v(p z=D%246cC8eD|K3eyW0!#a?ZXw%|Ygs<=4?Y)!n{#wA)IlT6*GsoS!7@+p%TQ;D}J* znn=?Vu49bgAYc}Q>j1DKWjT|3AVY^xA(HY-&qBlH{&XqjtIuOdw%g!;)ig3<%wBgYyTxHBRBQnUVZSrrAR+W% zj^aLxJk1)ZXsU;xL<;ym%mQ0Vxo9}T=_}xd=aLtW<3e&q_c-?HX_ti6gsjxw-?mNHXUNOr@3P_f=E zsiHehb)0|L=jPuGcp}hX%$T{v{6)p0p-q?DiIRu@dtWG9W>Fra`7DToVEVJM+~;GR zLC8>89Eb}9)KS2owgR>$cFSpk``Ij}!Vr>pkx-a&R=w*ZVY>-Q0=tj+*Ay_KFZ{|l zq0m!OLa^ROct0?}3$F{}@}J7Z+N$7XM)=8-Izw!V zl3W1ma%HX5*d{X6c9x6OxwXn=HnEnsX4+-lx`==LJ*3 zNudcdIX(a%_qs(kPpRe@A8{?8g}zXjp&N?- z0;R{33w1WRKv%wPJTDP=PoiT5)nzJDd%L{JuTfJ$&9a8nhee?EIr9*TO2O*Nh`)@A2>Se9&i0s zLM;ZO-Ai^D@s#Q(vR5xN*8Mi~zPI$0c{4#)Cd7ygN8M{qeHkpwh6$bxng|I3R5qIS zuXRW5>JD)k(_A-0q7TT=kmcdG8|xmT;!R?En;hx*VG7unebL&QjP&IxKkg+c>tx-A z<%#BG^0hen&b_bebm0ka*Bfce{xsO|KgIR8k1XZZE*Sh=nxN?s(uw|bXuc#X!4P80 zTsR01F(*#q06*EH`gC^;eOYoe1#6v-b+kAZnPS(brBFQ>XMSZLE>&eZ`W3IGFEcx( z&JcORUFT`fg~35i`xjOcR>&%gjv;S1)gx#ehYZ7pUph@H=_Xsa^Y`JwEXz9r;`$B3 zF+XEObYp9GaCz9M$P<^V8F`FQ;MXBTjcXhFZQ3qg>M|3D%VCl>`E-Q)I|LI1(vtAI{FBB1TzG|L@Gr5nDryErL?N( z#kl8XoW+749oU~(lbF8t4hq*P z$3QpE99k?0dJ=7}E*|l8@?%xvG-)W_+d<_r2d|lgeqZK?k+VObm;8ozvmGp!fThG) zc2zISF0WjArg(ZF7P{wbw7P0tIMUIgl$y*CeXJ^e-aZm*gcrJ+>wsmrOsz1YY3yo1 z>_7}-Be;Y7E)qs)$8T>vXyqnAh!Ykj$)GU2C2ljTE@I+Lk@{(DERjboY%KmHs6e65 zZ6+7euyX2;)I%6smhT{NBG# zH>^avkX8!Q(0gvKFqimwh%HGwV~AkpknLIE9=4zP$&HRQ!7fc*7UTp8enriqg%?AL zGs{%R1IoGnW`}Z%y)Ey-pLzjq>rBG^?l8Z8ZtAi)#b4@6B^t*iRZsoPL_vqbJ1iO8c6CL+E(#_xc3iY`+rqZqUKMSwo90n+-RJA56HT zkqU^!;*UGNK6E=fN?w@Hg?|fHF0P!U`fwLasB_oBHgDaKjB&!s`UV@+fBVhYMaU4KRh^bJ-s_mjw3vwYy!)^ORveGggKs~;`mHLw6$0lAdowpF+#QmS7QHee#(BjddcWPPFXas<#q&;KvDF>A*ttf3DsQE+;dy!ZT=81wQH@RWvVa+0z&Nef_KogV zYJ^^^wt!RnW>a#xW}~bm%0am&Ubem0bd}R#RWw-SvCQB?SG`jk4YRhD(i+{cIOXAZ zbEt%Z%;-C-sSmI313`{}XYhC$y&Ok{7VC|%Prf@o=N#obeGOXrnos( z;ZEcY`JL2K2&(;s<@h2?d>dv613am{Gy4~zslhcxH7a4mP z>_=E0R`ndiF^^_aD=}qWza_AH9kDdI`1R9G7Y^;4 z+}2!pAMVtOKbGzCvur>Na}^wCCnK~ys+ZY3i|5sEFi3~coL-SI69ZBOcaMn&?3V9j zxgsqrFLUj!GZY`MKclf23`A2Z)s^eLzQOtnWGDXds_5juziTZVrrDJsTmNkTS6tu~1eR;13XDG*yXC$rLh)sN_dJ5SbBY<*kUqrTIr zP0(iBArek{oxoeW34AX$4u$<@h(~lW^V#wp!sg|#?P8sXfO|HRy^U_06>SRr1Tkx) z*}hV)Pr#x^IN@6|t^T;x79-VKm#@z4K4;Zd-S-CbDM@`HFQpva9BlNHU-#t82zs>D z);s-_ilUSMb>Z66+qzl;(+vV?oA^3$HR15WW_!Hxo$oG*2 z-h`ZM0spz5X?hnEy%sr4wBEneG8g%~Ps)o9o$5l%eF0fWlw2~dSor~3|0v-*po_?x z4lDd9iTjWW=J(Wb&J{mU-s)(C=*!^q3K)cUOKAjd5A8u<;3tMD5kH|n*P%t!`R=0Tfmux|) zOdlf%xQ3jMM1uRyno2|G*DHHJ8Y3jbdDcHn70RK6p4y-Jx?lLg_tx+6y`5t}k7Iw; zXc_45PeGM4?7lF#7BK(H^V0%`bIvE=SDZril~>n5qTT#+<@xj4)}zgWR+(D{`tV72 z>T3P!n-|Nez$BJ2dXp6OkefWa_H%?~tUAvuVmV?HtGxBweg1ou@$>0ia;$<3+-sP> z&{;W_-deY90$GP6OrXU3JDNEz^(qury+_pM$ed}97HvcVfr_uu+ClkOTi0j;1PE41 z5|3OOuF7B`_ba82MkQKNzB#1`M_YO&1!VhUsu{uh6l#fB#&Y!n{;B=V`tkGEh-6xg z=tD+r@g=VzE4WkjSbx31DgCl|5wDoEn*30<&Rq(?#ZbfV(BS*oQ|a*%Qc?rv3h?}=)}{%cWl`#q}oS&iA;WL_{C`ygM#!_ zoXX_?@I#nSE}2I1tZe}NUi8gkDp!d**Tz$?;F#D+eY~84+255(kMEM7Yja8Bw;Bc*qZMRz)l?5nzB=_7};9ruy zE?7;)oHMVFDte?dd$%1`qCY-`?-d?te>>HnU+AfP-#Zv2gG1^{w_UD2a+e~DcaGZ3 z^BbJLQfcy;()D@WXI-k+NHVZd-YTvn--_BRwc1awzq{8moIk79n+=mWpAG22PY6{g z0r+H{1qMFE)^FQd&O#-@i$Zp)DmV6gL*ha!tG2CpJgJMVGtur>R&R2H)Jgu>-Nszv z1r{Rg7QdmMD)+A{0fB*ZU+RK*d;Hqx&mZ+<&$#RlQ9(p3YnY`K8gvy+?dK~K18m3Z z3uO%!Q~lkI43dP=1WeMiiuXkFxx8}@n;;_L-T;#THHWNquN;je@^{={i@X{%LSP$Di!FAZeU`nF6sdG}XZGbSVEN6Wp}O z6+#Dx1q1m8{cQ>J2>+Xxf7f;1KW5Dh-SWZxDV;$f3c7ZI>ipWvWYArux!z~PSL$6% z#DIyl6{7K-fKeKq*uCB7jh9)`W%Y8G^6<=bJ?knkTNIa2UhhJd2k`WNn2so=$222E z+?bG;D&}$Q));ivSU7W#WkV@HBp%Rb?|-8Z>E(dR-73y4ybTq z%oY_BU5d?n`|Ee=mcd*YqzzYfu;j<-xFP9o(*;5-Zr6f>dwF9bE>Aj~%C+E7O0$>A zYPF-5|8DP?!J{>iF~zoUIGz$3jTzM`jZowHcTxwB#S3TZs6#m5?>*PeQTfk}p0^TS zj|a6*ZRfu`N1N(Bij2+jS&f~ERB+s4B%5&O*UbZW6E(C=N52d-@(`ZK7kpEA)yC}5 zY=wC%i*mo}NN==Q7o%Klc1i7Ze*}O1gH%x{g|yT-ctSK0-t7Al$KCa{u>WIQBYeJ5 zGF(FXN8-@Ld%>v&-P+Wl4NqY=A-ZJ}wh0Ow19b#u-loG#$8R6mB9d(ch(9KxA)Ose z$FduWj-^t@35#D@cE4c}%8b|&b^m@q1{{xMU1~J**q4BYrRe!{o$&>Wk zw=-k%CEe)sX7x00MC{w_SH7jc-_l*Y(X))TCpFS?I!A}HOI;65yGG~sdP>h$9LqSc zB9K1fg$Y_hmZF9g(+AZQ5=uiO60UdK&{l*6t;A?BsPfo&+z;8S-yMN%HYLkBWbRuz;_dgvwz zgf?IUQ}Y2ZJF5tZ0UT21N+I=kf6YiST{r04Wj(K9HA4e`yaxLhl!pQS1!Yk&;`u{H zJ=*g>rsV#UPcrfZ3Es}@qD{sNSa>`>Rk8!9n)4acs7HbZ!YyuNyW=Yl2U>>sP~JPc zlm=2a`Qr(gF`V|BvU?fqY?kAbXY3XwCsmZe`EELWuGa}i&|dYr%E7PC);BXfH=VDQ z$caPa>tfxw1(6CuBOa(OS==X-~2vA z#7=sH2RftGtedyT%?!X+zZ=P32a9!U&}XO7>t!bX{R`l=zqI`KuCjl=ytI1lU@_#9 zk->>$2Ya!Sx;M@lQ05e8+(z7n`bB6Ze5DFHn5k2pzFH_zTl-v`{Wo;doa9Tps>FcZ zSQ0&#KbHr;zzzpK>j&Q;b2YL5gEcBrgzLw;~G4r$q5 ze9q4dyG+{ZQ!azL{XGX_)hX|t#miVJ6q&jF!`w$-)_VZ2wUxVy!}4R3oiR&#<-Zv@L^f3i#C?M zm6ql-FaaL3C;HDv9Pjiyh-P>-Miq~8g%9>3Wl6I^mng~4_iZv6>akg9G&wjG?E0;D zQmXx(?C*)ZEG0aJ+sgx?sYFhHI0D{@wg*xrwSJdJ+_)+&`6dC)m|Vq)YK0fPgb{bQ z(@x?%Q-y~AVa#|2Ip4wVjay$o=`=5t!!=oFVEr1W*LE6=^YIbyI`zRlVS&9dE1JJb z;&HMm6R}*4#;!*8-OV@6W>w1d2KS#lS!gKS0U;1qH=?a}Ur*5|GfCOC^@StL)k;eM zh6Epcl0Uj>54AfK7B;Z?om-AAFKL>Yu-RcL1Zy&*pyl=XEkzBVVmsa_g-GAc5WP0H zOzL|rE#ddkTZW}k3#dudX1ati$Pf+xeD|k@XR}nZv25lh~}$-%&}Wa5*>+6k3P-elJ7*|VO#KF^biFou7A`W9P*r7Awh^qD6JTa3H}XDE1UrYDCuqu~Wy0J`y3 zrN!yln(K^rh&z|^(;BWHCI*G&Qu>P@yTy*=>H_0$kTd8D!=qs8Mnm&k_1K0;A^MEJ9NObB}fC&&5xNQyo>&h;vm{RdBMOf556R z_`E&sKJ0x&bVlJ4tXb5iN!#LqquKf}e~-1;c%nk^MulvgzB0FQd2h+h-4lo2^zeaI ziiDS+HDk1Vo;?$?K$gVsF*0xi4y$mL7E1ak?em}e(exArV)f-*?7qBDf`6v^j@O_(*z zc!gnN8}q4D9{O5Hv$3wNPS)*5mB!^af@Pgz-YLI{CHrb4CZcCYLubiVD|g5P99zRz zZz#Y71eCJ)EC7v#48?o1cdZpDxTKF^p0#b8&@UWYgY;s7Y3q}}h2?rV(f-(9RVm5= zRgu%7!|q{>O}m!y#mD;b^$iqrn_A>dqeU1&^Wh5FTcx(Ga=OUZ37a{}q2cED=d~vS zXaXVHI)10vX%_K05owh0cfoLfT&~2$ z`NXDs@};x!(k*T05ZXt3=v5F^2CXYLg^b}2LWmH)eJeAY8}P=B4PW=UCXI{-nuqL7 zUi$1O%q0uiW>$6%Ck9Y72=anf7!q38F6f|>-5nk_QQ6Oe{tin$+eKhf!X69A{ow zH^7PAn%891vznlikM78pnEQ?q-*H(;3r?^neZ;=N&sZ}X~c&2>;WD~v9!FD1U!W3jL$uoW_kAqf2-67JT%^hy`%v^Ndt9&?L_ayjDql9 zMNPo&Z~R$8=3{mzMn^{zcnc+QCT9m*6}?@}WZ$}UIQOdiv>F>q2!7m=DuYKCZHPOh z7MMYc(&4y0g(m1Mv>al7G0=91P7 z&!<{Mig8mdVr>g%m4r$S`1`Xj5(s2&SQ8C;a=B5{lL3S!r(zJZCcsJF)$6CKxho2= zpu=heaJq);%tS~}9=9RQ=OSDG7v21Jpu~+~CGx&QicfoBr<5XO7na%jeGoB4G9W0h zuZ957S{lm31&-OdN@Qfs<`^3@C=)znDixK0p)E~?r7LMOUu~%_AB8{?{8TdZiG43D1 zWD8mH1xfK$6(;WLl5Bb{nl579sLs9b=&$v{jrwT^ZZlQMRU7qz!?jj`hxe~5cR_$~ zVu#r9*%Oj`10TnB_}$Jro=K}6+{FXCs_aNAf{8G1=Gb4vH*(U_6O$JHZiE;;U>6OZ zZvn4_nCYYbBDm~4K#{)@E6U=1s@Z~owivn>(uj`<=?3yUKBedKt^(EX@CH&vwi>%c z>3~=dfQMu!rlme)&OAHIks!6Q?ya=)Ut2~<_*``orNy;-9`Izz`p-Gf<>sE1_4g#_ z$PCa;#L|h{75Al8bssq_76zGnB)z}IyRY`PV{w7P<8;liiMHQTTwX=lxw^l_InF-KAsDN4O*e%(-do(l(`%9@#-DjaSyC5Xi4+5Gu_!E1) zqpSkltbUQ(>m9bQb^FTGL>-W}F;VFXD`vB94~aCZuv7iB;QlDjA(X>EiLW@}pmVTetc|_W<8vN~X|FEFB+*OhKleV_v6*gjp>WX3NrFqc>Na|>NQ#7t z%Ea&lT~Rv>!C_#NDmCsnI*AcVkL!*LHEtKL=EL%lS;pXlkD?@xX_;7PV^jh+4Ar`t?56 zBZPKag)QnbV;!VAu|!i%t~cF(@mq}xZ3JvLB|_@%6rmjl4QrNvIIV0oN;<987oJV( zXDNYzJc>MbP%`HzuSOirhQa~G^aDt@lXgmX8tMaoWy-jxjo}Wg&z#>zPC4W>%_A_H z9$qSl$W!KjYuRR4=FQv8+6W7@qL)xu+xdn| zL`G%2piE?o5>`IU4;WWk)VwU74LlhEDMF3e-}5X36yWF*TGR>K7Mv<-$13N=753*2 zJ*04RBBj-v_z{tJl0hoMWBk{jW}lJMgsYBM{1z=TzD_5_vM9_h0`0io^)`MKb8*t! z(-U20hS2?Zsv2~-Mg=5Eh|l)AhxX?JnE)fF)$@jANs(XM1BVPO)E|Sb9Xs=jd_I23 z7oR6DImhjnMYsF2Z9*9{WC^_ZZEN}7FFwE5>OX%?8|A>Om-5CBI|mYd2-Z5Y_$BZp zmjH*u@vEgDqK7KJm=uUYL-PkaiRSCC*#9_U+D9uM+uu7m-LnT@9e*@w1v~gcE>*4C zFJE!Ngl*u^qcvo$KIOoP^0}^_owF|17hF=qCO;RZghks?L8QJDEml~=eybt_F@fhG>NjWl|FD-!ka7(pShRwYKQ0WZO4e|m~u`6jS|Tk1L-x!daD}5M=S20u^9C@)7K( zzI3u`(`Ec(Tbfq}OcV6T$Vu~rD=t(PDCCD$Y{#@=G_N^CjEirZRA^BVlgkDl-~Pz| z8u;ukkMj}OG{Gk@T>D-h8elWmt|`AcOYhLGnIf%p5_N(8EF;usF44Y+LKqulDXAy3 zD&<3cvoos1+JRgk)bs*rL4b9=C5%K(?7pl=Y~cN~LpCjnr|RnmQ@mv%TFHDT95!uU zu;PKt%DSv(KS5pn9JzQQZDv?`$>y06cN~*LnjqctY}?;89M^PT;wCG`ifpqieXu)< zP0*tz9hoItW(A*gq;;#B#H%4gUz-j~5!)M%Lz(8^K8Tp67=3!I_^OL5;_)3JrYkIW zQRVssEO?Y8<_4{lroQ(iy3}W2v-!7rX7(odK5NW3oixN2)+fkd+xOJw~dPAB;@*|Yxz-I$^kI~AClR>%lqF)wfdgX zDxdyHM60xAe17#Hi3R5JGJsJlWppA&d+|&tp*Qd(fOGP;onv5*C}{!H z>&2K@>XOR+N!I1w>@2U9e%10Tt0Bu?sWL+0WVVi2h#7Dgrm}4$n0yLrm#cJorv?s9 z2zK|VQD3m?Iz@gLeQ4A(7_v*5%%+&4bdk@N$e)|6*Dmq*r zVd$x*;xl1acKy|e=G&OuGmbO4McZE`7Ek7wj+OPs6z0FZWjK`F%z&A3@H!5hejX7> zeY{NSyK;wNaeMiP@#x2a-+&CLcAg!V0TB*TQBse{DzUyJJD?ie&1Um0paYvo)foha zROrILFi9hzc-3<3g=K{jKfiGyhNElpyofSo0*_S;!d1l*870D#SmpKO(=ODR9=cbf z?6J9OxSCp*6F1Z#SB7GsnFb?nGCFD#CUNv8LQAmb2afIxy5Iv+)J$T~VWhLHKbF}4 z;!ob4=S|oe7p#meV%>EIC7Omv$!zy|vs`9MM+QFh=l8yI+2hAD?8dj-)id>kBIz`YdiWmwj404KarwO(=}{)c&45Y4)7z zGj-JJ*rP7X%8+>FL7dqAOI1ZuOg=Zjh(@w#Ti)Lo=YhObVq1%|`r9yx*DmcWGp#vU)3qUb zRFT;|b8Xs1C}8wQW-mjupBr@hTd7fX#2CL_(0IINa+cQnkj$&ajq!R@g!kr$s+u9OH!Gs2A44v-DT+GB5H|6aUm!@7>Z-;; zv7Qra$yL|-8ol%33w7|Jk@}L{-5ADe^(CqQ;7jX&*u*ykxLTP1I6gW)x8EC{=7qo& zNXR+bC6jvm^H}SDqs0?-;W=*4( z7r7X8FfNQr=ZO63^{?#M0gpf>)xZfoi07aTh(xIRf~l}IA}oz#A)#Zd-Lj=3+{gwH z6k3@;&&WM^CQ?aDe3uw#8A%tVwK;*Dp;)~Atpz&*R%KTOdc+UxZUvHR_^$(zU~T8P zn;$M{|9^k_L0XTj>BoFrEWY_?r=0k=^QZ4Ux1vphS2S{#6t7as{;Cvlyh{0BDMRs6 zLzO~}b@(k)I1LT+hR>8chz|CT;K}45_)G<->lHLb#o%_fFo02PN>FPNXpI4x Date: Tue, 24 Sep 2024 20:02:52 +0000 Subject: [PATCH 4/6] update --- configs/batch-llm/aws.yaml | 1 + configs/batch-llm/gcp.yaml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/configs/batch-llm/aws.yaml b/configs/batch-llm/aws.yaml index 6d8abbf5c..4d9a8bfb1 100644 --- a/configs/batch-llm/aws.yaml +++ b/configs/batch-llm/aws.yaml @@ -1,3 +1,4 @@ head_node_type: name: head + # TODO(ricky): We need head node to have CUDA due to eager import from rayllm_batch now. instance_type: g5.xlarge diff --git a/configs/batch-llm/gcp.yaml b/configs/batch-llm/gcp.yaml index 88abf4be3..cbac56ae6 100644 --- a/configs/batch-llm/gcp.yaml +++ b/configs/batch-llm/gcp.yaml @@ -1,3 +1,4 @@ head_node_type: name: head - instance_type: g2-standard-48 + # TODO(ricky): We need head node to have CUDA due to eager import from rayllm_batch now. + instance_type: g2-standard-4-nvidia-l4-1 From 01c0475bf25e6392fa6d36ff46fa8329a793ac70 Mon Sep 17 00:00:00 2001 From: Ricky Xu Date: Wed, 25 Sep 2024 10:02:37 -0700 Subject: [PATCH 5/6] Update templates/batch-llm/README.ipynb Co-authored-by: Huaiwei Sun --- templates/batch-llm/README.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/batch-llm/README.ipynb b/templates/batch-llm/README.ipynb index 68e827c9c..fdc886665 100644 --- a/templates/batch-llm/README.ipynb +++ b/templates/batch-llm/README.ipynb @@ -31,7 +31,7 @@ "source": [ "## Step 1: Set up the workload\n", "\n", - "RayLLM-Batch is a library for running batch inference for LLMs using Ray Data for data processing, and defines an easy and flexible interface for the user to define their own workload. In this tutorial, we will implement a workload based on the [`CNNDailyMail`](https://huggingface.co/datasets/abisee/cnn_dailymail) dataset, which is a collection of news articles. And we will summarize each article with our batch inferencing pipeline. We will cover more details on how to customize the workload in the later sections.\n" + "RayLLM-Batch is a library for running batch inference for LLMs. It uses Ray Data for data processing and provides an easy and flexible interface for the user to define their own workload. In this tutorial, we will implement a workload based on the [`CNNDailyMail`](https://huggingface.co/datasets/abisee/cnn_dailymail) dataset, which is a collection of news articles. And we will summarize each article with our batch inferencing pipeline. We will cover more details on how to customize the workload in the later sections.\n" ] }, { From 76c74395f4f7a0723bb360fb6b9a2578bca44cff Mon Sep 17 00:00:00 2001 From: Ricky Xu Date: Wed, 25 Sep 2024 15:48:10 -0700 Subject: [PATCH 6/6] Update with comments and fix GCP compute config (#352) Addressed comments and fix GCP compute not found. --------- Co-authored-by: rickyx --- configs/batch-llm/{gcp.yaml => gce.yaml} | 0 templates/batch-llm/README.ipynb | 8 +- templates/batch-llm/README.md | 10 +- templates/batch-llm/main.py | 147 ----------------------- templates/batch-llm/util/utils.py | 8 ++ 5 files changed, 21 insertions(+), 152 deletions(-) rename configs/batch-llm/{gcp.yaml => gce.yaml} (100%) delete mode 100644 templates/batch-llm/main.py diff --git a/configs/batch-llm/gcp.yaml b/configs/batch-llm/gce.yaml similarity index 100% rename from configs/batch-llm/gcp.yaml rename to configs/batch-llm/gce.yaml diff --git a/templates/batch-llm/README.ipynb b/templates/batch-llm/README.ipynb index fdc886665..486b31847 100644 --- a/templates/batch-llm/README.ipynb +++ b/templates/batch-llm/README.ipynb @@ -130,9 +130,13 @@ "outputs": [], "source": [ "from rayllm_batch import init_engine_from_config\n", + "from util.utils import is_on_gcp_cloud\n", "# Read the model configs from the path.\n", - "model_config_path = \"configs/llama-3.1-8b-a10g.yaml\" \n", - "# Use model_config_path=\"configs/llama-3.1-8b-l4.yaml\" if on GCP.\n", + "if is_on_gcp_cloud():\n", + " # There's no a10g on GCP. \n", + " model_config_path = \"configs/llama-3.1-8b-l4.yaml\"\n", + "else:\n", + " model_config_path = \"configs/llama-3.1-8b-a10g.yaml\" \n", "\n", "# One could potentially override the engine configs by passing in a dictionary here.\n", "override = {\"runtime_env\": {\"env_vars\": {\"HF_TOKEN\": HF_TOKEN}}} # Override Ray's runtime env to include the Hugging Face token. Ray is being used under the hood to orchestrate the inference pipeline.\n", diff --git a/templates/batch-llm/README.md b/templates/batch-llm/README.md index 6cf133f6f..f47261a6a 100644 --- a/templates/batch-llm/README.md +++ b/templates/batch-llm/README.md @@ -21,7 +21,7 @@ In this tutorial, we will focus on the latter, using offline LLM inference for a ## Step 1: Set up the workload -RayLLM-Batch is a library for running batch inference for LLMs using Ray Data for data processing, and defines an easy and flexible interface for the user to define their own workload. In this tutorial, we will implement a workload based on the [`CNNDailyMail`](https://huggingface.co/datasets/abisee/cnn_dailymail) dataset, which is a collection of news articles. And we will summarize each article with our batch inferencing pipeline. We will cover more details on how to customize the workload in the later sections. +RayLLM-Batch is a library for running batch inference for LLMs. It uses Ray Data for data processing and provides an easy and flexible interface for the user to define their own workload. In this tutorial, we will implement a workload based on the [`CNNDailyMail`](https://huggingface.co/datasets/abisee/cnn_dailymail) dataset, which is a collection of news articles. And we will summarize each article with our batch inferencing pipeline. We will cover more details on how to customize the workload in the later sections. @@ -99,9 +99,13 @@ We will also need to define a yaml configuration file associated with the model ```python from rayllm_batch import init_engine_from_config +from util.utils import is_on_gcp_cloud # Read the model configs from the path. -model_config_path = "configs/llama-3.1-8b-a10g.yaml" -# Use model_config_path="configs/llama-3.1-8b-l4.yaml" if on GCP. +if is_on_gcp_cloud(): + # There's no a10g on GCP. + model_config_path = "configs/llama-3.1-8b-l4.yaml" +else: + model_config_path = "configs/llama-3.1-8b-a10g.yaml" # One could potentially override the engine configs by passing in a dictionary here. override = {"runtime_env": {"env_vars": {"HF_TOKEN": HF_TOKEN}}} # Override Ray's runtime env to include the Hugging Face token. Ray is being used under the hood to orchestrate the inference pipeline. diff --git a/templates/batch-llm/main.py b/templates/batch-llm/main.py deleted file mode 100644 index 5eb5900eb..000000000 --- a/templates/batch-llm/main.py +++ /dev/null @@ -1,147 +0,0 @@ -from vllm import LLM, SamplingParams -from typing import Dict -import numpy as np -import ray -import os - -from util.utils import ( - HF_TOKEN_LOCAL_PATH, - generate_output_path, - get_a10g_or_equivalent_accelerator_type, - read_hugging_face_token_from_cache, -) - - -# Set to the model that you wish to use. Note that using the llama models will require a hugging face token to be set. -HF_MODEL = "mistralai/Mistral-7B-Instruct-v0.1" - -# Input path to read input data. -# Read one text file from S3. Ray Data supports reading multiple files -# from cloud storage (such as JSONL, Parquet, CSV, binary format). -INPUT_PATH = "s3://anonymous@air-example-data/prompts_100.txt" - -# Name of the column which contains the raw input text. -INPUT_TEXT_COLUMN = "text" - -# Output path to write output result. -output_path = generate_output_path(os.environ.get("ANYSCALE_ARTIFACT_STORAGE"), HF_MODEL) - -# Read the Hugging Face token from cached file. -HF_TOKEN = read_hugging_face_token_from_cache(HF_TOKEN_LOCAL_PATH) - -# Initialize Ray with a Runtime Environment. -ray.init( - runtime_env={ - "env_vars": {"HF_TOKEN": HF_TOKEN}, - } -) - -# Create a sampling params object. -sampling_params = SamplingParams( - n=1, - temperature=0, - max_tokens=2048, - stop=["<|eot_id|>", "<|end_of_text|>"], -) - -# The number of LLM instances to use. -num_llm_instances = 4 -# The number of GPUs to use per LLM instance. -num_gpus_per_instance = 1 - -# Mapping of model name to max_model_len supported by model. -model_name_to_args = { - "mistralai/Mistral-7B-Instruct-v0.1": {"max_model_len": 16832}, - "google/gemma-7b-it": {"max_model_len": 2432}, - "mlabonne/NeuralHermes-2.5-Mistral-7B": {"max_model_len": 16800}, -} - -# Mapping of model name to input prompt format. -model_name_to_input_prompt_format = { - "meta-llama/Llama-2-7b-chat-hf": "[INST] {} [/INST]", - "mistralai/Mistral-7B-Instruct-v0.1": "[INST] {} [/INST]", - "google/gemma-7b-it": "model\n{}\n", - "mlabonne/NeuralHermes-2.5-Mistral-7B": "<|im_start|>system\nYou are a helpful assistant that will complete the sentence in the given input prompt.<|im_end|>\n<|im_start|>user{}<|im_end|>\n<|im_start|>assistant", - "meta-llama/Meta-Llama-3-8B-Instruct": ( - "<|start_header_id|>system<|end_header_id|>\n\nYou are a helpful assistant. Complete the given prompt in several concise sentences.<|eot_id|>\n" - "<|start_header_id|>user<|end_header_id|>\n\n{}<|eot_id|>\n" - "<|start_header_id|>assistant<|end_header_id|>\n\n" - ), -} - - -def construct_input_prompt(row, text_column): - """Given the input row with raw text in `text_column` column, - construct the input prompt for the model.""" - prompt_format = model_name_to_input_prompt_format.get(HF_MODEL) - if prompt_format: - row[text_column] = prompt_format.format(row[text_column]) - return row - - -# Create a class to do batch inference. -class LLMPredictor: - def __init__(self, text_column): - # Name of column containing the input text. - self.text_column = text_column - - # Create an LLM. - self.llm = LLM( - model=HF_MODEL, - **model_name_to_args.get(HF_MODEL, {}), - ) - - def __call__(self, batch: Dict[str, np.ndarray]) -> Dict[str, list]: - # Generate texts from the prompts. - # The output is a list of RequestOutput objects that contain the prompt, - # generated text, and other information. - outputs = self.llm.generate(batch[self.text_column], sampling_params) - prompt = [] - generated_text = [] - for output in outputs: - prompt.append(output.prompt) - generated_text.append(' '.join([o.text for o in output.outputs])) - return { - "prompt": prompt, - "generated_text": generated_text, - } - - -# Apply batch inference for all input data. -ds = ray.data.read_text(INPUT_PATH) -ds = ds.map( - construct_input_prompt, - fn_kwargs={"text_column": INPUT_TEXT_COLUMN}, -) -ds = ds.map_batches( - LLMPredictor, - # Set the concurrency to the number of LLM instances. - concurrency=num_llm_instances, - # Specify the number of GPUs required per LLM instance. - num_gpus=num_gpus_per_instance, - # Specify the batch size for inference. Set the batch size to as large - # as possible without running out of memory. - # If you encounter CUDA out-of-memory errors, decreasing - # batch_size may help. - batch_size=5, - # Pass keyword arguments for the LLMPredictor class. - fn_constructor_kwargs={"text_column": INPUT_TEXT_COLUMN}, - # Select the accelerator type; A10G or L4. - accelerator_type=get_a10g_or_equivalent_accelerator_type(), -) - -# Write inference output data out as Parquet files to S3. -# Multiple files would be written to the output destination, -# and each task would write one or more files separately. -ds.write_parquet(output_path, try_create_dir=False) - -print(f"Batch inference result is written into {output_path}.") - -# Peek first 10 results. -# NOTE: This is for local testing and debugging. -# output_ds = ray.data.read_parquet(output_path) -# outputs = output_ds.take(limit=10) -# for output in outputs: -# prompt = output["prompt"] -# generated_text = output["generated_text"] -# print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") diff --git a/templates/batch-llm/util/utils.py b/templates/batch-llm/util/utils.py index 513a7669d..332d14cc6 100644 --- a/templates/batch-llm/util/utils.py +++ b/templates/batch-llm/util/utils.py @@ -6,6 +6,14 @@ HF_TOKEN_CACHE_PATH = "/mnt/local_storage/data/cache/huggingface/token" HF_TOKEN_LOCAL_PATH = "huggingface_token.txt" +def is_on_gcp_cloud() -> bool: + """Detects if the cluster is running on GCP.""" + try: + resp = requests.get("http://metadata.google.internal") + return resp.headers["Metadata-Flavor"] == "Google" + except: # noqa: E722 + return False + def prompt_for_hugging_face_token(hf_model: str) -> str: """Prompts the user for Hugging Face token if required by the model.