LLM探索:环境搭建与模型本地部署

前言

最近一直在炼丹(搞AIGC这块),突然发现业务代码都索然无味了…

上次发了篇AI画图的文章,ChatGPT虽然没法自己部署,但现在开源的LLM还是不少的,只要有一块差不多的显卡,要搞个LLM本地部署还是没问题的。

本文将介绍这以下两个国产开源LLM的本地部署

  • ChatGLM-6B
  • MOSS

本文先简单的把模型跑起来,后续将继续我近期在LLM方向的一些探索记录~

概念

开始之前,先来看看一些基础概念。

AIGC

引用以下 mbalib 的内容

AIGC(AI Generated Content)即人工智能生成内容,又称“生成式AI”(Generative AI),被认为是继专业生产内容(PGC)、用户生产内容(UGC)之后的新型内容创作方式。

互联网内容生产方式经历了PGC——UGC——AIGC的过程。PGC(Professionally Generated Content)是专业生产内容,如Web1.0和广电行业中专业人员生产的文字和视频,其特点是专业、内容质量有保证。UGC(User Generated Content)是用户生产内容,伴随Web2.0概念而产生,特点是用户可以自由上传内容,内容丰富。AIGC(AI Generated Content)是由AI生成的内容,其特点是自动化生产、高效。随着自然语言生成技术NLG和AI模型的成熟,AIGC逐渐受到大家的关注,目前已经可以自动生成文字、图片、音频、视频,甚至3D模型和代码。

最近很多的ChatGPT、AI画图,就都属于这个领域。

LLM

引用以下 wikipedia 的内容

A large language model (LLM) is a language model consisting of a neural network with many parameters (typically billions of weights or more), trained on large quantities of unlabeled text using self-supervised learning or semi-supervised learning. LLMs emerged around 2018 and perform well at a wide variety of tasks. This has shifted the focus of natural language processing research away from the previous paradigm of training specialized supervised models for specific tasks.

中文也就是「大语言模型」,现在很火的ChatGPT就是这个LLM的代表,大模型有一个关键的属性:参数量,参数量的大小决定了大模型的能力(不能说是绝对的,但肯定是正相关)。

以下是常见LLM的参数量:

LLM名称 参数量
ChatGPT 3.5 175B
ChatGLM 6B
MOSS 16B
LLaMA 7B/13B/33B/65B

篇幅关系只列举这几个,更多的可以看文后的参考资料。

搭建环境

硬件

首先要有一台搭载了NVIDIA显卡的Linux系统服务器/电脑。

显存需要达到8G及以上,不然跑不动~

系统推荐使用最新的Ubuntu(22.04)或者其衍生版,以下是我在测试过程中使用的两台服务器配置。

服务器1

  • CPU: Intel(R) Core(TM) i9-10940X CPU @ 3.30GHz
  • 内存:64G
  • 显卡:NVIDIA GeForce RTX 2080 Ti

服务器2

  • CPU:Intel(R) Xeon(R) Gold 5318Y CPU @ 2.10GHz x2
  • 内存:128G
  • 显卡: Tesla T4 x4

软件

说完了硬件,再看看软件。

驱动

首先,需要显卡驱动,Ubuntu系的发行版安装显卡驱动比喝水还容易,这就是为啥推荐炼丹用Ubuntu的理由。

PS:完全可以一键完成,不需要再去网上查什么复制了几百遍的博客然后下载一堆东西又是编译又是卸载nouveau啥的了~

Ubuntu桌面版可以直接用「软件更新」App一键安装显卡驱动。

Ubuntu服务器版本,使用 nvidia-detector 命令检测需要安装的驱动版本,示例:

$ nvidia-detector
nvidia-driver-530

使用 ubuntu-drivers list 获取可安装的驱动列表,示例:

