Azure Machine Learning - Azure OpenAI GPT 3.5 Turbo 微调教程

本教程将引导你在Azure平台完成对 gpt-35-turbo-0613 模型的微调。

关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人

file

教程介绍

本教程介绍如何执行下列操作:

  • 创建示例微调数据集。
  • 为资源终结点和 API 密钥创建环境变量。
  • 准备样本训练和验证数据集以进行微调。
  • 上传训练文件和验证文件进行微调。
  • gpt-35-turbo-0613 创建微调作业。
  • 部署自定义微调模型。

环境准备

  • Azure 订阅 - 免费创建订阅。

  • 已在所需的 Azure 订阅中授予对 Azure OpenAI 的访问权限 目前,仅应用程序授予对此服务的访问权限。 可以通过在 https://aka.ms/oai/access 上填写表单来申请对 Azure OpenAI 的访问权限。

  • Python 3.7.1 或更高版本

  • 以下 Python 库:jsonrequestsostiktokentimeopenai

  • OpenAI Python 库应至少为版本 1.0

  • Jupyter Notebook

  • [可进行 gpt-35-turbo-0613 微调的区域]中的 Azure OpenAI 资源。

  • 微调访问需要认知服务 OpenAI 参与者

设置

Python 库

  • OpenAI Python 1.x
pip install openai json requests os tiktoken time

检索密钥和终结点

若要成功对 Azure OpenAI 发出调用,需要一个终结点和一个密钥。

变量名称
ENDPOINT从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到此值。 或者,可以在“Azure OpenAI Studio”>“操场”>“代码视图”中找到该值。 示例终结点为:https://docs-test-001.openai.azure.com/
API-KEY从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到此值。 可以使用 KEY1KEY2

在 Azure 门户中转到你的资源。 可以在“资源管理”部分找到“终结点和密钥”。 复制终结点和访问密钥,因为在对 API 调用进行身份验证时需要这两项。 可以使用 KEY1KEY2。 始终准备好两个密钥可以安全地轮换和重新生成密钥,而不会导致服务中断。
file

环境变量

  • 命令行
setx AZURE_OPENAI_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE" 
setx AZURE_OPENAI_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE" 
  • PowerShell
[System.Environment]::SetEnvironmentVariable('AZURE_OPENAI_API_KEY', 'REPLACE_WITH_YOUR_KEY_VALUE_HERE', 'User')
[System.Environment]::SetEnvironmentVariable('AZURE_OPENAI_ENDPOINT', 'REPLACE_WITH_YOUR_ENDPOINT_HERE', 'User')
  • Bash
echo export AZURE_OPENAI_API_KEY="REPLACE_WITH_YOUR_KEY_VALUE_HERE" >> /etc/environment
echo export AZURE_OPENAI_ENDPOINT="REPLACE_WITH_YOUR_ENDPOINT_HERE" >> /etc/environmentsource /etc/environment

创建示例数据集

微调 gpt-35-turbo-0613 需要特殊格式的 JSONL 训练文件。 OpenAI 在其文档中提供了以下示例:

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}

对于本示例,我们将稍作修改,将其更改为:

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}

尽管这三个示例有助于提供常规格式,但如果你想引导自定义微调模型以类似的方式进行响应,则需要更多示例。 一般来说,你需要至少 50 个高质量示例来开始。然而,你完全有可能有一个用例,它可能需要 1,000 个高质量的训练示例才能成功。

通常,将数据集大小加倍会促使模型质量呈线性增长。 但请记住,低质量的示例可能会对性能产生负面影响。 如果你根据大量内部数据来训练模型,而不是先修剪数据集以便获得最高质量的示例,则最终可能会得到一个性能比预期差得多的模型。

需要创建两个文件:training_set.jsonlvalidation_set.jsonl

在运行 Jupyter Notebook 的同一目录中创建文件,并将以下代码块的内容复制到相应的文件中:

training_set.jsonl

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you may have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

