Alpaca模型是斯坦福大学研发的LLM(Large Language Model,大语言)开源模型,是一个在52K指令上从LLaMA 7B(Meta公司开源的7B)模型微调而来,具有70亿的模型参数(模型参数越大,模型的推理能力越强,当然随之训练模型的成本也就越高)。
LoRA,英文全称Low-Rank Adaptation of Large Language Models,直译为大语言模型的低阶适应,这是微软的研究人员为了解决大语言模型微调而开发的一项技术。如果想让一个预训练大语言模型能够执行特定领域内的任务,一般需要做fine-tuning,但是目前推理效果好的大语言模型参数维度非常非常大,有些甚至是上千亿维,如果直接在大语言模型上做fine-tuning,计算量会非常的大,成本也会非常的高。
’LoRA的做法是冻结预训练好的模型参数,然后在每个Transformer块里注入可训练的层,由于不需要对模型的参数重新计算梯度,所以,会大大的减少计算量。
具体如下图所示,核心思想是在原始预训练模型增加一个旁路,做一个降维再升维的操作。训练的时候固定预训练模型的参数,只训练降维矩阵 A 与升维矩阵 B。而模型的输入输出维度不变,输出时将 BA 与预训练语言模型的参数叠加。
用随机高斯分布初始化 A,用 0 矩阵初始化 B。这样能保证训练时,新增的旁路BA=0,从而对模型结果没有影响。在推理时,将左右两部分的结果加到一起,即h=Wx+BAx=(W+BA)x,所以,只要将训练完成的矩阵乘积BA跟原本的权重矩阵W加到一起作为新权重参数替换原始预训练语言模型的W即可,不会增加额外的计算资源。LoRA 的最大优势是训练速度更快,使用的内存更少。
本文进行本地化部署实践的Alpaca-lora模型就是Alpaca模型的低阶适配版本。本文将对Alpaca-lora模型本地化部署、微调和推理过程进行实践并描述相关步骤。
本文进行部署的GPU服务器具有4块独立的GPU,型号是P40,单个P40算力相当于60个同等主频CPU的算力。(也可以考虑使用京东云GPU的P40,
jdcloud.com/cn/calculator/calHost))
拿到GPU服务器我们首先就是安装显卡驱动和CUDA驱动(是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题)。显卡驱动需要到NVIDIA的官方网站去查找相应的显卡型号和适配的CUDA版本,下载地址:
http://www.nvidia.com/Download/index.aspx ,选择相应的显卡和CUDA版本就可以下载驱动文件啦。
我下载的文件是NVIDIA-Linux-x86_64-515.105.01.run,这是一个可执行文件,用root权限执行即可,注意安装驱动过程中不能有运行的nvidia进程,如果有需要全部kill掉,否则会安装失败,如下图所示:
然后一路next,没有报错的话就安装成功啦。为了后续查看显卡资源情况,最好还是再安装一个显卡监控工具,比如nvitop,用pip install nvitop即可,这里注意,由于不同服务器python版本有差异,最好安装anaconda部署自己的私有python空间,防止运行时报各种奇怪的错误,具体步骤如下:
1.安装anaconda 下载方式:wget
http://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh。 安装命令: shAnaconda3-5.3.0-Linux-x86_64.sh 每个安装步骤都输入“yes”,最后conda init后完成安装,这样每次进入安装用户的session,都会直接进入自己的python环境。如果安装最后一步选择no,即不进行conda init,则后续可以通过source/home/jd_ad_sfxn/anaconda3/bin/activate来进入到私有的python环境。
2.安装setuptools 接下来需要安装打包和分发工具setuptools,下载地址:wget
http://files.pythonhosted.org/packages/26/e5/9897eee1100b166a61f91b68528cb692e8887300d9cbdaa1a349f6304b79/setuptools-40.5.0.zip 安装命令: unzip setuptools-40.5.0.zip cd setuptools-40.5.0/ python setup.py install
3.安装pip 下载地址:wget
http://files.pythonhosted.org/packages/45/ae/8a0ad77defb7cc903f09e551d88b443304a9bd6e6f124e75c0fbbf6de8f7/pip-18.1.tar.gz 安装命令: tar -xzf pip-18.1.tar.gz cd pip-18.1 python setup.py install
至此,漫长的安装过程终于告一段落了,我们现在创建一个私有的python空间,执行
conda create -n alpaca python=3.9
conda activate alpaca
然后验证一下,如下图所示说明已经创建成功啦。
上文已经把GPU服务器的基础环境安装好了,下面我们就要开始激动人心的模型训练了(激动ing),在训练之前我们首先需要下载模型文件,下载地址:
http://github.com/tloen/alpaca-lora ,整个模型都是开源的,真好!首先把模型文件下载到本地,执行git clonehttp://github.com/tloen/alpaca-lora.git .。
本地会有文件夹alpaca-lora,然后cd alpaca-lora到文件夹内部执行
pip install -r requirements.txt
这个过程可能会比较慢,需要从网上下载大量的依赖包,过程中可能也会报各种包冲突,依赖没有等问题,这块只能见招拆招,缺什么装什么(解决包依赖和版本冲突确实是个头疼的事情,不过这步做不好,模型也跑不起来,所以只能耐心的一点一点解决),这里痛苦的过程就不赘述了,因为不同机器可能遇到的问题也不太一样,参考意义不是很大。
如果安装过程执行完成,并没再有报错信息,并提示Successful compeleted,那么恭喜你啦,万里长征已经走完一半啦,你已经离成功很近了,再坚持一下下就很有可能成功啦:)。
由于我们的目标是对模型进行fine-tuning,所以我们得有一个fine-tuning的目标,由于原始模型对中文支持并不好,所以我们的目标就有了,用中文语料库让模型更好的支持中文,这个社区也给我准备好了,我们直接下载中文的语料库就好了,在本地执行 wget
http://github.com/LC1332/Chinese-alpaca-lora/blob/main/data/trans_chinese_alpaca_data.json?raw=true ,将后面模型训练用到的语料库下载到alpaca-lora根目录下(后面方便使用)。
语料库的内容就是很多的三元组(instruction,input,output,如下图所示),instruction就是指令,让模型做什么事,input就是输入,output是模型的输出,根据指令和输入,训练模型应该输出什么信息,让模型能够更好的适应中文。
好的,到现在为止,万里长征已经走完2/3了,别着急训练模型,我们现在验证一下GPU环境和CUDA版本信息,还记得之前我们安装的nvitop嘛,现在就用上了,在本地直接执行nvitop,我们就可以看到GPU环境和CUDA版本信息了,如下图:
在这里我们能够看到有几块显卡,驱动版本和CUDA版本等信息,当然最重要的我们还能看到GPU资源的实时使用情况。
怎么还没到模型训练呢,别着急呀,这就来啦。
我们先到根目录下然后执行训练模型命令:
如果是单个GPU,那么执行命令即可:
python finetune.py \
--base_model 'decapoda-research/llama-7b-hf' \
--data_path 'trans_chinese_alpaca_data.json' \
--output_dir './lora-alpaca-zh'
如果是多个GPU,则执行:
WORLD_SIZE=2 CUDA_VISIBLE_DEVICES=0,1 torchrun \
--nproc_per_node=2 \
--master_port=1234 \
finetune.py \
--base_model 'decapoda-research/llama-7b-hf' \
--data_path 'trans_chinese_alpaca_data.json' \
--output_dir './lora-alpaca-zh'
如果可以看到进度条在走,说明模型已经启动成功啦。
在模型训练过程中,每迭代一定数量的数据就会打印相关的信息,会输出损失率,学习率和代信息,如上图所示,当loss波动较小时,模型就会收敛,最终训练完成。
我用的是2块GPU显卡进行训练,总共训练了1904分钟,也就是31.73个小时,模型就收敛了,模型训练是个漫长的过程,所以在训练的时候我们可以适当的放松一下,做点其他的事情:)。
模型训练好后,我们就可以测试一下模型的训练效果了,由于我们是多个GPU显卡,所以想把模型参数加载到多个GPU上,这样会使模型推理的更快,需要修改
generate.py 文件,添加下面这样即可。
然后我们把服务启起来,看看效果,根目录执行:
python generate.py --base_model "decapoda-research/llama-7b-hf" \
--lora_weights './lora-alpaca-zh' \
--load_8bit
其中./lora-alpaca-zh目录下的文件,就是我们刚刚fine tuning模型训练的参数所在位置,启动服务的时候把它加载到内存(这个内存指的是GPU内存)里面。
如果成功,那么最终会输出相应的IP和Port信息,如下图所示:
我们可以用浏览器访问一下看看,如果能看到页面,就说明服务已经启动成功啦。
激动ing,费了九牛二虎之力,终于成功啦!!
因为我们目标是让模型说中文,所以我们测试一下对中文的理解,看看效果怎么样?
简单的问题,还是能给出答案的,但是针对稍微复杂一点的问题,虽然能够理解中文,但是并没有用中文进行回答,训练后的模型还是不太稳定啊。
在推理的时候我们也可以监控一下GPU的变化,可以看到GPU负载是比较高的,说明GPU在进行大量的计算来完成推理。
1.效果问题:由于语料库不够丰富,所以目前用社区提供的语料库训练的效果并不是很好,对中文的理解力有限,如果想训练出能够执行特定领域的任务,则需要大量的语料支持,同时训练时间也会更长;
2. 推理时间问题:由于目前部署的GPU服务器有4块GPU,能够执行的有3块,基于3块GPU,在推理的时候还是比较吃力的,执行一次交互需要大概30s-1min,如果达到chatGPT那样实时返回,则需要大量的算力进行支持,可以反推,chatGPT后台肯定是有大集群算力支持的,所以如果想做成服务,成本投入是需要考量的一个问题;
3. 中文乱码问题:在input为中文的时候,有时候返回结果会乱码,怀疑跟切词有关,由于中文的编码问题,中文不像英文以空格区分,所以可能会有一定的乱码情况产生,调用open AI 的API也会有这种情况,后面看看社区是否有相应解决办法;
4. 模型选择问题:由于目前GPT社区比较活跃,模型的产生和变化也是日新月异,由于时间仓促,目前只调研了alpaca-lora模型的本地化部署,后面针对实际落地的应用应该也会有更好的更低成本的落地方案,需要持续跟进社区的发展,选择合适的开源方案。
京东云P40型号GPU的【ChatGLM语言模型】实践篇详见
http://my.oschina.net/u/4090830/blog/8695561
作者:Beyond_luo
内容来源:京东云开发者社区
大家好,又见面了,我是你们的朋友全栈君。1、Java对象和类Java作为一种面向对象的语言,支持以下基本概念:多态、继承、封装、抽象、类、对象 实例、方法、重载。对象:对象是类的一个实例,有状态和行为。 类:类是一个模板,它描述一类对象的行为和状态。1.1创建对象对象是根据类创建的,在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步: (1)声明:声明一个对象,包括对象名称和对象类型。 (2)实例化:使用关键字new来创建一个对象。 (3)初始化:使用new创建对象时,会调用构造方法初始化对象。1.2构造方法每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。 在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。 下面是一个构造方法示例:publicclassPuppy{ publicPuppy(Stringname){ //这个构造器仅有一个参数:name System.out.println("小狗的名字是:"+name); } publicstat
简介该篇文章对MySQL中的日志进行总结与简单介绍,不会涉及的太深。主要的目的是为了对MySQL中的日志文件有一个体系化的了解。后面会对每一种日志文件做具体的分析与总结。日志分类MySQL中的日志文件,配置文件、错误日志文件、二进制文件(binarylog)、慢查询日志(slow-query-log)、全量日志(generalog)、审计日志(auditlog)、数据库文件&数据表文件、存储引擎文件、中继日志(relaylog)、进程文件(PID)和Socket文件。Snipaste_2021-04-20_16-55-53参数文件参数文件就是MySQL中的配置文件,在Linux下的my.cnf文件、Windows下的my.ini文件。文件内容主要分为server和client两个模块。server模块配置的是有关MySQL的服务信息,例如慢查询日志。client模块配置的是有关MySQL客户端连接信息,例如客户端连接的端口号。文件格式大致如下:[client] port=3306 default-character-set=utf8mb4 [mysqld] user=mysq
本文关键字:在tinycolinux上源码安装odoo8,动态模式python+uswgi+nginx,精简安装odoo8模块在前面《发布基于openerp的erpcmsone》时,我们谈到openerp其实是一种后端erp前端CMS的东西,其网站模块部分是通用cms网站选型的技术楷模,有可视化拖拉建站支持,且可集成后端erp部分(在线聊天啊,联系表单,购物车模块,etc..),当然,谈到cms,不是说它就是前端,它反而正是属于odoo后端支持部分的,只不过其展示部分是前端技术:什么是CMS呢?所谓CMS,隐藏在内容管理系统(CMS)之后的基本思想是分离内容的管理和设计。页面设计存储在模板里,而内容存储在数据库或独立的文件中。当一个用户请求页面时,各部分联合生成一个标准的HTML(标准通用标记语言下的一个应用)页面。对于一个CMS,其后台admin系统就代表了它的技术全部(负责内容模型表示和前端展示)。所以我们这里说到前端就是指其生成到html的后台模块支持部分等等---这跟不生成前台静态页面的前台纯动态交互网站需求不一样后者不需要html化。-----在前面《发布mineportal
10-6.改进的open()。为内建的open()函数创建一个封装。使得成功打开文件后,返回文件句柄:若打开失败则返回给调用者None,而不是生成一个异常。这样你打开文件就不需要额外的异常处理语句。1defopenfile(file): 2try: 3f=open(file) 4exceptIOError: 5returnNone 6returnfile 7 8if__name__=='__main__': 9filename=input('Filename:') 10print(openfile(filename))复制 10–8.改进的raw_input()。本章的开头,我们给出了一个”安全”的float()函数,它建立在内建函数float()上,可以检测并处理float()可能会引发的两种不同异常。同样,raw_input()函数也可能会生成两种异常,EOFError(文件末尾EOF,在Unix下是由于按下了Ctrl+D在Dos下是因为Ctrl+Z)或是KeyboardInterrupt(取消输入,一般是由于按下了Ctrl+C)。请创建一个
DeepRL每日论文快报来源自:arxiv.com 编辑:DeepRL时间:2019-12-3LearningRepresentationsinReinforcementLearning:AnInformationBottleneckApproacharxiv链接:https://arxiv.org/pdf/1911.05695.pdfLearningtoCommunicateinMulti-AgentReinforcementLearning:AReviewarxiv链接:https://arxiv.org/pdf/1911.05438.pdfAcceleratingTraininginPommermanwithImitationandReinforcementLearningarxiv链接:https://arxiv.org/pdf/1911.04947.pdfGitHub每日同步更新(欢迎star)https://github.com/NeuronDance/DeepRL/tree/master/DRL-PaperDailyGitHub仓库https://github.com/N
演讲嘉宾李凯周,天津大学计算机科学与技术专业硕士。现担任中科视拓研发部产品总监兼研发总监,负责研发算法部署、SDK化和数据分析管理工作,主导SeetaFace2的算法发布。回顾正文大家好,简单介绍一下,我是李凯周,现担任中科视拓研发部产品总监兼研发总监,负责研发算法部署、SDK化和数据分析管理工作,现在开始我们今天的分享。今天跟大家分享的题目是人脸识别应用实战:SeetaFace2,就是以SeetaFace2为例简述人脸识别技术如何从算法到应用在工业上的人脸识别系统。首先介绍SeetaFace2的主要内容,然后介绍SeetaFace2检测、定位、识别的核心接口,使用这些核心接口进行典型应用的举例,包括:跟踪、质量评估、人证对比、动态识别,之后再深入地挖掘SeetaFace2的源码,给大家呈现把AI的算法包装成SDK的系统应该经过哪些步骤,最后是求职分享,包括我对AI工程师的认识以及作为AI工程师的基本要求。下面简要说明一下SeetaFace2包含的核心接口以及接口的含义,要做人脸识别首先要把图片或者图片序列中的人脸找出来,所以第一个模块就是人脸检测模块,人脸检测模块是C++库,最重要就
最近计划重新巩固一下iOS开发的底层知识。面对当下环境,作为一名合格的开发者,只注重工具的使用是行不通的,修炼好底层系统知识的内功才是硬道理 该文章目录:一、什么是runtime? 二、runtime版本 三、与runtime的三种交互方式 四、消息机制的基本原理与执行流程 五、动态解析与消息转发一、什么是runtime?都说Objective-C是一门动态语言。首先,动态与静态语言最大的区别,就是动态语言将数据类型的检查等决策尽可能地从程序编译时推迟到了运行时。只要有可能,runtime就会动态地完成任务。这意味着Objective-C语言不仅需要编译器,还需要runtime来执行编译代码。 runtime是一套用C语言提供的API,Objective-C代码最终都会被编译器转化为运行时代码,通过消息机制决定了不同函数调用或转发方式,因此runtime成为了Objective-C作为动态语言使用的基础。二、runtime版本runtime目前共有两个版本,Legacy与Modern版本,与之相对应的编程接口分别是Objective-C1.0与2.0。Legacy版本主要用于32位的M
2018年10月14日至18日,分析师在GartnerSymposium/ITxpo2018大会探讨了在2019年企业与组织需要探索的十大战略技术趋势(GartnerTop10StrategicTechnologyTrends2019)。Gartner将战略性技术趋势定义为具有巨大破坏性潜力的战略技术趋势,该战略已开始从新兴的突破,进一步发展成为具有更广泛影响的应用——或者是快速增长的趋势,其高度波动性在未来五年内达到临界点。“未来将以智能设备为特色,在各地提供越来越有洞察力的数字服务,我们称之为智能数字网格。”Gartner副总裁兼研究员DavidCearley表示:“智能数字网格在过去两年中一直是焦点之一,并且一直是2019年的主要推动力。这三个主题下的趋势是推动持续创新过程的一个关键因素,作为ContinuousNEXT战略的一部分。”-智能:人工智能如何渗透到几乎所有现有技术中,并创建全新的类别。-数字:融合数字世界和真实的物理世界,创造一个身临其境的世界。-网格:利用不断扩展的人员、企业、设备、内容和服务之间的联系。“例如,自动化和增强智能形式的人工智能(AI)与物联网、边缘
你访问过政府开放数据网站吗?虽然开放的数据越来越多,但“可用性有待改善”仍是不少公众对这类网站的共同看法。如何才能让开放数据更好用,并打通公共数据到普通公众的“最后一公里”?通过可视化让数据变有趣,或许是解决方法之一。在1月3日的数据侠线上实验室中,DT君邀请到上海大学美术学院信息交互设计工作室的李谦升老师,为大家带来了来自美术学院的解决方案。▍“有意义”的可视化和“有意思”的可视化今天我们讨论的话题是“可视化酷玩法——如何让城市公共数据更有趣”。这个标题是DT财经方面起的,我觉得特别贴合我今天想讲的内容。我的内容分享主要分成两个部分:一是数据可视化,我们作为2017年上海开放数据创新应用大赛(SODA)中的一支来自美术学院的参赛队伍,最擅长的就是数据的可视化,包括交互设计。在这个部分,我会结合我们的参赛作品和案例,看看城市公共数据的新玩法。第二个部分,是分享我们上海大学美术学院信息交互设计工作室在可视化方面的其他一些创新做法,以及我个人对数据可视化的一些感想。在进入第一部分内容之前,我想先通过两个例子,让大家有所思考:我们做可视化,是为了有意义,还是有意思?第一个例子是杭州城市交通的
NO.1人工智能科普类:人工智能科普、人工智能哲学《智能的本质》斯坦福、伯克利客座教授30年AI研究巅峰之作《科学+遇见人工智能》李开复、张亚勤、张首晟等20余位科学家与投资人共同解读AI革命,机器学习教父TomMitchell力荐《人工智能时代》从人工智能的历史、现状、未来,工业机器人、商业机器人、家用机器人、机器翻译、机器学习等人工智能应用领域依次介绍了人工智能发展前景。《人工智能简史》跟着图灵、冯•诺依曼、香农、西蒙、纽维尔、麦卡锡、明斯基等人工智能的先驱们重走人工智能之路,站在前人的肩膀上,看人工智能的三生三世,鉴以往才能知未来。《科技之巅》源自麻省理工学院的科技创新预言圣经掌握未来数年全球科技发展趋势和商业化潜力。《科技之巅2》全球多领域20位行业专家深度解读强化学习、基因疗法2.0、自动驾驶货车、量子计算等新科技新产业。《数学之美(第2版)》浪潮之巅文明之光硅谷之谜大学之路作者吴军博士作品新版增加大数据和机器学习内容文津图书奖获奖书央视新闻推荐的学科敲门砖。《技术的潜能》美国知名战略咨询管理专家马库斯教授力作!为非技术人士了解技术影响力而写的一本简明读本!NO.2人工智能深
腾讯位置服务JavaScriptAPI 效果: 引入步骤: 在html中通过引入script标签加载API服务 在一个盒子元素div中预先准备地图容器,并在CSS样式中定义地图(容器)显示大小 创建并显示地图的代码 创建动画和标记 1.在html中通过引入script标签加载API服务 <scriptsrc="https://map.qq.com/api/gljs?v=1.exp&key=你申请的腾讯地图应用key"></script> 复制 2.在body中预先准备地图容器,并在CSS样式中定义地图(容器)显示大小 <divid="container"></div> #container{ width:100%; height:calc(100vh-280px); border-radius:10px; overflow:hidden; } 复制 3.创建并显示地图的代码 mounted(){ this.initMap() }, methods:{ initMap(){ //设置地图中心点 letcenter=new
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。 Java运算符分为以下几种: •算术运算符:+,-,*,/,%,++,-- •赋值运算符:= • 扩展后的赋值运算符:+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=,>>>= • 位运算符:&,|,~,^,<<,>>,>>> •比较运算符:>,>=,<,<=,== •逻辑运算符:&&,&,||,|,!,^ •三目运算符:?: 1、算术运算符 1)+:加法运算符 例如如下代码: inta=1; intb=2; intsum=a+b; System.out.println(sum);//sum的值为3 另外,+还可以作为字符串的连接运算符。 2)-:减法运算符 例如如下代码: inta=3; intb=2; intsub=a-b; System.out.println(sub); //sub的值为1
. . . . . 重装Win10后,原先Linux的efi引导被win10替换掉了,所以需要修复回来。 LZ的Linux是Fedora34,所以通过U盘的LiveCD启动. 1.首先通过fdisk查看efi分区所在的磁盘。 >$sudofdisk-l Disk/dev/sdb:1.82TiB,2000398934016bytes,3907029168sectors Diskmodel:WDCWD20EZRX-22D Units:sectorsof1*512=512bytes Sectorsize(logical/physical):512bytes/4096bytes I/Osize(minimum/optimal):4096bytes/4096bytes Disklabeltype:gpt Diskidentifier:81921D83-5F46-440C-A8AE-0E7659E3C5BA DeviceStartEndSectorsSizeType /dev/sdb12048209919920971521GEFISystem /dev/sdb21048578048389
YARN:YetAnotherResourceNegotiator,Hadoop集群的资源管理器,可以对运行在Hadoop上的MapReduceV2,Spark,Impala等进行内存和CPU的分配。 MapReduce过程分析 inputsplit(输入分片)阶段:在进行Map之前,会根据输入文件的大小进行输入分片,每个输入分片对应一个Map任务。输入分片本身并不记录输入数据的内容,而是记录一个分片的长度和一个记录数据所在位置的数组。输入分片往往和HDFS的block关系密切,比如,一个block的大小为128M,有三个输入文件,大小分别为3M,129M,254M则输入分片会把3M分为1个输入分片,129M分成两个分片,254M也会分成两个输入分片。如果我们在map之前做文件合并,把小文件合成大文件,就能够减少map的数量,可以优化MapReduce执行效率。 Map阶段:执行Mapfunction。基于数据本地化原则,一般map的执行是在存储数据的DataNode节点上执行的。 Sort操作:sort是MapReduce模型默认的行为,根据Key对序列化的字节做的排序。
Date.parse(dateVal); 这个方法很常用,parse()方法可解析一个日期时间字符串,并返回1970/1/1午夜距离该日期时间的毫秒数。 可以验证输入日期是否窜在,不存在则返回NaN;可以比较两个日期的先后,或计算两个日期相差的天数。 我的需求是根据两个日期,获得日期间隔的每一天 varsTime='2014-05-06'; vareTime='2014-05-10'; functiongdate(datestr){ vartemp=datestr.split('-'); returnDate.parse(temp[1]+'-'+temp[2]+'-'+temp[0]); } functiongd(ts){ ts=newDate(ts); with(ts){ vary=getFullYear(), m=getMonth()+1, d=getDate(); if(m<10)m='0'+m; if(d<10)d='0'+d; returny+'-'+m+'-'+d; } } vars=gdate(sTime), e=gdate(eTime); cons
一.拉取Imagedockersearchredis dockerpullredis dockerimages复制二.拉取Redis配置cd/usr/local mkdirredis cdredis wgethttp://download.redis.io/redis-stable/redis.conf复制三.启动dockerRedisdockerrun--nameredis-d-p6379:6379-v/usr/local/redis/redis.conf:/etc/redis.confredisredis-server/etc/redis.conf dockerexec-itredis/bin/bash #进入容器 redis-cli #连接redis复制查看redis 已经在运行了四.参考连接Ubuntu16.04docker中安装Redis-百度经验(baidu.com)
参考:MySQL的四种事务隔离级别 参考博文中给出了不错的举例,但也有不足之处。 四种隔离: 1.readuncommitted 问题:会读到另一个事务未提交的数据,发生脏读 2.readcommitted 解决:避免了脏读 问题:如果在事务过程中,另一个事务更新(update)并提交(commit)了数据,这边读到的数据会随之更新,导致前后不一致,此现象叫不可重复读,意思为读不到重复(前后一致)的值; 3.repeatableread 解决:避免了脏读和不可重复读。 如果在事务过程中,另一个事务更新(update)并提交(commit)了数据,这边的实际内容和readcommitted模式下一样发生了变化,但在显示时不进行更新,显示历史版本的旧值。 问题:另一个事务如果插入了(insert)新行时,当前事务是接收到但是看不到(select)的,操作如果有冲突(如主键重复)会提示你这边已经有数据,好像发生幻觉一样,称为“幻读”。 4.serializable 串行化没有啥问题,就是必须一个事务commit之后另一个事务才能进行写入操作,并发性很差。 其他 隔离程度越高,并发性能越差