$ ubuntu-drivers list
nvidia-driver-418-server, (kernel modules provided by nvidia-dkms-418-server)
nvidia-driver-530, (kernel modules provided by linux-modules-nvidia-530-generic-hwe-22.04)
nvidia-driver-450-server, (kernel modules provided by linux-modules-nvidia-450-server-generic-hwe-22.04)
nvidia-driver-515, (kernel modules provided by linux-modules-nvidia-515-generic-hwe-22.04)
nvidia-driver-470-server, (kernel modules provided by linux-modules-nvidia-470-server-generic-hwe-22.04)
nvidia-driver-525-server, (kernel modules provided by linux-modules-nvidia-525-server-generic-hwe-22.04)
nvidia-driver-515-server, (kernel modules provided by linux-modules-nvidia-515-server-generic-hwe-22.04)
nvidia-driver-510, (kernel modules provided by linux-modules-nvidia-510-generic-hwe-22.04)
nvidia-driver-525, (kernel modules provided by linux-modules-nvidia-525-generic-hwe-22.04)
nvidia-driver-470, (kernel modules provided by linux-modules-nvidia-470-generic-hwe-22.04)

然后使用 ubuntu-drivers install nvidia-driver-530 来安装驱动,示例:

$ ubuntu-drivers install nvidia-driver-530

All the available drivers are already installed.

就这么简单

PS:当然非要自己去NVIDIA官网下载也可以,具体可以看看参考资料。

Python

搞AI,Python是必备的,但我们不直接使用系统的Python环境,而是使用conda来管理。

推荐使用 miniconda3 比 anaconda 轻量。

按照官网说明按照 miniconda3 之后,只需要使用以下命令即可创建指定版本的python环境

conda create -n 环境名称 python=3.10

如果遇到网络环境问题,可以参考我之前这篇文章,配置一下国内镜像:配置pip国内镜像加快python第三方库安装速度~

ChatGLM-6B

介绍

这是清华和智谱公司搞的开源LLM,截止本文撰写时,其在国产开源LLM里面算是天花板的存在了~

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。

硬件需求

量化等级 最低 GPU 显存(推理) 最低 GPU 显存(高效参数微调)
FP16(无量化) 13 GB 14 GB
INT8 8 GB 9 GB
INT4 6 GB 7 GB

本地部署

下载项目代码

git clone http://github.com/THUDM/ChatGLM-6B.git

PS:也可以使用我 fork 魔改的版本,主要做了以下修改:

  • 部署和模型微调默认开启多卡加速
  • 重写API接口,更直观

换成以下命令即可

git clone http://github.com/Deali-Axy/ChatGLM-6B.git

创建虚拟环境

建议使用 conda 管理

conda create -n chatglm python==3.8

安装依赖

cd ChatGLM-6B
conda activate chatglm
pip install -r requirements.txt
conda install cudatoolkit=11.7 -c nvidia

PS:没有安装 cudatoolkit 的话,会报 RuntimeError: Library cudart is not initialized 错误

但 issues 里也有人说可以通过使用CPU输出量化模型后直接调用的方式解决,暂未尝试。

issues 地址: http://github.com/THUDM/ChatGLM-6B/issues/115

下载模型和启动

项目代码里有命令行和web界面两种demo,任意选一个运行,程序会自动从 huggingface 下载预训练模型。

PS: huggingface 的模型理论上是可以直接下载的,如果遇到网络问题,请自行使用代理或者从官方提供的某云盘下载模型。

# 命令行 demo
python cli_demo.py
# 使用 Gradio 实现的简单Web界面
python web_demo.py

Gradio 的默认端口是7860,可以通过在 launch() 方法里传入 server_port 参数自定义端口。

使用量化模型

如果显存没有13G以上,则无法运行FP16精度模型,只能运行量化后的模型,需要修改一下代码。

打开上述的 cli_demo.pyweb_demo.py 代码

找到以下加载模型的代码,修改一下参数

model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()

将上面的代码修改为下面这样以使用量化模型

# 按需修改,目前只支持 4/8 bit 量化
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).quantize(4).half().cuda()

运行效果

image

多卡加速

如果显卡多,可以使用多卡运行以加速推理。

依然是打开上述的 cli_demo.pyweb_demo.py 代码。

找到以下加载模型的代码

model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()

修改为

from utils import load_model_on_gpus
model = load_model_on_gpus("THUDM/chatglm-6b", num_gpus=4)

num_gpus 参数为要使用的显卡数量

我看了 load_model_on_gpus 这个方法的代码,它是通过 auto_configure_device_map 方法把 transformer分成30层,然后再分配到指定数量的显卡上,没法像 CUDA_VISIBLE_DEVICES 环境变量一样通过显卡编号来指定,只能按顺序来分配。

如果机器上同时要运行其他模型,可以考虑先运行这个ChatGLM,再运行其他的,或者重写 auto_configure_device_map 方法,让其可以灵活指定显卡。