validation_set.jsonl

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of Australia?"}, {"role": "assistant", "content": "It's Canberra, not Sydney. Shocking, I know!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Great Gatsby'?"}, {"role": "assistant", "content": "Some guy named F. Scott Fitzgerald. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the deepest part of the ocean?"}, {"role": "assistant", "content": "Mariana Trench, makes your swimming pool seem a bit shallow, doesn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who composed the 'Moonlight Sonata'?"}, {"role": "assistant", "content": "Just a little-known guy named Beethoven. No big deal."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What are the colors of the rainbow?"}, {"role": "assistant", "content": "ROYGBIV. Red, orange, yellow, green, blue, indigo, violet. Not that we learned this in preschool or anything!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the smallest planet?"}, {"role": "assistant", "content": "Meet Mercury, the runt of the solar system family."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Pride and Prejudice'?"}, {"role": "assistant", "content": "Do the words Jane Austen ring a bell? No? Well, she wrote it."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the largest desert?"}, {"role": "assistant", "content": "Antarctica. Surprise, surprise! Deserts aren't just full of sand, you know."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the longest river?"}, {"role": "assistant", "content": "The Nile River. It's not like it's famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of Germany?"}, {"role": "assistant", "content": "Berlin. Shocking news, right?"}]}

现在,你需要对训练和验证文件运行一些初步检查。

import json# Load the training set
with open('training_set.jsonl', 'r', encoding='utf-8') as f:training_dataset = [json.loads(line) for line in f]# Training dataset stats
print("Number of examples in training set:", len(training_dataset))
print("First example in training set:")
for message in training_dataset[0]["messages"]:print(message)# Load the validation set
with open('validation_set.jsonl', 'r', encoding='utf-8') as f:validation_dataset = [json.loads(line) for line in f]# Validation dataset stats
print("\nNumber of examples in validation set:", len(validation_dataset))
print("First example in validation set:")
for message in validation_dataset[0]["messages"]:print(message)

输出:

Number of examples in training set: 10
First example in training set:
{'role': 'system', 'content': 'Clippy is a factual chatbot that is also sarcastic.'}
{'role': 'user', 'content': 'Who discovered America?'}
{'role': 'assistant', 'content': "Some chap named Christopher Columbus, as if they don't teach that in every school!"}Number of examples in validation set: 10
First example in validation set:
{'role': 'system', 'content': 'Clippy is a factual chatbot that is also sarcastic.'}
{'role': 'user', 'content': "What's the capital of Australia?"}
{'role': 'assistant', 'content': "It's Canberra, not Sydney. Shocking, I know!"}

在本例中,我们只有 10 个训练示例和 10 个验证示例,因此虽然这将演示微调模型的基本机制,但示例数量不太可能足以产生持续明显的影响。

现在,可以使用 tiktoken 库从 OpenAI 运行一些额外的代码来验证令牌计数。 各个示例需要保持在 gpt-35-turbo-0613 模型的 4096 个令牌的输入令牌限制内。

import json
import tiktoken
import numpy as np
from collections import defaultdictencoding = tiktoken.get_encoding("cl100k_base") # default encoding used by gpt-4, turbo, and text-embedding-ada-002 modelsdef num_tokens_from_messages(messages, tokens_per_message=3, tokens_per_name=1):num_tokens = 0for message in messages:num_tokens += tokens_per_messagefor key, value in message.items():num_tokens += len(encoding.encode(value))if key == "name":num_tokens += tokens_per_namenum_tokens += 3return num_tokensdef num_assistant_tokens_from_messages(messages):num_tokens = 0for message in messages:if message["role"] == "assistant":num_tokens += len(encoding.encode(message["content"]))return num_tokensdef print_distribution(values, name):print(f"\n#### Distribution of {name}:")print(f"min / max: {min(values)}, {max(values)}")print(f"mean / median: {np.mean(values)}, {np.median(values)}")print(f"p5 / p95: {np.quantile(values, 0.1)}, {np.quantile(values, 0.9)}")files = ['training_set.jsonl', 'validation_set.jsonl']for file in files:print(f"Processing file: {file}")with open(file, 'r', encoding='utf-8') as f:dataset = [json.loads(line) for line in f]total_tokens = []assistant_tokens = []for ex in dataset:messages = ex.get("messages", {})total_tokens.append(num_tokens_from_messages(messages))assistant_tokens.append(num_assistant_tokens_from_messages(messages))print_distribution(total_tokens, "total tokens")print_distribution(assistant_tokens, "assistant tokens")print('*' * 50)

