原文链接:http://arxiv.org/pdf/2302.13971.pdf
在大语料上训练得到的大语言模型(LLM)已经展示了它们的实力,在few-shot特性展现之后,有一系列的工作都关注于提高这些模型的规模。它们的努力是基于更多的参数可以带来更好的性能的假设之上。
但是Hoffmann的工作表示,在给定预算的条件下,最好的模型并不一定是最大的模型,在更多的数据上训练的较小的模型反而会达到更好的性能。Hoffmann工作的目的是决定如何确定数据集和模型大小的规模,但是他忽略了推理的成本。所以在这篇文章中,给定一个目标的性能等级,更推荐的模型不是最快训练的,但是是最快推理的。产生的模型称为LLaMA,参数范围从7B到65B,与现在最好的LLM相当。
LLaMA-13B比GPT-3在大多数benchmarks上性能都要好,但是模型大小缩减到十分之一。Meta团队相信这个模型有助于LLM的使用和研究的大众化,因为可以在单个GPU上运行。在更高的规模量上,65B参数量模型与当前最好的LLM(比如Chinchila或PaLM-540B)相比更具有竞争力。LLaMA的另一个优势是它是使用公开数据集进行训练。
在论文的剩余部分,作者概述对Transformer架构的调整以及训练方法的调整。然后,作者介绍了LLaMA的性能,以及在benchmark上与其他LLM的比较。最后,作者揭露了在他们编码中的偏见和毒性。
主要贡献:
这项工作的训练方法相似于Brown的工作,并且受到Hoffmann的启发。模型使用标准优化器进行优化。
与目前在LLM上的工作相似,本工作基于transformer架构,并且利用了Transformer后续提出的各种改进,下面是与原始架构不同之处,灵感来源在括号中显示。
LLaMA使用AdamW优化器,超参数是,使用余弦学习率调度,这样最终的学习率是最大的学习率的十分之一,使用的权重衰减为0.1,梯度剪裁为1,使用2000个热身步,并且根据模型的大小而改变学习率和批处理大小。
通过以下方法来提高训练速度:
xformers
库完成。之所以可以达到这个效果,是因为它不存储注意力权重和不计算由于语言建模任务的因果性质而被掩盖的关键字/查询分数。all_reduce
)。当训练65B参数模型时,代码在2048个A100 GPU和80GB RAM上处理大约380个token/秒/GPU,这意味着1.4T个token的数据集训练大概需要21天。
像大部分的工作一样,这项工作使用zero-shot和few-shot的任务,在20个benchmarks上进行实验。
主要实验的内容有:
对instruction data进行简单的微调可以快速改进MMLU。
根据之前的研究所得,LLM生成的信息有潜在的毒性,所以去判定一个LLM生成毒性信息的潜力是有必要的。为了了解LLaMA-65B的潜在危害,作者在不同的benchmarks上评估有毒成分的生成和进行定型检测。
一个模型可以产生的有毒成分范围非常大,这使得彻底的评估具有挑战性。许多最近的工作选择采用RealToxicityPrompts benchmark来表征模型的毒性。RealToxicityPrompts由100K个prompts组成,然后模型必须完成这些prompt,再由PerspectiveAPI生成得分。但是作者无法控制使用第三方API的管道,所以使得和以前的模型比较变得困难。
对于每个prompt,作者都贪婪地用模型生成结果,并测量它们的得分,得分范围从0(无毒)到1(有毒)。
1951年Shannon提出语言模型是单词、token或者字符序列的概率分布。下一个token预测一直被认为是自然语言处理中的一个核心问题。因为图灵提出通过“模仿游戏”使用语言来衡量机器智能,因此语言建模被认为是衡量人工智能的benchmark。
在过去,语言模型基于n-gram的数量统计,并且提出大量的平滑技术来改进罕见事件的估计。在过去二十年,神经网络成功地应用到语言模型任务中,从前馈神经网络、RNN到LSTM。最近Transformer架构,基于自注意力的特性使得自然语言处理领域有了巨大进步,尤其是在获取长距离依赖关系的时候。
对于语言模型,在模型和数据集上进行规模的改变都有着悠久的历史。Brants等人展示了使用在2trillion tokens、300billion n-grams上训练对机器翻译质量的提升,但是这项工作依赖于一种简单的平滑工具,称为Stupid Backoff
。后来Heafield等人展示如何将Kneser-Ney平滑扩展到Web-scale的数据,他从CommonCrawl获取数据集,训练了一个在975billions token上的5-gram模型,从而得到一个有500billions n-grams的模型。Chelba引入One Billion Word
benchmark,一个用来衡量语言模型进展的大规模训练集。
在神经语言模型的背景下,Jozefowicz达到Billion Word Benchmark的SOTA,方法是将LSTM扩大到1B参数;后面还有一系列对Transformer进行缩放的模型,比如BERT,GPT-2,Megatron-LM和T5,其中比较著名的是有175B参数的GPT-3,这催生了一系列LLM,比如Jurassic-1,Megatron-Turing NLG,Gopher,Chinchilla,PaLM,OPT和GLM。Kaplan专门为transformer模型推导了幂律,Hoffmann通过在scaling数据集时调整学习率,修改了它。
参考链接:
http://arxiv.org/pdf/2302.13971.pdf http://zhuanlan.zhihu.com/p/618297774
下载基模型参数
git clone http://huggingface.co/nyanko7/LLaMA-7B
调用基模型进行生成任务:
python3 example.py --llama-path modles/llama --model 7B
参考链接:
http://github.com/facebookresearch/llama http://github.com/galatolofederico/vanilla-llama http://huggingface.co/decapoda-research/llama-7b-hf/tree/main?doi=true http://huggingface.co/nyanko7/LLaMA-7B/tree/main
本节中,我们介绍如何基于TencentPretrain预训练框架训练LLaMA模型。
TencentPretrain 是UER-py预训练框架的多模态版本,支持BERT、GPT、T5、ViT、Dall-E、Speech2Text等模型,支持文本、图像和语音模态预训练及下游任务。TencentPretrain基于模块化设计,用户可以通过模块组合的方式构成各种模型,也可以通过复用已有的模块进行少量修改来实现新的模型。例如,LLaMA的模型架构基于Transformer有三项改动:
得益于模块化特性,我们在TencentPretrain中基于GPT2模型的已有模块,仅添加约100行代码就能实现以上三个改动从而训练LLaMA模型。具体的使用步骤为。
1、克隆 TencentPretrain 项目,并安装依赖:PyTorch、DeepSpeed、SentencePiece git clone http://github.com/Tencent/TencentPretrain.git 2、下载 LLaMA 模型权重(7B),可以向 FacebookResearch 申请模型,或者从 Huggingface 社区获取;将模型权重转换为 TencentPretrain 格式 git clone http://huggingface.co/nyanko7/LLaMA-7B cd TencentPretrain python3 scripts/convert_llama_to_tencentpretrain.py --input_model_path models/LLaMA-7B/consolidated.00.pth --output_model_path models/llama-7b.bin --layers_num 32 3、调整配置文件 将 tencentpretrain/utils/constants.py 文件中 L4: special_tokens_map.json 修改为 llama_special_tokens_map.json 4. 语料预处理:使用项目自带的语料作为演示,也可以使用相同格式的语料进行替换 预训练语料下载:http://github.com/dbiir/UER-py/wiki/%E9%A2%84%E8%AE%AD%E7%BB%83%E6%95%B0%E6%8D%AE python3 preprocess.py --corpus_path corpora/book_review.txt --spm_model_path models/LLaMA-7B/tokenizer.model --dataset_path dataset.pt --processes_num 8 --data_processor lm 5. 启动训练,以单卡为例 deepspeed pretrain.py --deepspeed --deepspeed_config models/deepspeed_config.json \ --pretrained_model_path models/llama-7b.bin \ --dataset_path dataset.pt --spm_model_path models/LLaMA-7B/tokenizer.model \ --config_path models/llama/7b_config.json \ --output_model_path models/LLaMA-7B/output_model.bin \ --world_size 1 --learning_rate 1e-4 \ --data_processor lm --total_steps 10000 --save_checkpoint_steps 2000 --batch_size 24
启动训练后,可以看到模型的 loss 和准确率。
类似facebookresearch/llama ,TencentPretrain也提供语言模型推理代码。例如,使用单卡进行LLaMA-7B推理,prompt在文件beginning.txt
中:
python3 scripts/generate_lm.py --load_model_path models/llama-7b.bin --spm_model_path models/LLaMA-7B/tokenizer.model \ --test_path beginning.txt --prediction_path generated_sentence.txt \ --config_path models/llama/7b_config.json
开源的LLaMA模型在预训练阶段主要基于英语训练,也具有一定的多语言能力,然而由于它没有将中文语料加入预训练,LLaMA在中文上的效果很弱。利用TencentPretrain框架,用户可以使用中文语料增强LLaMA的中文能力,也可以将它微调成垂直领域模型。
参考链接:
http://github.com/dbiir/UER-py http://zhuanlan.zhihu.com/p/612752963 http://github.com/Tencent/TencentPretrain
参考链接:
http://github.com/ymcui/Chinese-LLaMA-Alpaca
a lightweight adaption method for fine-tuning instruction-following LLaMA models, using 52K data provided by Stanford Alpaca.
By inserting adapters into LLaMA's transformer, our method only introduces 1.2M learnable parameters, and turns a LLaMA into an instruction-following model within 1 hour. For stablizing training at early stages, we propose a novel Zero-init Attention with zero gating mechanism to adaptively incorporate the instructional signals. After fine-tuning, LLaMA-Adapter can generate high-quality instruction-following sentences, comparable to the fully fine-tuned Stanford Alpaca and Alpaca-Lora.
Our approach can be simply extended to Multi-modal Input Instructions.
下载llama-7b模型:
git clone http://huggingface.co/nyanko7/LLaMA-7B
下载LLaMA-Adapter模型权重:
http://github.com/ZrrSkywalker/LLaMA-Adapter/releases/download/v.1.0.0/llama_adapter_len10_layer30_release.pth
文本生成:
conda create -n llama_adapter -y python=3.8 conda activate llama_adapter # install pytorch conda install pytorch cudatoolkit -c pytorch -y # install dependency and llama-adapter pip install -r requirements.txt pip install -e . CUDA_VISIBLE_DEVICES=0 python3 example.py --ckpt_dir ./models/llama-7b --tokenizer_path ./models/llama-7b/tokenizer.model --adapter_path ./models/llama-7b torchrun --nproc_per_node 1 example.py --ckpt_dir models/7b/ --tokenizer_path models/7b/tokenizer.model --adapter_path models/7b torchrun --nproc_per_node 1 example.py --ckpt_dir ./models/llama-7b --tokenizer_path ./models/llama-7b/tokenizer.model --adapter_path ./models/llama-7b
下载数据集:
http://raw.githubusercontent.com/tatsu-lab/stanford_alpaca/main/alpaca_data.json
启动训练:
cd alpaca_finetuning_v1 torchrun --nproc_per_node 1 finetuning.py --model Llama7B_adapter --llama_model_path ../models/llama-7b/ --data_path ../data_dir/alpaca_data.json --adapter_layer 30 --adapter_len 10 --max_seq_len 512 --batch_size 4 --epochs 5 --warmup_epochs 2 --blr 9e-3 --weight_decay 0.02 --output_dir ../models/llama-7b/checkpoint/ # 单显卡 CUDA_VISIBLE_DEVICES=0 python3 finetuning.py --model Llama7B_adapter --llama_model_path ../models/llama-7b/ --data_path ../data_dir/alpaca_data.json --adapter_layer 30 --adapter_len 10 --max_seq_len 512 --batch_size 4 --epochs 5 --warmup_epochs 2 --blr 9e-3 --weight_decay 0.02 --output_dir ../models/llama-7b/checkpoint/
参考链接:
http://arxiv.org/abs/2303.16199 http://github.com/ZrrSkywalker/LLaMA-Adapter http://huggingface.co/spaces/csuhan/LLaMA-Adapter http://github.com/tatsu-lab/stanford_alpaca
该项目仍旧使用alpaca的训练数据,基模型仍旧基于LLaMA 7B, 但是把训练方式改成用lora训练。
This repository contains code for reproducing the Stanford Alpaca results using low-rank adaptation (LoRA). We provide an Instruct model of similar quality to text-davinci-003
that can run on a Raspberry Pi (for research), and the code is easily extended to the 13b
, 30b
, and 65b
models.
In addition to the training code, which runs within hours on a single RTX 4090, we publish a script for downloading and inference on the foundation model and LoRA, as well as the resulting LoRA weights themselves. To fine-tune cheaply and efficiently, we use Hugging Face's PEFT as well as Tim Dettmers' bitsandbytes.
Without hyperparameter tuning, the LoRA model produces outputs comparable to the Stanford Alpaca model. (Please see the outputs included below.) Further tuning might be able to achieve better performance; I invite interested users to give it a try and report their results.
准备训练数据集:
http://huggingface.co/datasets/yahma/alpaca-cleaned/tree/main
启动训练:
screen python3 finetune.py --base_model 'decapoda-research/llama-7b-hf' --data_path 'yahma/alpaca-cleaned' --output_dir './lora-alpaca' screen python3 finetune.py --base_model 'decapoda-research/llama-7b-hf' --data_path 'yahma/alpaca-cleaned' --output_dir './lora-alpaca' --batch_size 64 --micro_batch_size 4 --num_epochs 30 --learning_rate 1e-6 --cutoff_len 1024 --val_set_size 2000 --lora_r 8 --lora_alpha 16 --lora_dropout 0.05 --lora_target_modules '[q_proj,v_proj]' --train_on_inputs --group_by_length # 本地训练集 screen python3 finetune.py --base_model 'decapoda-research/llama-7b-hf' --data_path './data_dir/alpaca_data_cleaned.json' --output_dir './lora-alpaca' --batch_size 128 --micro_batch_size 4 --num_epochs 30 --learning_rate 1e-5 --cutoff_len 1024 --val_set_size 2000 --lora_r 8 --lora_alpha 16 --lora_dropout 0.05 --lora_target_modules '[q_proj,v_proj]' --train_on_inputs --group_by_length # Official weights screen python3 finetune.py --base_model 'decapoda-research/llama-7b-hf' --data_path './data_dir/alpaca_data_cleaned.json' --output_dir './lora-alpaca' --batch_size 128 --micro_batch_size 4 --num_epochs 30 --learning_rate 1e-5 --cutoff_len 1024 --val_set_size 2000 --lora_r 8 --lora_alpha 16 --lora_dropout 0.05 --lora_target_modules '[q_proj,k_proj,v_proj,o_proj]' --train_on_inputs --group_by_length
This file reads the foundation model from the Hugging Face model hub and the LoRA weights from tloen/alpaca-lora-7b
, and runs a Gradio interface for inference on a specified input.
python3 generate.py --load_8bit --base_model 'decapoda-research/llama-7b-hf' --lora_weights 'tloen/alpaca-lora-7b'
These files contain scripts that merge the LoRA weights back into the base model for export to Hugging Face format and to PyTorch state_dicts
. They should help users who want to run inference in projects like llama.cpp or alpaca.cpp.
参考链接:
http://github.com/tloen/alpaca-lora
GPT-4系列技术的集中出现,同时在人工智能技术/人工智能技术研发/人工智能领域应用,三个领域引发了不同程度的范式革命的讨论。笔者现在还不确定这个范式转移是否会,以及多大程度上发生,这里梳理了一下简单的思考和推理过程。
在这三个范式之下,业内还有很多团队focus在计算架构和训练效率的优化,例如petf、deepsppeed、lora、torchrun技术等。
需要注意的是,大模型的研发和调优,对CPU内存/GPU主频配置/GPU显存等因素都有不同以往的要求,这对很多开发者和机构来说可能也是一个不小地门槛。
设计一个代码使用描述,例如:
将上述要求拼接成一个prompt模板,将原始非结构化样本数据处理为instruction-output格式的成对训练集。
全端口监听服务器上所有not in used端口,通过大模型模拟一个Web应用对外提供Web服务,根据外部的http请求,智能生成合适地http response。这种架构设计的优势在于可以减少在后端逐一根据漏洞、应用部署对应的web应用容器的成本。
用于在安全运营和应急响应中,向安全和IT人员提供样本的可读化描述,提升事件处理效率。
基于用户提供的少量某个类型的样本数据,学习该类数据的模式特征,自动生成识别该类型数据的正则表达式,帮助提高在数据类型识别场景中的正则表达式编写效率。
这里列举一些在具体网络安全产品/技术领域,对机器学习/深度学习/大模型技术的技术指标/功能性需求:
笔者认为,当前要在网络安全领域大规模应用大模型,可能存在的一些阻力和挑战:
1、购买一个GPU V100机器(32G显存以上),CPU内存配置也尽量大一些,模型训练涉及到多线程处理对内存也有需求
2、配置好cuda显卡驱动
3、下载alpaca-lora大模型训练框架(众多大模型训练框架之一)
git clone http://github.com/tloen/alpaca-lora.git
4、安装依赖环境
cd alpaca-lora
pip install -r requirements.txt
5、基于官方已经训练好的大模型进行文本生成(可以理解成此时的大模型是一个刚毕业的大学生,已经具备了一定的社会通用知识,以及学习新知识的能力)
python3 generate.py --load_8bit --base_model 'decapoda-research/llama-7b-hf' --lora_weights 'tloen/alpaca-lora-7b'
以上指令会在0.0.0.0.0启动一个webserver,访问对应地址即可进行文本生成和对话
6、基于新的训练集训练一个新的大模型出来(可以理解为让这个大学生学习特定领域的任务,此时的大学生已经不是那个刚刚毕业的大学生了,成为了一个新的职场人)
python3 finetune.py --base_model 'decapoda-research/llama-7b-hf' --data_path 'yahma/alpaca-cleaned' --output_dir './models/alinet_payload'
# --output_dir './models/alinet_payload': 代表说训练后的模型权重文件保存在哪里
# --data_path 'yahma/alpaca-cleaned': 用于训练的数据集,训练集的格式长这样
[
{
"instruction": "Give three tips for staying healthy.",
"input": "",
"output": "1. Eat a balanced and nutritious diet: Make sure your meals are inclusive of a variety of fruits and vegetables, lean protein, whole grains, and healthy fats. This helps to provide your body with the essential nutrients to function at its best and can help prevent chronic diseases.\n\n2. Engage in regular physical activity: Exercise is crucial for maintaining strong bones, muscles, and cardiovascular health. Aim for at least 150 minutes of moderate aerobic exercise or 75 minutes of vigorous exercise each week.\n\n3. Get enough sleep: Getting enough quality sleep is crucial for physical and mental well-being. It helps to regulate mood, improve cognitive function, and supports healthy growth and immune function. Aim for 7-9 hours of sleep each night."
},
{
"instruction": "What are the three primary colors?",
"input": "",
"output": "The three primary colors are red, blue, and yellow. These colors are called primary because they cannot be created by mixing other colors and all other colors can be made by combining them in various proportions. In the additive color system, used for light, the primary colors are red, green, and blue (RGB)."
}
]
# instruction: 你对大模型发出的指令
# input: 你对大模型说的具体任务详情
# output: 该任务的理想状态的回复结果(这是你要教会大模型的东西)
举个例子,如果你希望教会大模型识别冰蝎的http通信特征,你可以这样构造数据集:
[
{
"instruction": "The following string is a http request payload log,pleaes judge whether is there any security risk: ",
"input": "冰蝎通信http日志",
"output": "### Response:illegal"
}
]
7、基于训练好的新大模型(适应了特定职场任务的新职场人)进行新的文本生成任务,此时你的大模型就具备了你喂给他的数据集所蕴含的能力
# 如果是用lora进行fine-tune,基模型要和fine-tune时保持一致
# --lora_weights 指定前面fine-tune训练得到的模型权重文件路径
python3 generate.py --load_8bit --base_model 'decapoda-research/llama-7b-hf' --lora_weights './models/alinet_payload'
按照技术发展的趋势,大模型的开发会越来越向头部厂商/机构垄断,而大模型下游的应用会越来越标准化和便利化,以后大模型开发会成为一种的编程范式,和python调用json、os库一样容易,各种开发设计范式也会出来,指导程序员如何更好地构造入参(大模型训练需要的语料库,需要进行清洗、构造)开发对应的大模型代码,更好地赋能各行各业的业务场景。
准备训练数据集:
import os import json if __name__ == "__main__": data_path = "./webshell_illegal" input_file_path = '../fomo_webshell.prompt.json' for root, dirs, files in os.walk(data_path): for file in files: file_path = os.path.join(root, file) print("file_path", file_path) with open(file_path, "rb") as f: instruction = f.read().decode('utf-8', errors='ignore') prompt_line = json.dumps({ "instruction": "Please judge whether the following code is a security risk: ", "input": instruction, "output": "### Response:illegal" }) print(prompt_line) with open(input_file_path, "a+") as file: file.write(prompt_line) data_path = "./webshell_legal" input_file_path = '../fomo_webshell.prompt.json' for root, dirs, files in os.walk(data_path): for file in files: file_path = os.path.join(root, file) print("file_path", file_path) with open(file_path, "rb") as f: instruction = f.read().decode('utf-8', errors='ignore') prompt_line = json.dumps({ "instruction": "Please judge whether the following code is a security risk: ", "input": instruction, "output": "### Response:legal" }) print(prompt_line) with open(input_file_path, "a+") as file: file.write(prompt_line)
prompt-tune训练
screen python3 finetune.py --base_model 'decapoda-research/llama-7b-hf' --data_path './data_dir/fomo_webshell.prompt.json' --output_dir './models/fomo_webshell' --batch_size 64 --micro_batch_size 16 --num_epochs 20 --learning_rate 1e-5 --cutoff_len 1024 --val_set_size 128 --lora_r 8 --lora_alpha 16 --lora_dropout 0.05 --lora_target_modules '[q_proj,k_proj,v_proj,o_proj]' --train_on_inputs --group_by_length
加载模型进行文本生成:
# 如果是用lora进行fine-tune,基模型要和fine-tune时保持一致 # --lora_weights 制定fine-tune训练得到的模型权重文件路径 python3 generate.py --load_8bit --base_model 'decapoda-research/llama-7b-hf' --lora_weights './models/fomo_webshell'
测试效果:
<?php eval($_GET[1]); <?php //@eval($_POST['op']); @eval(${"_P"."OST"}['op']); ?> <?php //@eval($_POST['op']); @eval($/*aaa*/{"_P"."OST"}['op']); ?> <?php @eval($_FILES['name']); ?>
准备训练数据集:
import os import json import csv if __name__ == "__main__": input_file_path = '../alinet_payload.prompt.json' # 清空文件内容 with open(input_file_path, 'w') as f: f.truncate(0) # illegal with open("./alinet_payload_illegal_0.1M.csv", mode='r') as file: reader = csv.reader(file) header = next(reader) # 读取并忽略第一行标题 for row in reader: # 逐行读取数据 request_body = str.strip(row[18]) # 获取 request_body 列的值 # 在这里对 request_body 进行处理 # print(request_body) prompt_line = json.dumps({ "instruction": "The following string is a http request payload log,pleaes judge whether is there any security risk: ", "input": request_body, "output": "### Response:illegal" }) print(prompt_line) with open(input_file_path, "a+") as file: file.write(prompt_line) # legal with open("./alinet_payload_legal_0.1M.csv", mode='r') as file: reader = csv.reader(file) header = next(reader) # 读取并忽略第一行标题 for row in reader: # 逐行读取数据 request_body = str.strip(row[18]) # 获取 request_body 列的值 # 在这里对 request_body 进行处理 # print(request_body) prompt_line = json.dumps({ "instruction": "The following string is a http request payload log,pleaes judge whether is there any security risk: ", "input": request_body, "output": "### Response:legal" }) print(prompt_line) with open(input_file_path, "a+") as file: file.write(prompt_line)
* and model: block and not model: monitor | select distinct decode_payload limit 10000
screen python3 finetune.py --base_model 'decapoda-research/llama-7b-hf' --data_path './data_dir/alinet_payload.prompt.json' --output_dir './models/alinet_payload' --batch_size 128 --micro_batch_size 32 --num_epochs 2 --learning_rate 1e-5 --cutoff_len 1024 --val_set_size 128 --lora_r 8 --lora_alpha 16 --lora_dropout 0.05 --lora_target_modules '[q_proj,k_proj,v_proj,o_proj]' --train_on_inputs --group_by_length
加载模型进行文本生成:
# 如果是用lora进行fine-tune,基模型要和fine-tune时保持一致
# --lora_weights 制定fine-tune训练得到的模型权重文件路径
python3 generate.py --load_8bit --base_model 'decapoda-research/llama-7b-hf' --lora_weights './models/alinet_payload'
推理应用中内存体系结构的能量延迟精度的基本限制本文获得了内存计算体系结构(IMC)的计算精度的基本限制。定义了一个IMC噪声模型和相关的SNR度量,并分析了它们之间的相互关系,以表明IMC的精度从根本上受到其模拟内核的计算SNR(SNRa)的限制,并且需要适当分配激活,权重和输出精度以用于最终输出SNRSNRT → SNRa。提出了最小精度标准(MPC),以最小化ADC精度。三种内存计算模型-电荷求和(QS),电流求和(IS)和电荷再分配(QR)-被显示为最知名的IMC的基础。开发了用于计算模型的噪声,能量和延迟表达式,并将其用于导出IMC的SNR,ADC精度,能量和等待时间的表达式。SNR的计算表达式通过65nmCMOS工艺中的MonteCarlo仿真进行了验证。对于512行SRAM阵列,结果表明:1)IMC由于受能量,面积和电压摆幅的限制,在其最大可达到SNRa上具有上限,并且该上限随着基于QS架构的技术扩展而减小;2)MPC使SNRT → SNRa以最小的ADC精度实现;3)对于低(高)计算SNR场景,首选基于QS(基于QR)的体系结构。原文标题:FundamentalLimit
这是一场被加速的本地生活改革,对于试图在线上寻求自救的传统零售业而言,所面临的是更深入的数字化改造。对大牌零售商来说,第一次数字化风口无疑是电商,那么第二次数字化风口必然是本地生活,能否在现在的大环境下实现换道超车就看这关键的一步了。传统零售商数字化第一个风口可以从2008年淘宝商城(现在的天猫)的建立开始,那个阶段以商品数字化为主要形式,核心是通过电商平台实现增量销售。而2015年马云提出的新零售则让传统零售商意识到需要由外及里实现全面的数字化,这个过程包括组织数字化和实体门店的数字化。随着新零售的风越吹越劲,传统零售商第二个数字化的风口逐渐到来了。只是这个风口在目前看来,不再是简单地将线上电商和线下零售结合,而是包括了线下零售、线上店和外卖即时配送在内的数字化零售新模式,它将是全域一体的。2020年4月24日,继新华书店、晨光文具等上线饿了么之后,全球最大的综合体育用品零售商迪卡侬近日正式入驻饿了么。不同品类不同业态的传统零售商纷纷入驻饿了么开店,大牌零售们都开始不约而同地做同一件事情,可以看出这些标志性事件背后已经形成了一个非常重要的新风口。抓住电商风口的传统零售商有了更广阔的发
本文授权转载自公众号:论智 编者按:有关人脸识别的项目我们已经介绍了很多了,那么哪种人脸识别的API最好?本文将对比四种API,分别是亚马逊Rekognition、谷歌CloudVisionAPI、IBMWatsonVisualRecognition以及微软的FaceAPI,从成功率、价格和速度三方面分析上述四种软件服务商的产品。人脸识别究竟如何工作?深入分析之前,首先让我们探究一下人脸识别的工作原理。 Viola-Jones的人脸识别2001年,PaulViola和MichaelJone开始了计算机视觉的革命,当时的人脸识别技术并不成熟,识别准确度较低,速度也很慢。直到提出了Viola-Jones人脸识别框架后,不仅成功率大大提高,而且还能实施进行人脸识别。自从上世纪90年代开展了各项人脸识别、目标识别挑战赛,这类技术得到了迅猛发展。深度卷积神经网络2010年,ImageNet视觉识别挑战赛开始举办,前两年,大部分参赛队伍都用FisherVectors和支持向量机的结合。但2012年,一切都变了。多伦多大学的团队(AlexKrizhevsky、IlyaSutskever和Geoffr
概述:本文讲述如何在OL3中加载Geojson并动态修改图层样式。效果:地图展示样式修改面板实现代码:<htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/> <title>Ol3wms</title> <linkrel="stylesheet"type="text/css"href="../../../plugin/ol3/css/ol.css"/> <styletype="text/css"> body,#map{ border:0px; margin:0px; padding:0px; width:100%; height:100%; fon
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢1.文档编写目的在Kudu配置的WAL和Data路径与其他服务(如NameNode、DataNode等)共用一块磁盘的情况下(可能会产生磁盘空间不足或者IO争用),需要将WAL和Data的目录迁移至新的磁盘上。本文主要讲述如何通过ClouderaManager来完成KuduMaster和Tablet的WAL和Data目录迁移。内容概述1.环境说明2.TabletServer角色操作3.KuduMaster角色操作4.迁移验证测试环境1.CM和CDH版本为5.10.2前置条件1.CM和CDH集群正常2.Kudu1.2服务器正常3.新的数据盘已格式化并挂载2.环境说明这里由于Fayson的磁盘有限,所以将KuduMaster和Tablet配置的WAL和Data的路径分别修改为:Kudu服务的配置情况角色分布磁盘配置迁移前my_first_table数据3.TabletServer角色操作1.停
浏览器缓存机制之一(经典缓存)因为在接手的项目中用到过比较新的HTML5应用缓存,也用到了经典的缓存如设置max-age,Etag之类,而之前一直就是在用着没有去深究其中原理。周末天气不好,懒得出去了,正好找时间总结下。1.关于浏览器缓存记得去年看《HTTP权威指南》的时候,有一章是专门讲浏览器缓存的,一年时间过得太快,逝去的时光还真是如同人群中消失的好姑娘,眼看她嫁给别人。我这里把浏览器缓存分为经典的浏览器缓存(以下简称为经典缓存)和HTML5应用缓存这两类。经典的浏览器缓存其实主要由几个响应变量来设置,如Cache-Control(设置max-age指定文档处于新鲜期的秒数),Pragma(Pragma主要用于HTTP1.0,HTTP1.1用Cache-Control),Expires(不推荐,因为它指定的是过期的绝对日期而不是相对秒数),Etag和Last_Modified。其中Etag则对应请求头部中的If_None_Match(简写为INM),Last_Modified对应If_Modified_Since(简写为IMS).新的HTML5应用缓存则是支持离线存储文档,使得文档
防护概览(总览)全部业务安全状态展示,您可以在DDoS防护控制台的防护概览页查看全量实时、业务指标和DDoS攻击事件的防护情况,包括基础防护业务、DDoS高防包防护业务、DDoS高防IP防护业务,便于您分析与溯源。 查看攻击态势 登录DDoS防护(新版)控制台,在左侧导航栏中,单击防护概览>防护总览,进入防护总览页面。 在攻击态势模块中,可查看当前业务是否存在风险,和最近一次攻击的时间的攻击类型。当有攻击存在时,单击升级防护可进入购买页。 在攻击态势模块中,还可以直观查看各项数据情况。字段说明: 被攻击IP数:受到攻击的业务IP总数。包括基础防护被攻击IP数、接入高防包后被攻击的业务IP数、高防IP实例被攻击数。 已防护IP数:接入高防包的业务IP和高防IP实例。 被封堵IP数:被屏蔽所有外网访问的业务IP数。包括基础防护的业务IP、接入高防包的业务IP和高防IP实例。 被攻击域名数:高防IP被攻击的域名数、被攻击的端口所影响的域名数。 已防护域名数:高防IP实例的域名接入数量。 攻击峰值:当前攻击事件中的最高攻击带宽。 查看防御态势 登录DDoS防护(新版)控制台,在左侧
今天在测试一下上传文件的时候发现iis和配置存在上传文件大小限制(IIS默认大小30M,最大运行为2g:2147483647),百度了一部分资料有些发布到IIS好使,但是在VS调试中不好使。于是自己不断努力还是找到了问题点。不是说网上的不对,只不过是有些情况下忽略了一些步骤。我就总结了一下我本次的步骤。 第一步: 配置web.config节点中的web节点: <system.web> <compilationdebug="true"targetFramework="4.5"/> <!--主要是maxRequestLength属性--> <httpRuntimetargetFramework="4.5"maxRequestLength="2147483647"executionTimeout="6000"/> <pagescontrolRenderingCompatibilityVersion="4.5"clientIDMode="AutoID"/> </system.web>复制 第二步: 还是配置web.co
Jenkins邮件通知 Jenkins 配备了一个开箱工具,添加一个电子邮件通知的构建项目。 第1步 - 配置SMTP服务器。 转到ManageJenkins→ConfigureSystem。转到电子邮件(E-mail)通知部分,并输入所需的SMTP服务器和用户的电子邮件后缀细节。 第2步- 配置在Jenkins 项目的收件人 - 当配置任何 Jenkins 建设项目,就在添加收件人将会收到电子邮件通知在不稳定性或断裂构建的时候。然后点击保存(Save)按钮。 除了默认,也有通知的插件可在市场上找到。 一个例子是来自Tikal 知识库其允许发送作业状态的通知在JSON和XML格式的通知插件。此插件启用端点进行配置,如下图所示。 下面是每个选项的细节 - "Format" − 这是通知有效载荷格式,可以是JSON或XML。 "Protocol" − 协议用于发送通知消息,HTTP,TCP或UDP。
一.json.hpp库下载及安装 1.1开源地址及引入方法 nlohmannjson的开源项目地址,其中有对json使用方法的详细说明: https://github.com/nlohmann/json#serialization–deserialization 对于我们项目中要使用nlohmannjson工具,只需要引入json.hpp这一个文件,其中包含所有接口函数,正如其文档中所述json.hpp文件在single_include/nlohmann目录下,我们只需要下载该文件即可: gitclonehttps://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json.hpp 上图片所示,使用json.hpp文件需要关注两点: 一是:#include<nlohmann/json.hpp>头文件路径的引入,这里将json.hpp文件放到linux系统中的/usr/local/include路径下,这是系统默认头文件路径,在编译时系统会自动查找该路径。我们在/usr/local/incl
问题描述 今天在做页面UI改版的时候发现,我之前使用的是dom.scrollIntoView();使得点击右侧题目编号的时候,让左侧题目滚动到页面可视区域。 如果不知道scrollIntoView如果使用,我有篇文章专门写了scrollIntoView的简单使用:scrollIntoView()让元素进入可视区域·Issue#167 但是现在有个问题就是,当点击题目编号的时候,除了题目会滚动到可视区域,整个页面也会稍稍往上滚动,导致页面错位。 如下图所示,当我点击第9题的时候,左侧第9题移动到视口中,但是整个页面包括导航栏都往上移动了,且无法在移回来,整个页面是没有滚动条的。 问题分析 这个时候唯一的可能就是scrollIntoView()函数引起的问题。 我之前怀疑是不是该函数给整个页面加了transform属性导致整个页面往上偏移,通过查看css,发现没有。 没有想到办法。只能借助搜索引擎了,于是我在StackOverflow上面找到了一篇文章: javascript-ScrollIntoView()causingthewholepagetomove 说的正好是这种情况。 最
说实话感觉题目看了好几遍才懂这个意思,然后看了题解,觉得解法真的很厉害。 假设数组长度为N,那么没有出现的整数一定是在[1,N+1]中。如果[1,N]都出现了,那没有出现的正整数就是N+1。 1、将数组中所有小于等于0以及大于数组长度N的数都改为N+1; 2、遍历数组中的数,可能有的数被打了标记。如果|x|在(1,N)中,那么就把数组中|x|-1位置的数变成负数。 3、如果数组中每一个数都是负数,那么答案就是N+1,否则答案就是第一个正数的下标加1. 1deffirstMissingPositive(nums): 2n=len(nums) 3foriinrange(n): 4ifnums[i]<=0ornums[i]>n+1: 5nums[i]=n+1 6foriinrange(n): 7num=abs(nums[i]) 8ifnum<=n: 9nums[num-1]=-abs(nums[num-1]) 10foriinrange(n): 11ifnums[i]>0: 12returni+1 13retu
"""re模块参数使用方法:match()从头匹配search()从整个文本搜索findall()找到所有符合的split()分割sub()替换group()结果转换为内容groupdict()结果转换为字段"""importre#:.匹配除\n之外的任意一个字符#:匹配6次任意字符......==6所以结果解释yang12yang12==6#res=re.match('......','yang123123yang123123')#print(res.group())#:+匹配前一个字符1次或多次#:.匹配任意字符+匹配前一个字符1次或者n次所以.+就是匹配所有字符#res=re.match('.+','yang123yang123')#print(res.group())#:^从开头匹配字符#:^匹配开头字符#res=re.match('^yang','yang123yang123')#print(res.group())#:$匹配字符结尾#:$匹配以3结尾的字符.是任意字符$是结尾字符..3$就是匹配以3结尾的任意前2个字符#:但是要注意一点这个时候需要使用全文检索了"searc
最近接到需求,原有的app需要做一个程序内的国际化,可以让用户选择要展示的语言。 but哥可是没有一点思路。。。。 肿么办。 百度。。。 百度下来,取到了一些思路。 自己写到可能有些不尽如人意的地方,烦请各位大牛批评指正。 现总结如下: 1,判断用户手机设置的语言是否包含在当前app支持的语言里面。 如果包含着app支持语言里面。直接根据这个语言设置配置项。 如果不包含在app支持语言里面,弹出语言设置页面,让用户设置。 VShowSetLanguage*setlanguage=[[VShowSetLanguagealloc]init]; [setlanguagesettinglanguage:^(BOOLisShowUserSelectView) { if(isShowUserSelectView) { //加载语言选择界面 [selfloadLanguageChooseView]; }else{ //用户已经设置过语言或者用户当前系统语言在app支持语言内 [selfreloadRootView]; } }]; 复制 VShowSetLanguage:判断是否
(提前声明,本篇博客可能质量不如前几篇好,毕竟连肝四篇博客我已经快吐血了✿◕‿◕✿) 看到这道题,第一时间想到的就是:深搜!! 于是我打了一个只能得到20分,剩下都MLE的深搜代码: #include<iostream> #include<cstdio> usingnamespacestd; intn,m[210],a,b,xq=0,minn=9999; voiddfs(intidx,intcishu){ if(idx==b){ xq=1;//如果到达了我么就用小旗标记一下,以便于最后输出 minn=min(minn,cishu);//每次到达想要的那个楼层时,都要取最小值,这样我们就可以得到只要要按几次按钮了。 return; } //因为在每一层能做的操作只有两个,所以我们做两个判断就够了,如果不越界的话,进行深搜就好啦(●'◡'●) if(idx-m[idx]>0){ dfs(idx-m[idx],cishu+1); } if(idx+m[idx]<=n){ dfs(idx+m[idx],cishu+1); } } intmain(){ s
定义评论的视图函数@app.route('/comment/',methods=['POST'])defcomment():读取前端页面数据,保存到数据库中 用<inputtype="hidden"方法获取前端的"question_id" 显示评论次数 要求评论前登录 尝试实现详情页面下的评论列表显示 1.定义评论的视图函数 1#发布评论 2@app.route('/answer/',methods=['GET','POST']) 3defanswer(): 4ifrequest.method=='POST': 5book_id=request.form.get('book_id') 6question_id=request.form.get('question_id') 7answer_id=request.form.get('answer_id') 8content=request.form.get('content') 9commentaries=Commentaries(id='1',book_id=book_id,question_id=qu
E-LongJumps CodeForces-479D ValeryisaPEteacherataschoolinBerland.Soonthestudentsaregoingtotakeatestinlongjumps,andValeryhaslosthisfavoriteruler! However,thereisnoreasonfordisappointment,asValeryhasfoundanotherruler,itslengthislcentimeters.Theruleralreadyhasnmarks,withwhichhecanmakemeasurements.Weassumethatthemarksarenumberedfrom1tonintheordertheyappearfromthebeginningoftherulertoitsend.Thefirstpointcoincideswiththebeginningoftherulerandrepresentstheorigin.Thelastmarkcoincideswiththeendoftherule
前端请求接口使用的方法从最开始的ajax到后来vue2.0的到来进入我们视线的axios,然后又是fetch,三者之前有什么区别呢? ajax: ajax是最早的异步请求技术,隶属于原始的js,使用的是XMLHttpRequest对象,我们使用的话一般都是用jq封装后的ajax,没用封装的ajax用起来是很不方便的需要很多的配置。 ajax到现在应该说是非常好的,功能非常强大,但是现在很少用JQ或者JS原生来开发的项目,而且ajax的调用也是比较混乱的容易陷入回调地狱,如果说使用Promise来解决回调的话,相比ajax,axios和fetch是更好的选择。 fetch: fetch是基于Promise设计的,语法非常的简洁,调用方便,API也非常的丰富,但是fetch也是有一些缺点的 fetch的接口返回400和500等是在then中返回的而不是走的catch,而且fetch也不支持超时控制。 axios: axios大概是在vue2.0尤大推荐使用的,功能也是非常的强大,除了有ajax和fetch的功能外,还支持接口的拦截,取消等,客户端支持保护安全免受
一、常用的Nginx正则表达式 字符涵义以及示例 ^ 匹配输入字符串的起始位置 $ 匹配输入字符串的结束位置 * 匹配前面的字符零次或多次;如“ol*”能匹配“o”及“ol”、“oll” + 匹配前面的字符一次或多次;如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o” ? 匹配前面的字符零次或一次;例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}” . 匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式 \ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“$”则匹配“$” \d 匹配纯数字 \s 匹配空的(空格或者制表符) {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 [] 定义匹配的字符范围 [c] 匹配单个字符c [a-z] 匹配a-z小写字母的任意一个 [a-zA-Z0-9] 匹配所有大小写字母或数字 () 表达式的开始和结束位置
直接贴代码吧,有需要的话,可以根据自己的需要修改部分代码: publicBigDecimalgetByAttributeName(ThmdGwqriRthmdGwqriR,StringattributeName){ for(Fieldfield:thmdGwqriR.getClass().getDeclaredFields()){ field.setAccessible(true); try{ if(attributeName.toLowerCase().equals(field.getName().toLowerCase())){ returnnewBigDecimal(field.get(thmdGwqriR).toString()); } } catch(Exceptione){ e.printStackTrace(); returnnull; } } returnnull; }复制