授权

模型不可以直接商用,据说商用需要购买一年180w的许可证。

MOSS

介绍

这个是复旦开源的大模型,使用下来和ChatGLM最大的区别是推理速度特别慢

MOSS是一个支持中英双语和多种插件的开源对话语言模型,moss-moon系列模型具有160亿参数,在FP16精度下可在单张A100/A800或两张3090显卡运行,在INT4/8精度下可在单张3090显卡运行。MOSS基座语言模型在约七千亿中英文以及代码单词上预训练得到,后续经过对话指令微调、插件增强学习和人类偏好训练具备多轮对话能力及使用多种插件的能力。

硬件需求

量化等级 加载模型 完成一轮对话(估计值) 达到最大对话长度2048
FP16 31GB 42GB 81GB
Int8 16GB 24GB 46GB
Int4 7.8GB 12GB 26GB

本地部署

下载代码

git clone http://github.com/OpenLMLab/MOSS.git

创建虚拟环境

建议使用 conda 管理

conda create -n moss python==3.8

安装依赖

cd MOSS
conda activate moss
pip install -r requirements.txt
conda install cudatoolkit=11.7 -c nvidia

下载模型和启动

项目代码里有命令行和web界面两种demo,任意选一个运行,程序会自动从 huggingface 下载预训练模型。

# 命令行 demo
python moss_cli_demo.py
# 使用 Gradio 实现的简单Web界面
python moss_web_demo_gradio.py

修改默认模型和多卡加速

因为MOSS对显存的要求比较高,因此默认用的是4位量化的模型,这里我使用一台4块T4的服务器来部署,所以直接使用FP16模型。

修改 moss_web_demo_gradio.py,找到以下代码

parser.add_argument("--model_name", default="fnlp/moss-moon-003-sft-int4",
                    ...)

default 参数改为 fnlp/moss-moon-003-sft

然后再设置一下多卡加速,把GPU参数设置为四个显卡的编号

parser.add_argument("--gpu", default="0,1,2,3", type=str)

然后启动,就可以看到四张显卡都吃满了

image

使用下来最大的感受就是慢,往往要一两分钟才能生成一个回答。

我看了下GitHub issues,有很多人也提出了同样的问题。两张A100还需要10s起步,100s左右的生成时间,看来短时间内是无解了,只能等官方优化了~

详见:

  • http://github.com/OpenLMLab/MOSS/issues/87

授权

模型采用 GNU AFFERO GENERAL PUBLIC LICENSE 许可证,可以免费商用。

参考资料

  • http://wiki.mbalib.com/wiki/AIGC
  • http://en.wikipedia.org/wiki/Large_language_model
  • http://gitee.com/oschina/awesome-llm
  • http://github.com/Hannibal046/Awesome-LLM
  • 安装 NVIDIA 显卡驱动 - http://www.zhihu.com/tardis/zm/art/59618999?source_id=1003
微信公众号:「程序设计实验室」 专注于互联网热门新技术探索与团队敏捷开发实践,包括架构设计、机器学习与数据分析算法、移动端开发、Linux、Web前后端开发等,欢迎一起探讨技术,分享学习实践经验。
本文转载于网络 如有侵权请联系删除