输出:

Processing file: training_set.jsonl#### Distribution of total tokens:
min / max: 47, 57
mean / median: 50.8, 50.0
p5 / p95: 47.9, 55.2#### Distribution of assistant tokens:
min / max: 13, 21
mean / median: 16.3, 15.5
p5 / p95: 13.0, 20.1
**************************************************
Processing file: validation_set.jsonl#### Distribution of total tokens:
min / max: 43, 65
mean / median: 51.4, 49.0
p5 / p95: 45.7, 56.9#### Distribution of assistant tokens:
min / max: 8, 29
mean / median: 15.9, 13.5
p5 / p95: 11.6, 20.9
**************************************************

上传微调文件

  • OpenAI Python 1.x
# Upload fine-tuning filesimport os
from openai import AzureOpenAIclient = AzureOpenAI(azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), api_key=os.getenv("AZURE_OPENAI_KEY"),  api_version="2023-12-01-preview"  # This API version or later is required to access fine-tuning for turbo/babbage-002/davinci-002
)training_file_name = 'training_set.jsonl'
validation_file_name = 'validation_set.jsonl'# Upload the training and validation dataset files to Azure OpenAI with the SDK.training_response = client.files.create(file=open(training_file_name, "rb"), purpose="fine-tune"
)
training_file_id = training_response.idvalidation_response = client.files.create(file=open(validation_file_name, "rb"), purpose="fine-tune"
)
validation_file_id = validation_response.idprint("Training file ID:", training_file_id)
print("Validation file ID:", validation_file_id)

输出:

Training file ID: file-9ace76cb11f54fdd8358af27abf4a3ea
Validation file ID: file-70a3f525ed774e78a77994d7a1698c4b

开始微调

现在微调文件已成功上传,可以提交微调训练作业:

  • OpenAI Python 1.x
response = client.fine_tuning.jobs.create(training_file=training_file_id,validation_file=validation_file_id,model="gpt-35-turbo-0613", # Enter base model name. Note that in Azure OpenAI the model name contains dashes and cannot contain dot/period characters. 
)job_id = response.id# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.print("Job ID:", response.id)
print("Status:", response.id)
print(response.model_dump_json(indent=2))

输出:

Job ID: ftjob-40e78bc022034229a6e3a222c927651c
Status: pending
{"hyperparameters": {"n_epochs": 2},"status": "pending","model": "gpt-35-turbo-0613","training_file": "file-90ac5d43102f4d42a3477fd30053c758","validation_file": "file-e21aad7dddbc4ddc98ba35c790a016e5","id": "ftjob-40e78bc022034229a6e3a222c927651c","created_at": 1697156464,"updated_at": 1697156464,"object": "fine_tuning.job"
}

跟踪训练作业状态

如果想轮询训练作业状态,直至其完成,可以运行:

  • OpenAI Python 1.x
