You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

1020 lines
86 KiB

{
"cells": [
{
"cell_type": "markdown",
"id": "d15d8294-3328-4e07-ad16-8a03e9bbfdb9",
"metadata": {},
"source": [
"# Welcome to your first assignment!\n",
"\n",
"Instructions are below. Please give this a try, and look in the solutions folder if you get stuck (or feel free to ask me!)"
]
},
{
"cell_type": "markdown",
"id": "ada885d9-4d42-4d9b-97f0-74fbbbfe93a9",
"metadata": {},
"source": [
"<table style=\"margin: 0; text-align: left;\">\n",
" <tr>\n",
" <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
" <img src=\"../resources.jpg\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
" </td>\n",
" <td>\n",
" <h2 style=\"color:#f71;\">Just before we get to the assignment --</h2>\n",
" <span style=\"color:#f71;\">I thought I'd take a second to point you at this page of useful resources for the course. This includes links to all the slides.<br/>\n",
" <a href=\"https://edwarddonner.com/2024/11/13/llm-engineering-resources/\">https://edwarddonner.com/2024/11/13/llm-engineering-resources/</a><br/>\n",
" Please keep this bookmarked, and I'll continue to add more useful links there over time.\n",
" </span>\n",
" </td>\n",
" </tr>\n",
"</table>"
]
},
{
"cell_type": "markdown",
"id": "6e9fa1fc-eac5-4d1d-9be4-541b3f2b3458",
"metadata": {},
"source": [
"# HOMEWORK EXERCISE ASSIGNMENT\n",
"\n",
"Upgrade the day 1 project to summarize a webpage to use an Open Source model running locally via Ollama rather than OpenAI\n",
"\n",
"You'll be able to use this technique for all subsequent projects if you'd prefer not to use paid APIs.\n",
"\n",
"**Benefits:**\n",
"1. No API charges - open-source\n",
"2. Data doesn't leave your box\n",
"\n",
"**Disadvantages:**\n",
"1. Significantly less power than Frontier Model\n",
"\n",
"## Recap on installation of Ollama\n",
"\n",
"Simply visit [ollama.com](https://ollama.com) and install!\n",
"\n",
"Once complete, the ollama server should already be running locally. \n",
"If you visit: \n",
"[http://localhost:11434/](http://localhost:11434/)\n",
"\n",
"You should see the message `Ollama is running`. \n",
"\n",
"If not, bring up a new Terminal (Mac) or Powershell (Windows) and enter `ollama serve` \n",
"And in another Terminal (Mac) or Powershell (Windows), enter `ollama pull llama3.2` \n",
"Then try [http://localhost:11434/](http://localhost:11434/) again.\n",
"\n",
"If Ollama is slow on your machine, try using `llama3.2:1b` as an alternative. Run `ollama pull llama3.2:1b` from a Terminal or Powershell, and change the code below from `MODEL = \"llama3.2\"` to `MODEL = \"llama3.2:1b\"`"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "4e2a9393-7767-488e-a8bf-27c12dca35bd",
"metadata": {},
"outputs": [],
"source": [
"# imports\n",
"\n",
"import requests\n",
"from bs4 import BeautifulSoup\n",
"from IPython.display import Markdown, display"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "29ddd15d-a3c5-4f4e-a678-873f56162724",
"metadata": {},
"outputs": [],
"source": [
"# Constants\n",
"\n",
"OLLAMA_API = \"http://localhost:11434/api/chat\"\n",
"HEADERS = {\"Content-Type\": \"application/json\"}\n",
"MODEL = \"llama3.2\""
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "dac0a679-599c-441f-9bf2-ddc73d35b940",
"metadata": {},
"outputs": [],
"source": [
"# Create a messages list using the same format that we used for OpenAI\n",
"\n",
"messages = [\n",
" {\"role\": \"user\", \"content\": \"Describe some of the business applications of Generative AI\"}\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "7bb9c624-14f0-4945-a719-8ddb64f66f47",
"metadata": {},
"outputs": [],
"source": [
"payload = {\n",
" \"model\": MODEL,\n",
" \"messages\": messages,\n",
" \"stream\": False\n",
" }"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "479ff514-e8bd-4985-a572-2ea28bb4fa40",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[?25lpulling manifest ⠋ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠙ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠹ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠸ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠼ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠴ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠦ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest \n",
"pulling dde5aa3fc5ff... 100% ▕████████████████▏ 2.0 GB \n",
"pulling 966de95ca8a6... 100% ▕████████████████▏ 1.4 KB \n",
"pulling fcc5a6bec9da... 100% ▕████████████████▏ 7.7 KB \n",
"pulling a70ff7e570d9... 100% ▕████████████████▏ 6.0 KB \n",
"pulling 56bb8bd477a5... 100% ▕████████████████▏ 96 B \n",
"pulling 34bb5ab01051... 100% ▕████████████████▏ 561 B \n",
"verifying sha256 digest \n",
"writing manifest \n",
"success \u001b[?25h\n"
]
}
],
"source": [
"# Let's just make sure the model is loaded\n",
"\n",
"!ollama pull llama3.2"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "42b9f644-522d-4e05-a691-56e7658c0ea9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generative AI has numerous business applications across various industries, including:\n",
"\n",
"1. **Content Generation**: Automate content creation for social media, blogs, and websites using text-to-image models like DALL-E or Midjourney.\n",
"2. **Image Editing**: Use generative AI to edit photos, create custom illustrations, or generate realistic images for marketing materials, product designs, or advertising campaigns.\n",
"3. **Personalized Recommendations**: Develop AI-powered recommendation systems that suggest products, services, or content based on individual user behavior and preferences using generative models like Generative Adversarial Networks (GANs) or Variational Autoencoders (VAEs).\n",
"4. **Chatbots and Virtual Assistants**: Create conversational interfaces that use natural language processing (NLP) and machine learning to understand user queries, generate responses, and provide personalized support.\n",
"5. **Design and Prototyping**: Utilize generative AI to design new products, furniture, or buildings by generating 3D models, architectural designs, or product prototypes quickly and efficiently.\n",
"6. **Marketing and Advertising**: Leverage generative AI to create engaging ad copy, generate social media posts, or design eye-catching ads using text-to-image models like Deep Dream Generator.\n",
"7. **Product Development**: Use generative AI to design and optimize products for various industries, such as fashion, electronics, or automotive.\n",
"8. **Financial Modeling**: Develop generative models that predict market trends, forecast revenue, and identify opportunities for investment using techniques like GANs or VAEs.\n",
"9. **Customer Service**: Implement AI-powered chatbots and virtual assistants to provide 24/7 customer support, respond to inquiries, and resolve issues efficiently.\n",
"10. **Innovation and Research**: Utilize generative AI as a tool for idea generation, prototyping, and experimentation in various fields like science, technology, engineering, and mathematics (STEM).\n",
"11. **Translation and Localization**: Develop generative models that translate text, speech, or images from one language to another, making it easier to expand global reach.\n",
"12. **Music and Audio Generation**: Create new music compositions, generate beats, or even create entire soundtracks using AI-powered music generation tools.\n",
"\n",
"These applications demonstrate the vast potential of Generative AI in transforming various industries and revolutionizing how businesses operate, innovate, and interact with customers.\n",
"\n",
"**Key Industries Affected:**\n",
"\n",
"1. E-commerce\n",
"2. Advertising\n",
"3. Finance\n",
"4. Healthcare\n",
"5. Education\n",
"6. Entertainment\n",
"7. Media\n",
"8. Retail\n",
"\n",
"These are just a few examples of the many business applications of Generative AI. As this technology continues to evolve, we can expect even more innovative and creative use cases across various industries.\n"
]
}
],
"source": [
"# If this doesn't work for any reason, try the 2 versions in the following cells\n",
"# And double check the instructions in the 'Recap on installation of Ollama' at the top of this lab\n",
"# And if none of that works - contact me!\n",
"\n",
"response = requests.post(OLLAMA_API, json=payload, headers=HEADERS)\n",
"print(response.json()['message']['content'])"
]
},
{
"cell_type": "markdown",
"id": "6a021f13-d6a1-4b96-8e18-4eae49d876fe",
"metadata": {},
"source": [
"# Introducing the ollama package\n",
"\n",
"And now we'll do the same thing, but using the elegant ollama python package instead of a direct HTTP call.\n",
"\n",
"Under the hood, it's making the same call as above to the ollama server running at localhost:11434"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "7745b9c4-57dc-4867-9180-61fa5db55eb8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generative AI has numerous business applications across various industries. Some of the most promising uses include:\n",
"\n",
"1. **Content Creation**: Generative AI can be used to generate high-quality content such as articles, social media posts, product descriptions, and more. This can help businesses save time and resources while maintaining consistency in their content.\n",
"\n",
"2. **Product Design and Engineering**: Generative AI can aid in designing new products by creating 3D models, simulations, and prototypes. This can be particularly useful for companies looking to innovate or improve existing products.\n",
"\n",
"3. **Marketing and Advertising**: Generative AI can help generate ad copy, product descriptions, and even entire marketing campaigns. It can also assist in personalizing ads based on user behavior and preferences.\n",
"\n",
"4. **Customer Service Chatbots**: Generative AI-powered chatbots can be used to provide 24/7 customer support, answering frequently asked questions, and routing complex issues to human representatives.\n",
"\n",
"5. **Music and Audio Generation**: Generative AI can create original music tracks, sound effects, and audio loops for various applications such as film scores, video games, and advertising.\n",
"\n",
"6. **Image and Video Editing**: Generative AI-powered tools can edit images and videos with unprecedented speed and accuracy. This can help businesses streamline their visual content creation processes.\n",
"\n",
"7. **Recommendation Systems**: Generative AI can be used to create personalized product recommendations based on user behavior, preferences, and demographics.\n",
"\n",
"8. **Text Summarization and Translation**: Generative AI-powered tools can summarize long documents into concise summaries, making it easier for businesses to communicate complex information quickly.\n",
"\n",
"9. **Financial Modeling and Forecasting**: Generative AI can be used to analyze large datasets, identify patterns, and make predictions about future financial trends and market performance.\n",
"\n",
"10. **Risk Analysis and Compliance**: Generative AI-powered tools can analyze vast amounts of data to identify potential risks and compliance issues, helping businesses stay ahead of regulatory requirements.\n",
"\n",
"11. **Supply Chain Optimization**: Generative AI can help optimize supply chain operations by predicting demand, identifying bottlenecks, and suggesting efficient logistics routes.\n",
"\n",
"12. **Healthcare Data Analysis**: Generative AI-powered tools can analyze large healthcare datasets to identify trends, diagnose diseases, and develop personalized treatment plans.\n",
"\n",
"13. **Real Estate Property Valuation**: Generative AI can estimate property values based on historical data, market trends, and location information, helping real estate agents and investors make informed decisions.\n",
"\n",
"14. **Cybersecurity Threat Analysis**: Generative AI-powered tools can analyze network traffic, identify potential security threats, and predict the likelihood of successful attacks.\n",
"\n",
"15. **Education and Training Development**: Generative AI can help create personalized learning experiences by generating customized educational materials, quizzes, and assessments.\n",
"\n",
"These are just a few examples of the many business applications of Generative AI. As the technology continues to evolve, we can expect even more innovative uses in various industries.\n"
]
}
],
"source": [
"import ollama\n",
"\n",
"response = ollama.chat(model=MODEL, messages=messages)\n",
"print(response['message']['content'])"
]
},
{
"cell_type": "markdown",
"id": "a4704e10-f5fb-4c15-a935-f046c06fb13d",
"metadata": {},
"source": [
"## Alternative approach - using OpenAI python library to connect to Ollama"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "23057e00-b6fc-4678-93a9-6b31cb704bff",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generative AI has numerous business applications across various industries. Here are some examples:\n",
"\n",
"1. **Content Creation**: Generative AI can be used to create high-quality, personalized content such as articles, social media posts, and product descriptions, saving time and resources for content creation teams.\n",
"2. **Product Design and Development**: Generative AI can help design new products, logos, and packaging by generating 3D models, textures, and images based on input parameters such as color, shape, and style.\n",
"3. **Marketing Automation**: Generative AI can be used to create personalized marketing campaigns, automating email marketing, social media ads, and lead generation.\n",
"4. **Customer Service Chatbots**: Generative AI-powered chatbots can analyze customer queries, provide personalized responses, and help resolve issues faster.\n",
"5. **Virtual Assistants**: Generative AI can be integrated with virtual assistants like Siri, Alexa, or Google Assistant to provide customers with personalized information and assistance.\n",
"6. **Data Analysis and Insights**: Generative AI can help analyze large datasets, identify patterns, and generate insights for business decision-making.\n",
"7. **Predictive Maintenance**: Generative AI can be used to predict equipment failures, schedule maintenance, and optimize resource allocation in industries like manufacturing and healthcare.\n",
"8. **Financial Modeling**: Generative AI can help create complex financial models, predict market trends, and simulate different scenarios.\n",
"9. **Human Resources**: Generative AI can be used for tasks such as resume screening, interview suggestions, and employee onboarding.\n",
"10. **Creative Visualization**: Generative AI can generate 2D and 3D visualizations of products, buildings, or landscapes, helping architects, designers, and real estate developers visualize their ideas.\n",
"\n",
"Some specific business applications include:\n",
"\n",
"* **E-commerce**: Using generative AI to create product images, design packaging, and optimize listings.\n",
"* **Finance**: Using generative AI for forecasting, risk analysis, and portfolio optimization.\n",
"* **Healthcare**: Using generative AI to analyze medical data, predict patient outcomes, and develop personalized treatment plans.\n",
"* **Manufacturing**: Using generative AI to design new products, simulate production processes, and optimize supply chains.\n",
"\n",
"These are just a few examples of the many business applications of Generative AI. As the technology continues to evolve, we can expect to see even more innovative uses across various industries.\n"
]
}
],
"source": [
"# There's actually an alternative approach that some people might prefer\n",
"# You can use the OpenAI client python library to call Ollama:\n",
"\n",
"from openai import OpenAI\n",
"ollama_via_openai = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama')\n",
"\n",
"response = ollama_via_openai.chat.completions.create(\n",
" model=MODEL,\n",
" messages=messages\n",
")\n",
"\n",
"print(response.choices[0].message.content)"
]
},
{
"cell_type": "markdown",
"id": "9f9e22da-b891-41f6-9ac9-bd0c0a5f4f44",
"metadata": {},
"source": [
"## Are you confused about why that works?\n",
"\n",
"It seems strange, right? We just used OpenAI code to call Ollama?? What's going on?!\n",
"\n",
"Here's the scoop:\n",
"\n",
"The python class `OpenAI` is simply code written by OpenAI engineers that makes calls over the internet to an endpoint. \n",
"\n",
"When you call `openai.chat.completions.create()`, this python code just makes a web request to the following url: \"https://api.openai.com/v1/chat/completions\"\n",
"\n",
"Code like this is known as a \"client library\" - it's just wrapper code that runs on your machine to make web requests. The actual power of GPT is running on OpenAI's cloud behind this API, not on your computer!\n",
"\n",
"OpenAI was so popular, that lots of other AI providers provided identical web endpoints, so you could use the same approach.\n",
"\n",
"So Ollama has an endpoint running on your local box at http://localhost:11434/v1/chat/completions \n",
"And in week 2 we'll discover that lots of other providers do this too, including Gemini and DeepSeek.\n",
"\n",
"And then the team at OpenAI had a great idea: they can extend their client library so you can specify a different 'base url', and use their library to call any compatible API.\n",
"\n",
"That's it!\n",
"\n",
"So when you say: `ollama_via_openai = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama')` \n",
"Then this will make the same endpoint calls, but to Ollama instead of OpenAI."
]
},
{
"cell_type": "markdown",
"id": "bc7d1de3-e2ac-46ff-a302-3b4ba38c4c90",
"metadata": {},
"source": [
"## Also trying the amazing reasoning model DeepSeek\n",
"\n",
"Here we use the version of DeepSeek-reasoner that's been distilled to 1.5B. \n",
"This is actually a 1.5B variant of Qwen that has been fine-tuned using synethic data generated by Deepseek R1.\n",
"\n",
"Other sizes of DeepSeek are [here](https://ollama.com/library/deepseek-r1) all the way up to the full 671B parameter version, which would use up 404GB of your drive and is far too large for most!"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "cf9eb44e-fe5b-47aa-b719-0bb63669ab3d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[?25lpulling manifest ⠋ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠙ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠹ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠸ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠼ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠴ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠧ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest ⠧ \u001b[?25h\u001b[?25l\u001b[2K\u001b[1Gpulling manifest \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 0 B/1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 0 B/1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 0 B/1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 3.5 MB/1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 15 MB/1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 21 MB/1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 33 MB/1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 45 MB/1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 50 MB/1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 57 MB/1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 75 MB/1.1 GB 69 MB/s 15s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 81 MB/1.1 GB 69 MB/s 14s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 93 MB/1.1 GB 69 MB/s 14s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 105 MB/1.1 GB 69 MB/s 14s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 109 MB/1.1 GB 69 MB/s 14s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 114 MB/1.1 GB 69 MB/s 14s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 134 MB/1.1 GB 69 MB/s 14s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 135 MB/1.1 GB 69 MB/s 14s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 141 MB/1.1 GB 69 MB/s 14s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 156 MB/1.1 GB 69 MB/s 13s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 168 MB/1.1 GB 84 MB/s 11s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 179 MB/1.1 GB 84 MB/s 11s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 182 MB/1.1 GB 84 MB/s 11s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 194 MB/1.1 GB 84 MB/s 10s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 205 MB/1.1 GB 84 MB/s 10s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 208 MB/1.1 GB 84 MB/s 10s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 221 MB/1.1 GB 84 MB/s 10s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 231 MB/1.1 GB 84 MB/s 10s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 242 MB/1.1 GB 84 MB/s 10s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 248 MB/1.1 GB 84 MB/s 10s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 259 MB/1.1 GB 86 MB/s 9s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 266 MB/1.1 GB 86 MB/s 9s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 270 MB/1.1 GB 86 MB/s 9s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 278 MB/1.1 GB 86 MB/s 9s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 292 MB/1.1 GB 86 MB/s 9s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 297 MB/1.1 GB 86 MB/s 9s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 309 MB/1.1 GB 86 MB/s 9s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 320 MB/1.1 GB 86 MB/s 9s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 325 MB/1.1 GB 86 MB/s 9s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 335 MB/1.1 GB 86 MB/s 9s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 346 MB/1.1 GB 86 MB/s 8s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 351 MB/1.1 GB 86 MB/s 8s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 364 MB/1.1 GB 86 MB/s 8s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 374 MB/1.1 GB 86 MB/s 8s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 379 MB/1.1 GB 86 MB/s 8s\u001b[?25h\n",
"pulling aabd4debf0c8... 35% ▕█████ ▏ 387 MB/1.1 GB 86 MB/s 8s\u001b[?25h\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 395 MB/1.1 GB 86 MB/s 8s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 400 MB/1.1 GB 86 MB/s 8s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 410 MB/1.1 GB 86 MB/s 8s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 421 MB/1.1 GB 86 MB/s 8s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 425 MB/1.1 GB 86 MB/s 7s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 435 MB/1.1 GB 86 MB/s 7s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 445 MB/1.1 GB 86 MB/s 7s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 451 MB/1.1 GB 86 MB/s 7s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 459 MB/1.1 GB 86 MB/s 7s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 470 MB/1.1 GB 86 MB/s 7s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 475 MB/1.1 GB 86 MB/s 7s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 485 MB/1.1 GB 86 MB/s 7s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 496 MB/1.1 GB 86 MB/s 7s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 502 MB/1.1 GB 86 MB/s 7s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 511 MB/1.1 GB 86 MB/s 7s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 522 MB/1.1 GB 86 MB/s 6s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 527 MB/1.1 GB 86 MB/s 6s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 536 MB/1.1 GB 86 MB/s 6s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 545 MB/1.1 GB 86 MB/s 6s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 551 MB/1.1 GB 86 MB/s 6s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 558 MB/1.1 GB 86 MB/s 6s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 567 MB/1.1 GB 86 MB/s 6s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 573 MB/1.1 GB 86 MB/s 6s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 584 MB/1.1 GB 86 MB/s 6s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 595 MB/1.1 GB 86 MB/s 6s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 601 MB/1.1 GB 85 MB/s 6s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 613 MB/1.1 GB 85 MB/s 5s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 623 MB/1.1 GB 85 MB/s 5s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 629 MB/1.1 GB 85 MB/s 5s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 638 MB/1.1 GB 85 MB/s 5s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 648 MB/1.1 GB 85 MB/s 5s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 653 MB/1.1 GB 85 MB/s 5s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 662 MB/1.1 GB 85 MB/s 5s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 670 MB/1.1 GB 85 MB/s 5s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 677 MB/1.1 GB 85 MB/s 5s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 689 MB/1.1 GB 86 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 698 MB/1.1 GB 86 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 703 MB/1.1 GB 86 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 713 MB/1.1 GB 86 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 722 MB/1.1 GB 86 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 727 MB/1.1 GB 86 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 734 MB/1.1 GB 86 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 741 MB/1.1 GB 86 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 744 MB/1.1 GB 86 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 751 MB/1.1 GB 86 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 759 MB/1.1 GB 84 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 763 MB/1.1 GB 84 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 771 MB/1.1 GB 84 MB/s 4s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 782 MB/1.1 GB 84 MB/s 3s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 786 MB/1.1 GB 84 MB/s 3s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 796 MB/1.1 GB 84 MB/s 3s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 807 MB/1.1 GB 84 MB/s 3s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 812 MB/1.1 GB 84 MB/s 3s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 822 MB/1.1 GB 84 MB/s 3s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 834 MB/1.1 GB 84 MB/s 3s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 840 MB/1.1 GB 84 MB/s 3s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 851 MB/1.1 GB 86 MB/s 3s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 863 MB/1.1 GB 86 MB/s 2s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 869 MB/1.1 GB 86 MB/s 2s\u001b[?25h\n",
"pulling aabd4debf0c8... 79% ▕████████████ ▏ 881 MB/1.1 GB 86 MB/s 2s\u001b[?25h\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 891 MB/1.1 GB 86 MB/s 2s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 896 MB/1.1 GB 86 MB/s 2s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ▏ 905 MB/1.1 GB 86 MB/s 2s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest █ ▏ 914 MB/1.1 GB 86 MB/s 2s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest █ ▏ 919 MB/1.1 GB 86 MB/s 2s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest █ ▏ 927 MB/1.1 GB 86 MB/s 2s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest █ ▏ 936 MB/1.1 GB 84 MB/s 2s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest █ ▏ 941 MB/1.1 GB 84 MB/s 2s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest █ ▏ 949 MB/1.1 GB 84 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest █ ▏ 955 MB/1.1 GB 84 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest █ ▏ 960 MB/1.1 GB 84 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest █ ▏ 969 MB/1.1 GB 84 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ██ ▏ 978 MB/1.1 GB 84 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ██ ▏ 982 MB/1.1 GB 84 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ██ ▏ 989 MB/1.1 GB 84 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ██ ▏ 997 MB/1.1 GB 84 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ██ ▏ 1.0 GB/1.1 GB 82 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ██ ▏ 1.0 GB/1.1 GB 82 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ██ ▏ 1.0 GB/1.1 GB 82 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ██ ▏ 1.0 GB/1.1 GB 82 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ██ ▏ 1.0 GB/1.1 GB 82 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ██ ▏ 1.0 GB/1.1 GB 82 MB/s 1s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ██ ▏ 1.0 GB/1.1 GB 82 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.0 GB/1.1 GB 82 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 82 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 82 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 80 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 80 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 80 MB/s 0s\u001b[?25h\n",
"pulling aabd4debf0c8... 97% ▕███████████████ ▏ 1.1 GB/1.1 GB 80 MB/s 0s\u001b[?25h\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 80 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 80 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 80 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 80 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 80 MB/s 0s\u001b[?25h\n",
"pulling aabd4debf0c8... 98% ▕███████████████ ▏ 1.1 GB/1.1 GB 80 MB/s 0s\u001b[?25h\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 74 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 74 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 74 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 74 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 74 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 74 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ███ ▏ 1.1 GB/1.1 GB 74 MB/s 0s\u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ████▏ 1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ████▏ 1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ████▏ 1.1 GB \u001b[?25h\n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest ████▏ 1.1 GB \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B/ 387 B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B/ 387 B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest B \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \u001b[?25h\n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"pulling a85fe2a2e58e... 100% ▕████████████████▏ 487 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"pulling a85fe2a2e58e... 100% ▕████████████████▏ 487 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"pulling a85fe2a2e58e... 100% ▕████████████████▏ 487 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"pulling a85fe2a2e58e... 100% ▕████████████████▏ 487 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"pulling a85fe2a2e58e... 100% ▕████████████████▏ 487 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"pulling a85fe2a2e58e... 100% ▕████████████████▏ 487 B \n",
"\u001b[?25l\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1G\u001b[A\u001b[2K\u001b[1Gpulling manifest \n",
"pulling aabd4debf0c8... 100% ▕████████████████▏ 1.1 GB \n",
"pulling 369ca498f347... 100% ▕████████████████▏ 387 B \n",
"pulling 6e4c38e1172f... 100% ▕████████████████▏ 1.1 KB \n",
"pulling f4d24e9138dd... 100% ▕████████████████▏ 148 B \n",
"pulling a85fe2a2e58e... 100% ▕████████████████▏ 487 B \n",
"verifying sha256 digest \n",
"writing manifest \n",
"success \u001b[?25h\n"
]
}
],
"source": [
"!ollama pull deepseek-r1:1.5b"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "1d3d554b-e00d-4c08-9300-45e073950a76",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<think>\n",
"Okay, so I need to figure out the definitions of some key concepts behind large language models (LLMs), focusing on neural networks, attention, and transformers. Hmm, where should I start? Well, first off, I remember that LLMs are these AI models designed to understand and generate human languages, like speech or texts. They probably need strong processing capabilities to handle this.\n",
"\n",
"Starting with neural networks. From what I recall, neural networks are a type of machine learning model inspired by the structure of the human brain's nervous system. So they consist of layers of nodes called neurons that process information through connections representing weighted edges between them. But wait, how does a typical LLM use these? They probably process inputs layer by layer, transforming and combining features iteratively. I think each layer might correspond to different levels of understanding or processing in the language.\n",
"\n",
"Moving on to attention, which seems important for LLMs since they're such good at capturing context. I remember hearing about self-attention being a key mechanism here. Unlike traditional neural networks that treat all input tokens as linearly ordered without relationships, self-attention allows models to consider all possible pairs of words, not just their sequential order. This means the model can attend to different parts of its output when making predictions at each step. It's like considering distant dependencies beyond just next words.\n",
"\n",
"Now transformers—this part might be more complex or specific. The term \"transformers\" was used by纸片 authors like Vaswani in 2017 with a paper called \"Attention is All You Need.\" They introduced something called the \"transformer architecture,\" which consists of multiple attention layers. Unlike recurrent neural networks (RNNs), which have memory cells, transformers don't need them because each encoding layer processes all token pairs using self-attention. This makes processing in parallel, similar to how convolutional networks work on image data.\n",
"\n",
"I'm a bit fuzzy on the term \"permutation\" mentioned earlier when talking about token order. Oh right, without attention, tokens would just be reordered by permutation. But with attention, models can attend to different input positions globally and focus on specific parts based on context. This helps build more refined representations that capture semantically relevant information.\n",
"\n",
"Putting it all together: LLMs are neural networks using self-attention mechanisms to handle the order of inputs, which is then processed through multiple transformer layers that allow parallel attention across all tokens. So each layer in a transformer processes the output, gradually building up a deep and contextual representation that captures both local dependencies from earlier layers and global context from higher-order attention.\n",
"\n",
"Wait, I'm trying to remember if there are any other concepts or maybe some mistakes I might have made. For example, is there more than one self-attention layer? Or does each transformer layer handle multiple aspects through different weights? Also, how exactly do these attention weights work? Do they score alignments between tokens and adjust the output based on those scores?\n",
"\n",
"I think I've covered the main points by considering the structure of transformers as composed of self-attention layers, which process all pairs of tokens while paying attention to their position in input. This allows models to create more sophisticated representations than simpler architectures like RNNs or static word embeddings.\n",
"\n",
"Hmm, maybe a summary would help: LLMs are neural networks that use attention mechanisms to handle sequence data by considering all possible relationships between inputs, through layers of self-attention and permutation-free processing. Transformers provide an efficient way to implement these with their layer-wise attention mechanism and parallel processing capabilities compared to recurrent approaches.\n",
"</think>\n",
"\n",
"Large Language Models (LLMs) are advanced AI systems designed to understand and generate human languages. They rely on several key concepts from neural networks, attention mechanisms, and transformer architectures to achieve this capability.\n",
"\n",
"1. **Neural Networks**: Neural networks are inspired by biological neural systems, composed of interconnected nodes called neurons. These nodes process information through layers of connections that represent weighted edges between them. In the context of LLMs, each layer processes input data iteratively, transforming features, and combining them to generate outputs.\n",
"\n",
"2. **Attention Mechanisms**: Attention is a core mechanism in LLMs, enabling models to consider all pairs of tokens rather than just their sequential order. This is achieved through self-attention, which allows the model to attend to different parts of its output when making predictions at each step. Unlike traditional neural networks, attention enables the model to capture complex contextual dependencies.\n",
"\n",
"3. **Transformer Architecture**: The term \"transformer\" was introduced by Vaswani et al. in 2017 with a paper titled \"Attention is All You Need.\" Transformers consist of multiple self-attention layers where each layer processes all token pairs using self-attention. This architecture eliminates the need for sequential memory, allowing each processing step to be done in parallel. The absence of sequence dependencies improves feature representation and allows models to build refined representations that capture semantically relevant information.\n",
"\n",
"In summary, LLMs utilize neural networks with self-attention mechanisms to process input sequences and transformer architectures, which provide a permutation-free approach by considering all possible token pairs through multiple layers. These components enable the creation of sophisticated representations that enhance both local and global dependencies in language processing.\n"
]
}
],
"source": [
"# This may take a few minutes to run! You should then see a fascinating \"thinking\" trace inside <think> tags, followed by some decent definitions\n",
"\n",
"response = ollama_via_openai.chat.completions.create(\n",
" model=\"deepseek-r1:1.5b\",\n",
" messages=[{\"role\": \"user\", \"content\": \"Please give definitions of some core concepts behind LLMs: a neural network, attention and the transformer\"}]\n",
")\n",
"\n",
"print(response.choices[0].message.content)"
]
},
{
"cell_type": "markdown",
"id": "1622d9bb-5c68-4d4e-9ca4-b492c751f898",
"metadata": {},
"source": [
"# NOW the exercise for you\n",
"\n",
"Take the code from day1 and incorporate it here, to build a website summarizer that uses Llama 3.2 running locally instead of OpenAI; use either of the above approaches."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "6de38216-6d1c-48c4-877b-86d403f4e0f8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"API key found and looks good so far!\n"
]
}
],
"source": [
"import os\n",
"from dotenv import load_dotenv\n",
"from openai import OpenAI\n",
"\n",
"load_dotenv(override=True)\n",
"api_key = os.getenv('OPENAI_API_KEY')\n",
"\n",
"# Check the key\n",
"\n",
"if not api_key:\n",
" print(\"No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!\")\n",
"elif not api_key.startswith(\"sk-proj-\"):\n",
" print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook\")\n",
"elif api_key.strip() != api_key:\n",
" print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them - see troubleshooting notebook\")\n",
"else:\n",
" print(\"API key found and looks good so far!\")\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "8f54551d-9a98-4824-9604-cac56b315ae3",
"metadata": {},
"outputs": [],
"source": [
"headers = {\n",
" \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n",
"}\n",
"\n",
"class Website:\n",
"\n",
" def __init__(self, url):\n",
" \"\"\"\n",
" Create this Website object from the given url using the BeautifulSoup library\n",
" \"\"\"\n",
" self.url = url\n",
" response = requests.get(url, headers=headers)\n",
" soup = BeautifulSoup(response.content, 'html.parser')\n",
" self.title = soup.title.string if soup.title else \"No title found\"\n",
" for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n",
" irrelevant.decompose()\n",
" self.text = soup.body.get_text(separator=\"\\n\", strip=True)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "d4462afa-9ea5-4df2-a757-f715c8302b77",
"metadata": {},
"outputs": [],
"source": [
"system_prompt = \"You are an assistant that analyzes the contents of a website \\\n",
"and provides a short summary, ignoring text that might be navigation related. \\\n",
"Respond in markdown.\"\n",
"\n",
"def user_prompt_for(website):\n",
" user_prompt = f\"You are looking at a website titled {website.title}\"\n",
" user_prompt += \"\\nThe contents of this website is as follows; \\\n",
"please provide a short summary of this website in markdown. \\\n",
"If it includes news or announcements, then summarize these too.\\n\\n\"\n",
" user_prompt += website.text\n",
" return user_prompt"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "e63cd0b5-8508-48c5-8e91-2a9ac85f9b83",
"metadata": {},
"outputs": [],
"source": [
"def messages_for(website):\n",
" return [\n",
" {\"role\": \"system\", \"content\": system_prompt},\n",
" {\"role\": \"user\", \"content\": user_prompt_for(website)}\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "e4993304-1a6b-43b5-919a-96b56cae7ad7",
"metadata": {},
"outputs": [],
"source": [
"def summarize(url):\n",
" website = Website(url)\n",
" #response = openai.chat.completions.create(\n",
" # model = \"gpt-4o-mini\",\n",
" # messages = messages_for(website)\n",
" #)\n",
" #return response.choices[0].message.content\n",
" messages = messages_for(website)\n",
" return ollama.chat(model=MODEL, messages=messages)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "4d91f204-d6e4-4601-95a3-71eae021212a",
"metadata": {},
"outputs": [],
"source": [
"def display_summary(url):\n",
" summary = summarize(url)\n",
" print(f\"SUMMARY <${summary}>\")\n",
" #display(Markdown(summary))"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "362ba391-8103-43b3-9a16-a171aebe028a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SUMMARY <$model='llama3.2' created_at='2025-03-04T00:12:00.263857Z' done=True done_reason='stop' total_duration=2697124208 load_duration=40565500 prompt_eval_count=311 prompt_eval_duration=165000000 eval_count=202 eval_duration=2488000000 message=Message(role='assistant', content='### Website Summary\\n\\n#### Overview\\nSpotlight Monitor is a company that provides solutions for improving Salesforce security. Their website offers various tools and services to help businesses reduce risk and identify bad actors in their Salesforce ecosystem.\\n\\n#### Key Features\\n\\n* **SpotMon**: A solution to assess your Salesforce risk, ensure compliance, and mitigate risk.\\n* **Salesforce Security Assessment**: A way to monitor user behavior to identify suspicious activity.\\n* **Shield Quickstarts**: Pre-built solutions to speed up Salesforce Shield implementation.\\n\\n#### News/Announcements\\nThe website mentions that:\\n* 65% of data breaches involve internal actors.\\n* Salesforce stores sensitive mission-critical data, making it a prime target for security threats.\\n* Most Salesforce customers have a limited understanding of what their users actually do, leaving them vulnerable to security risks.\\n* The company offers a recent webinar clip available on their website.\\n\\n#### Contact Information\\nSpotlight Monitor provides contact information, including a link to talk with an expert about improving your Salesforce security posture.', images=None, tool_calls=None)>\n"
]
}
],
"source": [
"display_summary(\"https://spotlightmonitor.com\")"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "df9335a1-b17f-4738-8c55-cd7fcf14641a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ChatResponse(model='llama3.2', created_at='2025-03-04T00:10:25.224805Z', done=True, done_reason='stop', total_duration=1946978625, load_duration=36116708, prompt_eval_count=311, prompt_eval_duration=166000000, eval_count=142, eval_duration=1741000000, message=Message(role='assistant', content='### Website Summary\\n\\n**Overview**\\nSpotlight Monitor is a cybersecurity firm specializing in Salesforce security solutions. The website provides various services to help businesses reduce risk and identify bad actors within their Salesforce ecosystems.\\n\\n**Key Features**\\n\\n* **SpotMon**: A solution to assess Salesforce risk and ensure compliance.\\n* **Shield Quickstarts**: Accelerate Salesforce Shield implementation for faster security.\\n* **Salesforce Security Assessment**: Monitor user behavior to detect suspicious activity.\\n\\n### News/Announcements\\n\\n* **Data Breach Statistics**: 65% of data breaches involve internal actors, highlighting the importance of effective security measures.\\n* **Webinar Clips**: The website mentions recent webinar clips available for more insights into Salesforce security best practices.', images=None, tool_calls=None))"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"summarize(\"https://spotlightmonitor.com\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e5c515fe-992b-4e50-b8da-9c5406bbc18c",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}