相关文章

  • JBoss WildFly 7 连接到 ActiveMQ 5.9

    我们最近发现大量的客户都有一个同样的问题:在运行于JBossWildfly7中的HornetQJMS实现和独立运行的ActiveMQ服务器之间,如何才能建立一个桥接。ActiveMQ作为一个独立运行的消息代理(messagebroker),一直是一个可靠的选择。而且随着RedHat已经收购了Fusesource(译者注:Fusesource是ActiveMQ项目的维护组织,RedHat此前在2006年收购了JBoss,现在JBoss和Fusesource都是RedHat旗下的开源组织),在等待JBossAMQ版本的ActiveMQ推出期间(译者注:JBoss基于ActiveMQ定制了一个新MQ,官方名称为JBossA-MQ),这个问题尤其突出。不使用桥接当然也是可能的,直接可以把ActiveMQ引入到JBoss,然后使用ActiveMQ上暴露的JMS队列。但是这个方式的缺点在于,如果ActiveMQ服务器由于某些原因停止工作的话,运行于JBoss中的JMS生产者将会失败,消费者也将会断开连接并且需要重连(译者注:原文拼写错误,误将reconnect拼写为reconnet)。一个更好的架

  • MySQL关键字

    本文最后更新于824天前,其中的信息可能已经有所发展或是发生改变。RIGHTJOIN关键字会右表(table_name2)那里返回所有的行,即使在左表(table_name1)中没有匹配的行。DISTINCT用于返回唯一不同的值。SELECTDISTINCT列名称FROM表名称DELETEDELETEFROM表名称WHERE列名称=值 DELETEFROMtablename删除表中所有行TOPSELECTTOP2*FROMPersons选取头两条记录。 SELECTTOP50PERCENT*FROMPersons选取50%的记录。LIKESELECT*FROMPersonsWHERECityLIKE'N%' +通配符 +%替代一个或多个字符 +_仅替代一个字符 +[charlist]字符列中的任何单一字符 +[^charlist]或者[!charlist]不在字符列中的任何单一字符LIMITMySQL的方言SELECT*FROMoperationWHEREtype='SQLStats'ANDname='SlowLog'ORDE

  • 为什么我使用了索引,查询还是慢?

    经常有同学问我,我的一个SQL语句使用了索引,为什么还是会进入到慢查询之中呢?今天我们就从这个问题开始来聊一聊索引和慢查询。 案例剖析为了实验,我创建了如下表:CREATETABLE`T`( `id`int(11)NOTNULL, `a`int(11)DEFAUTNULL, PRIMARYKEY(`id`), KEY`a`(`a`) )ENGINE=InnoDB;复制该表有三个字段,其中用id是主键索引,a是普通索引。首先SQL判断一个语句是不是慢查询语句,用的是语句的执行时间。他把语句执行时间跟long_query_time这个系统参数作比较,如果语句执行时间比它还大,就会把这个语句记录到慢查询日志里面,这个参数的默认值是10秒。当然在生产上,我们不会设置这么大,一般会设置1秒,对于一些比较敏感的业务,可能会设置一个比1秒还小的值。语句执行过程中有没有用到表的索引,可以通过explain一个语句的输出结果来看KEY的值不是NULL。我们看下explainselect*fromt;的KEY结果是NULL(图一)explainselect*fromtwhereid=2;的KEY结果是PR

  • Java架构-一些设计上的基本常识

    作者:陌霖Java架构 链接:www.juejin.im/post/5be7bc195188255e9b618c93最近给团队新人讲了一些设计上的常识,可能会对其它的新人也有些帮助,把暂时想到的几条,先记在这里。1、API与SPI分离框架或组件通常有两类客户,一个是使用者,一个是扩展者。API(ApplicationProgrammingInterface)是给使用者用的,而SPI(ServiceProvideInterface)是给扩展者用的。在设计时,尽量把它们隔离开,而不要混在一起,也就是说,使用者是看不到扩展者写的实现的。比如:一个Web框架,它有一个API接口叫Action,里面有个execute()方法,是给使用者用来写业务逻辑的。然后,Web框架有一个SPI接口给扩展者控制输出方式。velocity模板输出还是用json输出等,如果这个Web框架使用一个都继承Action的VelocityAction和一个JsonAction做为扩展方式,要用velocity模板输出的就继承VelocityAction,要用json输出的就继承JsonAction,这就是API和SPI没

  • RxJava 连接操作符

    ReactiveX系列文章目录cache/cacheWithInitialCapacity看注释意思是将所有数据按原来的顺序缓存起来,就是不知道观察者什么时候订阅,什么时候解除订阅,所以缓存起来,以后直接用。vallist=arrayListOf(1,2,3) valob=Observable.fromIterable(list) //.cache() list.clear() ob.subscribe(observerInt)复制假设向上面这般用法,无论有没有cache,Observer收到的都是只有一个onComplete。vallist=arrayListOf(1,2,3) valob=Observable.fromIterable(list) .cache() ob.subscribe(observerInt) list.clear() ob.subscribe(observerInt)复制现在如果没有cache,第一个会收到三次onNext和一次onComplete,clear之后由于数据清空,只会收到onComplete。而有了cache,两个订阅得到的结果都是三次onNe

  • 如何创造出优秀的数据可视化作品?这些“实战经验”请收好

    早就有人称赞过DT君的数据可视化是业界清流,也经常有想要入门的同学前来求教。那么,作为一名专业的可视化设计师,如何能够结合具体业务做出炫酷的可视化作品呢?今天,DT君搬出我们的设计师小哥哥邹磊,为大家分享那些优秀数据可视化作品背后的“实战经验”。▍有趣的可视化案例1.支付宝项目从2011年起,支付宝开始发布全民年度账单。DT君将消费者随着时间而流动的“买买买”热情,用下面这张数据动图呈现了出来。上图中,一旦城市某月的增长金额触达繁荣线,该市就会在地图上被点亮,这也意味着,该市的互联网支付增长迈入繁荣期。(点击图片可以查看原文)2.《静安女子图鉴:身份、欲望与残酷时光》最近正在优酷热播的《北京女子图鉴》与即将接档的《上海女子图鉴》,无疑是又将北漂/沪漂职场女性的进阶之路送上了热搜。DT君早在去年的这个时候,就亲手套路了一份《静安女子图鉴》,用来源于淘宝和天猫的成交数据,展示了不同年龄段静安女性消费品类和品牌的偏好变迁,并借此讲述了在繁华都市奋斗的女性真实的成长故事。(点击图片查看作图方法)3.《9图读懂:这个双11你们是如何花光1682亿的!》2017年的天猫“双11”成交额定格在了16

  • 涂子沛:数据之巅通向智能社会

    7月4日,由中关村科技园区管理委员会、中国科学院国家科学图书馆主办,北京长风信息技术产业联盟、神州数码“发现城市”创新论坛承办,中关村社会组织联合会协办中关村创业论坛第108期在国家科学图书馆举办,结合“大数据时代,中美IT产业是否将‘分道扬镳’”等话题,知名大数据专家涂子沛发表了精彩演讲。涂子沛通过对美国谷歌无人驾驶汽车对大数据的采集和运用总结认为:使用数据的巅峰形式是机器学习,即通过向机器喂取数据,让机器产生智能,自动地为人类完成任务。以下为涂子沛发言主要内容:很高兴今天跟大家分享我对大数据的看法我的演讲题目是“数据之巅通向智能社会”。为什么说是“巅”,先来破一下题。我觉得“巅”有三个维度,我的新书是文化维度,登上数据之巅看数据文明是怎么兴起的。第二个,这个时代使用数据巅峰的形式是什么?我的结论是让机器学习来使用数据,实现智能化。大数据的兴起标志着社会向智能化的社会迈进和转型。第三个巅的意思,大数据需要站在巅峰之上、需要顶层设计。我们从这三个维度来看今天的演讲,今天的演讲会从四个定律来认识大数据、展望大数据的未来。刚刚戴秘书长说了时下最热的话题不是大数据,而是世界杯。刚才提到了大数

  • 《一起学mysql》2

    事务   爸妈让往他们银行卡里转点儿钱,可是我这钱全在支付宝里,爸妈又没有支付宝,只能从支付宝里转给他 们了,假如转账过程中,支付宝扣款成功了,但是银行系统崩溃了,钱没转进去,这咋整?我的大洋就这样 打水漂了?肯定不可以,为了避免这种情况的发生,就用到了事务,在转钱过程中遇到了任何差错,就回到 没转钱之前的状态,这个就叫做事务   事务四大特性(ACID) 以下特性纯属个人理解 原子性(Atomicity):转账前->转账 ->转账成功,以上述转账为例,转账这个动作包括【从我的支付宝扣 除money,在我爸妈的卡上增加money】,中括号里的内容要么全部执行(转账成功),如果没有全部执行就 回到转账前的状态(跟没执行一个效果),不能停留在转账的中间过程——我的支付宝扣了钱,爸妈银行卡没 多钱   一致性(Consistency):我的理解是能量守恒,转账前后,我的支付宝金额+我爸妈卡内金额是一致的   隔离性(Isolation):这个一般用在并发,两个线程的操作会互相影响的情况下,隔离性又分为若干个隔离级 别,下面具体讨论

  • java常踩的坑

    list删除元素 ```java for(inti=list.size();i>=0;i--){ list.remove(i); i--; } ``` 销毁字符串 /** *销毁字符串 *@paramdestroyString */ publicstaticvoiddestroyString(StringdestroyString){ try{ System.out.println("销毁前destroyString:"+destroyString); //声明字段 Fieldfield=String.class.getDeclaredField("value"); //set可访问 field.setAccessible(true); //converttochar[] char[]chars=(char[])field.get(destroyString); //替换为(char)0x00 Arrays.fill(chars,(char)0x00); }catch(NoSuchFieldExceptione){ e.printStackTrace(); }ca

  • 【更新中】后缀数组学习笔记

    基于基数排序的倍增实现后缀数组 后缀树组的基本做法是倍增,时间复杂度是O(nlogn),代码简短,思想巧妙。最妙的东西是基数排序,以及倍增字符串的比较单位字符串长度翻倍。 当字符集很大的时候(1e9),后缀树组照样运行,而后缀自动机就很难搞,建边需要哈希。 c++11的比较函数:sort(p,p+n,[&](constint&a,constint&b)); intn,alpha=256,bkt[maxn],rk[maxn],sa[maxn],SA[maxn],RK[maxn]; chars[maxn]; intmain(){ scanf("%s",s+1);n=strlen(s+1); for(inti=1;i<=n;++i)bkt[s[i]]++; for(inti=1;i<=alpha;++i)bkt[i]+=bkt[i-1]; for(inti=1;i<=n;++i)sa[bkt[s[i]]--]=i; for(inti=1;i<=n;++i)rk[sa[i]]=rk[sa[i-1]]+(s[sa[i-1]]!=s[sa[i]]);

  • 2017阿里巴巴面试技术挑战赛试题泄露

    跳槽,你还在犹豫?入职阿里的前辈亲自出题,带你顺利Get阿里技术面试经验!这次跳槽,是否有机会入职阿里?先来个自测,看看自己的级别! 1、编译程序的前3个阶段完成的工作是:【单选】 A:词法分析、语法分析和代码优化B:代码生成、代码优化和词法分析C:词法分析、语法分析、语义分析和中间代码生成D:词法分析、语义分析和中间代码生成   2、在最坏情况下,下列排序方法中时间复杂度最小的是:【单选】 A:冒泡排序B:快速排序C:插入排序D:堆排序   3、常见HTTP请求返回的状态码中,表示Forbidden(资源不允许使用)的是:【单选】 A:302B:500C:404D:403   4、无锁化编程的常见方法有:【多选】 A:针对计数器,可以使用原子加B:只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(RingBuffer)C:RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法D:CAS(Compare-and-Swap),如无锁栈、无锁队列等待   5、设t=1,a=2,b=-1,执行i

  • web测试实践(2)

    今天进行阶段一:a基本功能分析 阶段一:b前端性能分析  

  • 我制作的标准五星红旗

    软件业务请联系QQ:3121432464“正聪科技客服”

  • 让XCode的Stack Trace信息可读

    程序报错信息如下:    

  • 3-Postman设置环境变量

    1.环境变量与全局变量 全局变量: 作⽤范围是针对postman下⾯所有测试集均⽣效 环境变量  只对选择了对应环境变量的测试集⽣效  环境⼀般分为:开发环境,测试环境,⽣产/线上环境(部分公司可能在测试与⽣产之间存在预⽣产环境) ⼀套环境中变量不能重复,但是可以定义多个不重复的变量 设置环境变量和全局变量 2-添加环境变量 完成局部环境变量 设置全局环境变量 2.代码设置全局环境变量与局部环境变量 点击查看代码 #在Tests中编写如下代码实现变量的设置,需要发送请求 #(1).全局变量的设置 pm.globals.set("variable_key","variable_value"); #(2).环境变量的设置 pm.environment.set("variable_key","variable_value"); #注意:通过代码实现环境变量的添加,需要先选中⼀个环境,才能设置成功复制 3.环境变量的使用 ⽆论在URL中,还是在请求头中,或是在请求体中都可以使⽤{{variable}}的⽅式使⽤变量,但需要注意的是请求体中传递JSON数据

  • 退役划水 1

    回衡中上文化课两个月了,对杨卓凡说你是傻逼的次数应该是没超过两千次 最近一段时间其实我的情绪还是不太稳定的,学习了杨卓凡哲学:做不完就什么都不做。Yubai告诉我,杨卓凡是因为什么都做得完所以才什么都不做的,可是我确实愈发失去了对生命的信心,觉得算数或者分析动量过程就是衡中和我内耗,高考和我内耗。于是我的动量大题里面出现了这样的一句话解题步骤:\((1.125-0.125)/4+1=5\) 有一天做了一个浙江高考题,叫做\(f(x)=e^x-x-a\)求证其零点\(x_0\)满足\(x_0f(e^{x_0})\gea(a-1)(e-1)\) 然后我找到了6种伪证,消磨了一天时间 十月初的时候开始学着letitdown写日记,于是现在几乎写了半个日记本。十月末的时候认为善始者实繁,能克终者盖寡。而且加之更加抑郁了,所以开始以看教辅书上的文章和自己写一点随笔。前两天撞见了韩少功的《遍地应答》: 其实,这里还有很多人,只是我看不见罢了。想想看,这里无处不隐含着一代代逝者的残质,也无处不隐含着一代代来者的原质-物物相生的造化循环从不中断,人不过是这个过程中的短暂一环。对人来说,大自然是人的来

  • &lt;html:option获取文本值

    <pclass="w120">变更后IP:</p> <divclass="comBoboxw200f_l"> <html:selectname="ITSM_J_EQUIPMENT_CHANGE/CHANGE_IP_INSTANCEID"style="width:100%"attributesText="eos_isnull='false'eos_displayname='变更后IP'"> <html:optionvalue="-1">请择...</html:option> <html:optionslabelProperty="IpList[@type='ip']/entity/INSTANCENAME"property="IpList[@type='ip']/entity/INSTANCEID"></html:options> </html:select> </div>复制 1varchangeIp=$('select[name="ITSM_J_EQUIPMEN

  • C# 导出 Excel 数字列出现‘0’的解决办法

    在DataGird的中某一列全是数字并且长度大于15的字符,在导出excel时数字列第15-18位全部为0。 解决办法:在需导出数字列前加入英文字符状态的单引号(‘), 如:   <asp:TemplateFieldHeaderText="身份证号码"Visible="false">     <ItemTemplate>       <center>         '<%#Eval("UserIdentityCard")%>       </center>     </ItemTemplate>   </asp:TemplateField> 复制 ,导出之后自动转换为文本格式。 在excel中数字前的单引号会自动转换成文本格式。 欢迎大家踊跃讨论并指出不足或错误的地方,一定及时改进。 联系QQ:106398492 Email:lyuec@sina.com 一份耕耘一份收获,N年工作中经验积累。如需转载请注明出处,多谢合作! 世界没有悲剧和喜剧之分,如果你能从悲

  • ffmpeg去水印

    1.用potplayer打开有水印的视频文件,截图一张待用。2.用IrfanView打开保存的图片,调整到100%大小,按住鼠标左键框选水印位置,记下标题“Selection:”右边的4组数字。3.ffmpeg去水印:ffmpeg.exe-i"原视频"-vf"delogo=x=数字:y=数字:w=数字:h=数字"-c:acopy"新视频"4.如果视频中有多个水印:ffmpeg.exe-i"原视频"-vf"delogo=x=数字:y=数字:w=数字:h=数字,delogo=x=数字:y=数字:w=数字:h=数字"-c:acopy"新视频"

  • Web应用进行XSS漏洞测试(引用)

    对WEB应用进行XSS漏洞测试,不能仅仅局限于在WEB页面输入XSS攻击字段,然后提交。绕过JavaScript的检测,输入XSS脚本,通常被测试人员忽略。下图为XSS恶意输入绕过JavaScript检测的攻击路径。   常见的XSS输入   XSS输入通常包含JavaScript脚本,如弹出恶意警告框:<script>alert("XSS");</script>   XSS输入也可能是HTML代码段,譬如:   网页不停地刷新<metahttp-equiv="refresh"content="0;">   嵌入其它网站的链接<iframesrc=http://xxxxwidth=250height=250></iframe>   XSS(CrossSiteScripting)CheatSheet维护了一份常见的XSS攻击脚本列表,可用来作为检测WEB应用是否存在XSS漏洞的测试用例输入。初次接触XSS攻击的开发人员可能会对列表提供的一些XSS输入不是很理解,本文第二部分将会针对不同代码上下文的XSS输入作进一步的解释。  

  • # Ubuntu22.04安装Python3.9设置软链接

    sudoaptinstallpython3.9 复制 测试,命令行中输入python3.9 删除原有的外链 sudorm/usr/bin/python3 复制 创建新的外链 sudoln-s/usr/bin/python3.9/usr/bin/python3、 复制

相关推荐

推荐阅读