# Track training statusfrom IPython.display import clear_output
import timestart_time = time.time()# Get the status of our fine-tuning job.
response = client.fine_tuning.jobs.retrieve(job_id)status = response.status# If the job isn't done yet, poll it every 10 seconds.
while status not in ["succeeded", "failed"]:time.sleep(10)response = client.fine_tuning.jobs.retrieve(job_id)print(response.model_dump_json(indent=2))print("Elapsed time: {} minutes {} seconds".format(int((time.time() - start_time) // 60), int((time.time() - start_time) % 60)))status = response.statusprint(f'Status: {status}')clear_output(wait=True)print(f'Fine-tuning job {job_id} finished with status: {status}')# List all fine-tuning jobs for this resource.
print('Checking other fine-tune jobs for this resource.')
response = client.fine_tuning.jobs.list()
print(f'Found {len(response.data)} fine-tune jobs.')

输出:

{"hyperparameters": {"n_epochs": 2},"status": "running","model": "gpt-35-turbo-0613","training_file": "file-9ace76cb11f54fdd8358af27abf4a3ea","validation_file": "file-70a3f525ed774e78a77994d7a1698c4b","id": "ftjob-0f4191f0c59a4256b7a797a3d9eed219","created_at": 1695307968,"updated_at": 1695310376,"object": "fine_tuning.job"
}
Elapsed time: 40 minutes 45 seconds
Status: running

需要一个多小时才能完成训练的情况并不罕见。 训练完成后,输出消息将更改为:

Fine-tuning job ftjob-b044a9d3cf9c4228b5d393567f693b83 finished with status: succeeded
Checking other fine-tuning jobs for this resource.
Found 2 fine-tune jobs.

若要获取完整结果,请运行以下命令:

  • OpenAI Python 1.x
#Retrieve fine_tuned_model nameresponse = client.fine_tuning.jobs.retrieve(job_id)print(response.model_dump_json(indent=2))
fine_tuned_model = response.fine_tuned_model

部署微调的模型

与本教程中前面的 Python SDK 命令不同,引入配额功能后,模型部署必须使用 [REST API]完成,这需要单独的授权、不同的 API 路径和不同的 API 版本。

或者,可以使用任何其他常见部署方法(例如 Azure OpenAI Studio 或 [Azure CLI])来部署微调模型。

variable定义
token可通过多种方式生成授权令牌。 初始测试的最简单方法是从 Azure 门户启动 Cloud Shell。 然后运行 az account get-access-token。 可以将此令牌用作 API 测试的临时授权令牌。 建议将其存储在新的环境变量中
订阅关联的 Azure OpenAI 资源的订阅 ID
resource_groupAzure OpenAI 资源的资源组名称
resource_nameAzure OpenAI 资源名称
model_deployment_name新微调模型部署的自定义名称。 这是在进行聊天补全调用时将在代码中引用的名称。
fine_tuned_model请从上一步的微调作业结果中检索此值。 该字符串类似于 gpt-35-turbo-0613.ft-b044a9d3cf9c4228b5d393567f693b83。 需要将该值添加到 deploy_data json。
import json
import requeststoken= os.getenv("TEMP_AUTH_TOKEN") 
subscription = "<YOUR_SUBSCRIPTION_ID>"  
resource_group = "<YOUR_RESOURCE_GROUP_NAME>"
resource_name = "<YOUR_AZURE_OPENAI_RESOURCE_NAME>"
model_deployment_name ="YOUR_CUSTOM_MODEL_DEPLOYMENT_NAME"deploy_params = {'api-version': "2023-05-01"} 
deploy_headers = {'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json'}deploy_data = {"sku": {"name": "standard", "capacity": 1}, "properties": {"model": {"format": "OpenAI","name": "<YOUR_FINE_TUNED_MODEL>", #retrieve this value from the previous call, it will look like gpt-35-turbo-0613.ft-b044a9d3cf9c4228b5d393567f693b83"version": "1"}}
}
deploy_data = json.dumps(deploy_data)request_url = f'https://management.azure.com/subscriptions/{subscription}/resourceGroups/{resource_group}/providers/Microsoft.CognitiveServices/accounts/{resource_name}/deployments/{model_deployment_name}'print('Creating a new deployment...')r = requests.put(request_url, params=deploy_params, headers=deploy_headers, data=deploy_data)print(r)
print(r.reason)
print(r.json())

可以在 Azure OpenAI Studio 中检查部署进度:
file
在处理部署微调模型时,此过程需要一些时间才能完成的情况并不罕见。

使用已部署的自定义模型

部署微调后的模型后,可以使用该模型,就像使用 Azure OpenAI Studio 的聊天平台中的任何其他已部署模型一样,或通过聊天完成 API 中来使用它。 例如,可以向已部署的模型发送聊天完成调用,如以下 Python 示例中所示。 可以继续对自定义模型使用相同的参数,例如温度和 max_tokens,就像对其他已部署的模型一样。

  • OpenAI Python 1.x
import os
from openai import AzureOpenAIclient = AzureOpenAI(azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), api_key=os.getenv("AZURE_OPENAI_KEY"),  api_version="2023-05-15"
)response = client.chat.completions.create(model="gpt-35-turbo-ft", # model = "Custom deployment name you chose for your fine-tuning model"messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Does Azure OpenAI support customer managed keys?"},{"role": "assistant", "content": "Yes, customer managed keys are supported by Azure OpenAI."},{"role": "user", "content": "Do other Azure AI services support this too?"}]
)print(response.choices[0].message.content)

删除部署

与其他类型的 Azure OpenAI 模型不同,微调/自定义模型在部署后会产生关联的每小时托管费用。 强烈建议你在完成本教程并针对微调后的模型测试了一些聊天完成调用后,删除模型部署

删除部署不会对模型本身产生任何影响,因此你可以随时重新部署为本教程训练的微调模型。

可以通过 [REST API]、[Azure CLI]或其他支持的部署方法删除 Azure OpenAI Studio 中的部署。

关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/224810.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用travelbook架设自己的实时位置共享服务

travelbook 是一款开源的安卓APP&#xff0c;它能以低功耗提供实时位置共享&#xff0c;它包含功能如下&#xff1a; 好友之间分享实时位置&#xff1b;记录行程轨迹&#xff1b;标记收藏地点&#xff1b; 这款软件的主要解决的问题包括&#xff1a; 场景1&#xff1a;查看老…

云原生系列3-Kubernetes

1、Kubernetes概述 k8s缩写是因为k和s之间有八个字符。k8s是基于容器技术的分布式架构方案。官网&#xff1a;https://kubernetes.io/zh-cn/ Google在 2014年开源了Kubernetes项目&#xff0c;Kubernetes是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。同样类似的…

智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子轨道搜索算法4.实验参数设定…

uniapp在中app,登录页能记住多个账号以及密码功能完整代码

如图所示&#x1f447;&#xff1a; 1.可以选择下拉&#xff0c;选取曾经登录成功的账户&#x1f447; 2.选择好下拉后自动赋值&#xff0c;账号密码。 3.勾选记住我则记住该账户以及密码 4.选择下拉后&#xff0c;点选删除账户&#xff0c;则删除 <template><view…

【数据结构和算法】找到最高海拔

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列…

设计模式 建造者模式 与 Spring Bean建造者 BeanDefinitionBuilder 源码与应用

建造者模式 定义: 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示主要作用: 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象如何使用: 用户只需要给出指定复杂对象的类型和内容, 建造者模式负责按顺序创建复杂对象…

ZooKeeper Client API 安装及使用指北

下载 wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.4-beta/zookeeper-3.5.4-beta.tar.gz解压 tar -zxf zookeeper-3.5.4-beta.tar.gz安装 cd zookeeper-3.5.4-beta/src/c/ ./configure make sudo make install到 make 这一步大概率会出现报错&#xff1a;…

几种串口扩展电路

一、IIC串口扩展电路 LCT200 是一款可以通过 I2C 接口通讯&#xff0c;拓展 2 路独立串口的通讯芯片&#xff0c;同时也支持通过 2 路串口读写 I2C 接口的数据。LCT200 的封装为 TSSOP-20。 主要功能&#xff1a;⚫ 通过对 I2C 接口读写实现拓展 2 路独立串口功能 ⚫ 通过读写…

计算机毕业设计 基于SpringBoot的高校宣讲会管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

手把手从0开始SpringBoot多模块项目搭建

最近起个小项目&#xff0c;用多模块搭建一下&#xff0c;顺便记录分享 1.创建父工程 通过Spring Lnitalizer创建&#xff0c; 我这里使用的是 springboot 2.7.3 jdk11 创建好后删除刚创建工程里不需要的文件&#xff0c; 只保留&#xff1a;.idea 文件夹 、项目 pom 文件、…

微服务概念

1.什么是微服务&#xff1f; 顾名思义&#xff0c;是一个微小的服务&#xff0c;为什么会说是“ 微 ” 呢&#xff1f; 意思整个服务的是比较微小的&#xff0c;是一个独立的业务模块&#xff0c;专做改业务的事情&#xff0c;是一个独立的功能单元。 一种独特的架构设计模式&…

【python】python课设 天气预测数据分析及可视化(完整源码)

目录 1. 前言2. 项目结构3. 详细介绍3.1 main.py3.2 GetModel.py3.3 GetData.py3.4 ProcessData.py3.5天气网.html 4. 成果展示 1. 前言 本文介绍了天气预测数据分析及可视化的实现过程使用joblib导入模型和自定义模块GetModel获取模型&#xff0c;输出模型的MAE。使用pyechart…

Java基于TCP网络编程的群聊功能

服务端 import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List;public class Server2 {public static List<Socket> onlineList new ArrayList<>();public static void main(String[] args) throws Except…

格密码:傅里叶矩阵

目录 一. 铺垫性介绍 1.1 傅里叶级数 1.2 傅里叶矩阵的来源 二. 格基与傅里叶矩阵 2.1 傅里叶矩阵详细解释 2.2 格基与傅里叶矩阵 写在前面&#xff1a;有关傅里叶变换的解释太多了&#xff0c;这篇博客主要总结傅里叶矩阵在格密码中的运用。对于有一定傅里叶变换基础的同…

Android/iOS APP备案流程指南

Android/iOS APP备案流程指南 摘要 本文通过详细介绍了工信部对移动互联网应用程序&#xff08;APP&#xff09;备案的要求&#xff0c;解释了APP备案的定义、时间节点、办理流程以及腾讯云、阿里云的备案流程&#xff0c;最后提供了常见问题的解答。 引言 随着移动互联网的…

Benchmarking Denoising Algorithms with Real Photographs_CVPR2017

Abstract 1、在过往研究中&#xff0c;图像去噪算法缺少无噪声的真值&#xff0c;而人为构建的噪声模型不真实&#xff0c;效果不好。 2、作者的思路&#xff1a;构建有噪图&对应的无噪图的成对真实数据集。 Amber&#xff1a;这是很硬核的做实事的思路&#xff0c;实现过…

AI模型私人订制

使用AI可以把你的脸换成明星的脸&#xff0c;可以用于直播、录播。 ai换脸 也可以把视频中明星的脸换成你的脸 1074 之所以能够替换成功&#xff0c;是因为我们有一个AI人物模型&#xff0c;AI驱动这个模型就可以在录制视频的时候替换指定人物的脸。AI模型从哪里来&#xf…

开发辅助一(网关gateway+ThreadLocal封装用户信息+远程调用+读取配置文件+统一异常处理)

网关gateway模块 ①、配置文件&#xff0c;添加各个服务模块的路由路径 gateway:routes:-id: server-cart #微服务名称uri: lb://service-cart #负责均衡predicates:- Path/api/order/cart/**ThreadLocal ①、定义一个工具类 public class AuthContextUtil{private static…

飞天使-k8s知识点7-kubernetes升级

文章目录 验证新版本有没有问题需要安装的版本微微 1.20.6.0kubeadm upgrade plan 验证新版本有没有问题 查看可用版本的包 现有的状态 查看版本 yum list kubeadm --showduplicates |grep 1.20 yum list kubelet --showduplicates |grep 1.20 yum list kubectl --showduplic…

基于机器学习算法的数据分析师薪资预测模型优化研究(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…