最近一直在炼丹(搞AIGC这块),突然发现业务代码都索然无味了…
上次发了篇AI画图的文章,ChatGPT虽然没法自己部署,但现在开源的LLM还是不少的,只要有一块差不多的显卡,要搞个LLM本地部署还是没问题的。
本文将介绍这以下两个国产开源LLM的本地部署
本文先简单的把模型跑起来,后续将继续我近期在LLM方向的一些探索记录~
开始之前,先来看看一些基础概念。
引用以下 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画图,就都属于这个领域。
引用以下 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
服务器2
说完了硬件,再看看软件。
首先,需要显卡驱动,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官网下载也可以,具体可以看看参考资料。
搞AI,Python是必备的,但我们不直接使用系统的Python环境,而是使用conda来管理。
推荐使用 miniconda3 比 anaconda 轻量。
按照官网说明按照 miniconda3 之后,只需要使用以下命令即可创建指定版本的python环境
conda create -n 环境名称 python=3.10
如果遇到网络环境问题,可以参考我之前这篇文章,配置一下国内镜像:配置pip国内镜像加快python第三方库安装速度~
这是清华和智谱公司搞的开源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 魔改的版本,主要做了以下修改:
换成以下命令即可
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.py
或 web_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()
如果显卡多,可以使用多卡运行以加速推理。
依然是打开上述的 cli_demo.py
或 web_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的许可证。
这个是复旦开源的大模型,使用下来和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)
然后启动,就可以看到四张显卡都吃满了
使用下来最大的感受就是慢,往往要一两分钟才能生成一个回答。
我看了下GitHub issues,有很多人也提出了同样的问题。两张A100还需要10s起步,100s左右的生成时间,看来短时间内是无解了,只能等官方优化了~
详见:
模型采用 GNU AFFERO GENERAL PUBLIC LICENSE
许可证,可以免费商用。
我们最近发现大量的客户都有一个同样的问题:在运行于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)。一个更好的架
本文最后更新于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架构 链接: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没
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产业是否将‘分道扬镳’”等话题,知名大数据专家涂子沛发表了精彩演讲。涂子沛通过对美国谷歌无人驾驶汽车对大数据的采集和运用总结认为:使用数据的巅峰形式是机器学习,即通过向机器喂取数据,让机器产生智能,自动地为人类完成任务。以下为涂子沛发言主要内容:很高兴今天跟大家分享我对大数据的看法我的演讲题目是“数据之巅通向智能社会”。为什么说是“巅”,先来破一下题。我觉得“巅”有三个维度,我的新书是文化维度,登上数据之巅看数据文明是怎么兴起的。第二个,这个时代使用数据巅峰的形式是什么?我的结论是让机器学习来使用数据,实现智能化。大数据的兴起标志着社会向智能化的社会迈进和转型。第三个巅的意思,大数据需要站在巅峰之上、需要顶层设计。我们从这三个维度来看今天的演讲,今天的演讲会从四个定律来认识大数据、展望大数据的未来。刚刚戴秘书长说了时下最热的话题不是大数据,而是世界杯。刚才提到了大数
事务 爸妈让往他们银行卡里转点儿钱,可是我这钱全在支付宝里,爸妈又没有支付宝,只能从支付宝里转给他 们了,假如转账过程中,支付宝扣款成功了,但是银行系统崩溃了,钱没转进去,这咋整?我的大洋就这样 打水漂了?肯定不可以,为了避免这种情况的发生,就用到了事务,在转钱过程中遇到了任何差错,就回到 没转钱之前的状态,这个就叫做事务 事务四大特性(ACID) 以下特性纯属个人理解 原子性(Atomicity):转账前->转账 ->转账成功,以上述转账为例,转账这个动作包括【从我的支付宝扣 除money,在我爸妈的卡上增加money】,中括号里的内容要么全部执行(转账成功),如果没有全部执行就 回到转账前的状态(跟没执行一个效果),不能停留在转账的中间过程——我的支付宝扣了钱,爸妈银行卡没 多钱 一致性(Consistency):我的理解是能量守恒,转账前后,我的支付宝金额+我爸妈卡内金额是一致的 隔离性(Isolation):这个一般用在并发,两个线程的操作会互相影响的情况下,隔离性又分为若干个隔离级 别,下面具体讨论
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]]);
跳槽,你还在犹豫?入职阿里的前辈亲自出题,带你顺利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
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数据
回衡中上文化课两个月了,对杨卓凡说你是傻逼的次数应该是没超过两千次 最近一段时间其实我的情绪还是不太稳定的,学习了杨卓凡哲学:做不完就什么都不做。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写日记,于是现在几乎写了半个日记本。十月末的时候认为善始者实繁,能克终者盖寡。而且加之更加抑郁了,所以开始以看教辅书上的文章和自己写一点随笔。前两天撞见了韩少功的《遍地应答》: 其实,这里还有很多人,只是我看不见罢了。想想看,这里无处不隐含着一代代逝者的残质,也无处不隐含着一代代来者的原质-物物相生的造化循环从不中断,人不过是这个过程中的短暂一环。对人来说,大自然是人的来
<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
在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年工作中经验积累。如需转载请注明出处,多谢合作! 世界没有悲剧和喜剧之分,如果你能从悲
对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输入作进一步的解释。