BERT语言模型详解【Encoder-Only】

NLP-大语言模型学习系列目录

一、注意力机制基础——RNN,Seq2Seq等基础知识
二、注意力机制【Self-Attention,自注意力模型】
三、Transformer图文详解【Attention is all you need】
四、大语言模型的Scaling Law【Power Low】
五、大语言模型微调方法详解【全量微调、PEFT、LoRA、Adapter】
六、BERT模型详解

文章目录

  • NLP-大语言模型学习系列目录
  • 一、Introduction
  • 二、模型架构
  • 三、模型输入输出
    • 1 输入
    • 2 输出
  • 四、预训练
    • 1 Masked LM
    • 2 NSP
  • 五、微调
    • 1 文本分类任务
    • 2 序列标注任务
  • Bert 参数计算
    • 1 计算公式
    • 2 BERTBASE
    • 3 BERTLARGE
  • 参考资料


本文介绍经典的Encoder-only模型——BERT,需要对Transformer结构有一定的了解,可以参考本系列博客的前面几章如Transformer图文详解【Attention is all you need】。

BERT的原论文为:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

一、Introduction

传统的语言模型,如标准的自回归模型,通常只能基于从左到右或从右到左的单向上下文生成文本。BERT创新性地引入了“掩蔽语言模型”(MLM),它会随机遮盖输入句子中的某些词,然后让模型预测这些被遮盖的词,从而实现了对句子中双向上下文的理解。这种方式克服了单向语言模型的局限性,使得BERT能够在更广泛的上下文中学习更丰富的语言表示。

MLM的灵感来自Cloze任务,Cloze任务是一种语言填空测试,要求人们在句子中填补缺失的词。

论文贡献:

  • 我们展示了双向预训练对于语言表示的重要性。与Radford等人(2018)使用单向语言模型进行预训练不同,BERT使用掩蔽语言模型来实现深度双向预训练表示。这也不同于Peters等人(2018a),他们通过独立训练的从左到右和从右到左的语言模型进行浅层拼接。
  • 我们证明了预训练的表示能够减少对许多高度工程化的特定任务架构的需求。BERT是第一个基于微调的表示模型,它在大量的句子级别和词级别任务中达到了最新的性能水平,超越了许多特定任务的架构。
  • BERT在11项自然语言处理任务上得到了最好结果。代码和预训练模型可在https://github.com/google-research/bert获取

二、模型架构

BERT采用了Transformer架构,特别是Transformer的编码器部分。把多个Transformer Encoder组装起来,就构成了BERT。

1k9h3838tt

在论文中,作者分别用12个和24个Transformer Encoder组装了两套BERT模型,两套模型的参数总数分别为110M和340M,文末给出了模型参数的详细计算过程。

三、模型输入输出

1 输入

BERT 的输入可以包含一个句子对 (句子 A 和句子 B),也可以是单个句子。同时 BERT 增加了一些有特殊作用的标志位:

  • [CLS] 标志放在第一个句子的首位,经过 BERT 得到的的表征向量 C 可以用于后续的分类任务。
  • [SEP] 标志用于分开两个输入句子,例如输入句子 A 和 B,要在句子 A,B 后面增加 [SEP] 标志。
  • [MASK] 标志用于遮盖句子中的一些单词,将单词用 [MASK] 遮盖之后,再利用 BERT 输出的 [MASK] 向量预测单词是什么。

例如给定两个句子 “my dog is cute” 和 “he likes palying” 作为输入样本,BERT 会转为 “[CLS] my dog is cute [SEP] he likes play ##ing [SEP]”。BERT 里面用了 WordPiece 方法,会将单词拆成子词单元 (SubWord),所以有的词会拆出词根,例如 “palying” 会变成 “paly” + “##ing”。如果不对英文词进行类似词根抽取,词表过大,不容易拟合。

BERT 得到要输入的句子后,需要将字符输入转换为向量输入。BERT的向量输入表示由三个嵌入向量的相加组成,分别是标记嵌入(Token Embedding)段嵌入(Segment Embedding)位置嵌入(Position Embedding)。这三部分嵌入向量共同作用,用于向模型提供丰富的输入信息。

  1. Token Embedding:每个词或标记(token)会被转换成一个固定大小的向量表示。BERT使用的是WordPiece分词,输入的每个子词都会有一个对应的向量。
  2. Segment Embedding:BERT可以处理两个句子作为输入(用于问答或句子间关系推理任务),因此它引入了“段嵌入”来区分每一个单词属于句子 A 还是句子 B,如果只输入一个句子就只使用 EA
  3. 位置嵌入(Position Embedding):编码单词出现的位置,与 Transformer 使用固定的公式计算不同,BERT 的 Position Embedding 也是通过学习得到的,在 BERT 中,假设句子最长为 512。

BERT的Embedding

值得注意的是在BERT中,上面三个向量都是通过学习得到(不像Transformer的位置编码是固定的)。

2 输出

BERT的输出和输入对应,每一个输入会有一个输出的Embedding向量,向量大小为hidden_size (BERT Base中的768),如下图所示:

截屏2024-10-11 16.41.18

然后根据不同的下游任务,可以在输出的embedding后面加入其他的神经网络层。比如分类任务,这个向量现在可以用作我们所选择的分类器的输入,如下图所示:

截屏2024-10-11 16.41.46

四、预训练

预训练过程主要有两个任务:

  1. Masked Language Model(完形填空)
  2. Next Sentence Prediction (预测下一个句子)

1 Masked LM

我们先回顾一下以往语言模型的预训练方法,使用句子 “我/喜欢/学习/自然/语言/处理” 为例。在训练语言模型的时候通常需要进行一些 Mask 操作,防止信息泄露问题,信息泄露指在预测单词 “自然” 的时候,提前得知 “自然” 的信息。

  • ELMo:ELMo 在训练的时候使用 biLSTM,预测 “自然” 的时候,前向 LSTM 会 Mask “自然” 之后的所有单词,使用上文 “我/喜欢/学习” 预测;后向 LSTM 会 Mask “自然” 之前的单词,使用下文 “语言/处理” 进行预测。然后再将前向 LSTM 和后向 LSTM 的输出拼接在一起,因此 ELMo 是将上下文信息分隔开进行预测的,而不是同时利用上下文信息进行预测。
  • OpenAI GPT:OpenAI GPT 是另外一种使用 Transformer 训练语言模型的框架,但是 OpenAI GPT 使用的是 Transformer 的 Decoder,是一种单向的结构。预测 “自然” 的时候只使用上文 “我/喜欢/学习”,Decoder 中包含了 Mask 操作,将当前预测词之后的单词都 Mask。

下图显示了 BERT 和 ELMo、OpenAI GPT 的区别。

截屏2024-10-11 14.51.45

BERT 的作者认为在预测单词时,要同时利用单词 left (上文) 和 right (下文) 信息才能最好地预测。将 ELMo 这种分别进行 left-to-right 和 right-to-left 的模型称为 shallow bidirectional model (浅层双向模型),BERT 希望在 Transformer Encoder 结构上训练出一种深度双向模型 deep bidirectional model,因此提出了 Mask LM 这种方法进行训练。

Mask LM 是用于防止信息泄露的,例如预测单词 “自然” 的时候,如果不把输入部分的 “自然” Mask 掉,则预测输出的地方是可以直接获得 “自然” 的信息。

截屏2024-10-11 14.54.07BERT 在训练时只预测 [Mask] 位置的单词,这样就可以同时利用上下文信息。然而,这带来了一个问题:在微调阶段,实际任务中并不会有 [MASK] 标记的出现,这就导致预训练和微调存在一定的不匹配

为了缓解这种不匹配,BERT的预训练策略采取了一个平衡方案:

  1. 80%时间用 [MASK] 替换:大多数情况下,模型会按照预期进行 [MASK] 掩蔽,这帮助模型学会预测被mask的词。
  2. 10%时间用随机词替换:为了避免模型过度依赖 [MASK] 标记,10%的情况下会用随机词替换。这样可以让模型学会处理意外的输入,从而增强鲁棒性。
  3. 10%时间保持不变:模型不会对词进行mask,这可以帮助模型学会保留和处理正常的词序列输入。

例如原文中给的一个例子:

在句子 “my dog is hairy”,选择了单词 “hairy” 进行 Mask,则:

  • 80% 的概率,将句子 “my dog is hairy” 转换为句子 “my dog is [Mask]”
  • 10% 的概率,将单词 “hairy” 替换成另一个随机词,例如 “apple”。将句子 “my dog is hairy” 转换为句子 “my dog is apple”
  • 10% 的概率,保持句子为 “my dog is hairy” 不变

这种训练方法通过在预训练时随机选择一些词进行掩蔽或替换,使得模型无法确定哪些词会被遮盖或替换。这样,模型必须为所有输入词都生成上下文相关的表示,以确保在遇到任何词被掩蔽时,都能有足够的信息来预测原始词。这就增强了模型的上下文感知能力,即使在某些词被替换或掩蔽的情况下,它仍然能够基于上下文推断出合理的语义。

同时,随机替换只占1.5%的标记(即15%的标记中有10%被随机替换),比例较小,足以引入一些多样性来训练模型的鲁棒性(处理意外输入的能力),但又不会显著影响模型的整体语言理解能力。

为什么是8:1:1这个比例,作者做了消融实验来得到的,如下图所示,8:1:1这个比例在所有设置里效果最好.

截屏2024-10-11 15.04.57

输入的Sequence经过BERT得到输出的Embedding后,怎么预测Mask位置的词呢,如下图所示,还会接一个FFN+Softmax得到每个词的概率,概率最大的作为预测的词。

截屏2024-10-11 15.59.42

最终的损失函数只计算被mask掉那个token

2 NSP

BERT 的第二个预训练任务是 Next Sentence Prediction (NSP),即下一句预测,给定两个句子 A 和 B,要预测句子 B 是否是句子 A 的下一个句子。

BERT 在进行训练的时候,从文本语料库中随机选择50%正确语句对和50%错误语句对进行训练,然后通过 [CLS] 标志位的输出 C 预测句子 A 的下一句是不是句子 B。

  • 输入 = [CLS] 我 喜欢 玩 [Mask] 联盟 [SEP] 我 最 擅长 的 [Mask] 是 亚索 [SEP]

    类别 = B 是 A 的下一句

  • 输入 = [CLS] 我 喜欢 玩 [Mask] 联盟 [SEP] 今天 天气 很 [Mask] [SEP]

    类别 = B 不是 A 的下一句

NSP预测方法如下图所示:

截屏2024-10-11 16.53.45

BERT模型通过对Masked LM任务和Next Sentence Prediction任务进行联合训练,使模型输出的每个字/词的向量表示都能尽可能全面、准确地刻画输入文本(单句或语句对)的整体信息,为后续的微调任务提供更好的模型参数初始值。

截屏2024-10-11 15.10.00

五、微调

经过预训练后得到的模型可以用来微调各类任务,具体来说就是会根据下游任务的特点针对对应的BERT输出做一些处理,以满足任务的需求。

1 文本分类任务

单文本分类任务。前面提到,BERT模型在文本前插入一个[CLS]符号,并将该符号对应的输出向量作为整篇文本的语义表示,用于文本分类,如下图所示。对[CLS]对应的输出接一个线性分类器,可以用于文章的情感分类之类的任务,这个线性分类器的参数需要根据微调数据集进行学习。

截屏2024-10-12 14.09.27

2 序列标注任务

序列标注任务的实际应用场景包括:命名实体识别、中文分词、新词发现(标注每个字是词的首字、中间字或末字)、答案抽取(答案的起止位置)等。对于该任务,BERT模型利用文本中每个Token对应的输出向量对该Token进行标注(分类),如下图所示在每个Token对应的输出向量后,再接一个分类器用于标注、分类。

截屏2024-10-12 14.11.37

Bert 参数计算

1 计算公式

BERT模型的大小,主要是指模型的参数数量。参数数量的计算取决于Transformer模型中的几个关键组成部分:嵌入层多头自注意力机制前馈网络,以及其他少量的参数。下面我们来具体分析如何计算这些参数。

  1. 嵌入层参数

BERT的输入是词嵌入向量,它包括词嵌入位置嵌入段落嵌入。假设词汇表的大小为 V V V,嵌入向量的维度为 H H H(即隐藏层大小)。

  • 词嵌入参数 V × H V \times H V×H
  • 位置嵌入参数:通常BERT的最大序列长度是512,所以位置嵌入参数为 512 × H 512 \times H 512×H
  • 段落嵌入参数:BERT使用两段输入(A和B),所以段落嵌入的参数为 2 × H 2 \times H 2×H

因此,嵌入层的总参数量为:
V × H + 512 × H + 2 × H V \times H + 512 \times H + 2 \times H V×H+512×H+2×H

  1. 多头自注意力机制的参数

在每一层Transformer块中,自注意力机制的参数可以分为查询向量(Query)键向量(Key)、**值向量(Value)三个矩阵的线性变换,以及最后的输出投影层。对于每一个注意力头,每个矩阵的大小为 H × ( H / A ) H \times (H / A) H×(H/A),其中 A A A 是注意力头的数量。

每个自注意力头的参数为:

  • Query矩阵 H × ( H / A ) H \times (H / A) H×(H/A)
  • Key矩阵 H × ( H / A ) H \times (H / A) H×(H/A)
  • Value矩阵 H × ( H / A ) H \times (H / A) H×(H/A)

总共有 A A A 个注意力头,因此自注意力层的参数总量为:
3 × ( H × ( H / A ) ) × A = 3 × H × H 3 \times (H \times (H / A)) \times A = 3 \times H \times H 3×(H×(H/A))×A=3×H×H

此外,多头自注意力层的输出会经过一个线性变换回到原始维度 H H H,这会引入额外的参数:
H × H H \times H H×H

因此,每个自注意力模块的参数总量为:
4 × H × H 4 \times H \times H 4×H×H

  1. 前馈网络的参数

每个Transformer块还有一个前馈神经网络,通常由两层全连接网络组成。第一层的输出维度为 4 H 4H 4H,然后再映射回 H H H 维。前馈网络的参数总量为:
H × 4 H + 4 H × H = 8 H 2 H \times 4H + 4H \times H = 8H^2 H×4H+4H×H=8H2

  1. 每层Transformer块的总参数

每层的总参数量为:
4 H 2 (自注意力层) + 8 H 2 (前馈网络) = 12 H 2 4H^2 \text{(自注意力层)} + 8H^2 \text{(前馈网络)} = 12H^2 4H2(自注意力层)+8H2(前馈网络)=12H2

  1. 总参数量

假设有 L L L 层Transformer块,那么模型的总参数量为:

  • 嵌入层参数
    • 词嵌入: V × H V \times H V×H
    • 位置嵌入: 512 × H 512 \times H 512×H
    • 段落嵌入: 2 × H 2 \times H 2×H
  • Transformer层参数 L × 12 H 2 L \times 12H^2 L×12H2

因此,总参数量公式为:
总参数 = V × H + 512 × H + 2 × H + L × 12 H 2 \text{总参数} = V \times H + 512 \times H + 2 \times H + L \times 12H^2 总参数=V×H+512×H+2×H+L×12H2

2 BERTBASE

BERTBASE网络的参数设置:

  • L = 12 L = 12 L=12 H = 768 H = 768 H=768 A = 12 A = 12 A=12
  • 词汇表大小 V ≈ 30 , 000 V \approx 30,000 V30,000

嵌入层参数:
30 , 000 × 768 + 512 × 768 + 2 × 768 = 23 , 040 , 000 + 393 , 216 + 1 , 536 = 23 , 434 , 752 30,000 \times 768 + 512 \times 768 + 2 \times 768 = 23,040,000 + 393,216 + 1,536 = 23,434,752 30,000×768+512×768+2×768=23,040,000+393,216+1,536=23,434,752
每层Transformer块的参数:
12 × 76 8 2 = 12 × 589 , 824 = 7 , 077 , 888 12 \times 768^2 = 12 \times 589,824 = 7,077,888 12×7682=12×589,824=7,077,888
总Transformer层参数:
12 × 7 , 077 , 888 = 84 , 934 , 656 12 \times 7,077,888 = 84,934,656 12×7,077,888=84,934,656
因此,BERTBASE的总参数量大约为:
23 , 434 , 752 + 84 , 934 , 656 = 108 , 369 , 408 ≈ 110 M 23,434,752 + 84,934,656 = 108,369,408 \approx 110M 23,434,752+84,934,656=108,369,408110M

3 BERTLARGE

BERTLARGE网络的参数设置:

  • L = 24 L = 24 L=24 H = 1024 H = 1024 H=1024 A = 16 A = 16 A=16

嵌入层参数:
30 , 000 × 1024 + 512 × 1024 + 2 × 1024 = 30 , 720 , 000 + 524 , 288 + 2 , 048 = 31 , 246 , 336 30,000 \times 1024 + 512 \times 1024 + 2 \times 1024 = 30,720,000 + 524,288 + 2,048 = 31,246,336 30,000×1024+512×1024+2×1024=30,720,000+524,288+2,048=31,246,336
每层Transformer块的参数:
12 × 102 4 2 = 12 × 1 , 048 , 576 = 12 , 582 , 912 12 \times 1024^2 = 12 \times 1,048,576 = 12,582,912 12×10242=12×1,048,576=12,582,912
总Transformer层参数:
24 × 12 , 582 , 912 = 301 , 989 , 888 24 \times 12,582,912 = 301,989,888 24×12,582,912=301,989,888
因此,BERTLARGE的总参数量大约为:
31 , 246 , 336 + 301 , 989 , 888 = 333 , 236 , 224 ≈ 340 M 31,246,336 + 301,989,888 = 333,236,224 \approx 340M 31,246,336+301,989,888=333,236,224340M

总结:通过计算嵌入层、自注意力层、前馈网络以及总的Transformer层数,可以得出BERT模型的总参数量。

参考资料

  1. https://lulaoshi.info/deep-learning/attention/bert.html
  2. 彻底理解Google BERT
  3. 图解BERT模型:从零开始构建BERT
  4. The Illustrated BERT

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio 导入/删除/新建库的模块(第三方项目) - Module

文章目录 一、导入module项目 Module空项目如何导入Project工程项目二、删除module项目三、新建module项目(不常用) 一、导入module项目 首先,你必须要有一个工程(Project),才可以打开项目(Module) 第一步骤:右键项目依次点击 New -> Module 1、工…

LLM | 论文精读 | 基于大型语言模型的自主代理综述

论文标题:A Survey on Large Language Model based Autonomous Agents 作者:Lei Wang, Chen Ma, Xueyang Feng, 等 期刊:Frontiers of Computer Science, 2024 DOI:10.1007/s11704-024-40231-1 一、引言 自主代理(…

AI 提示词(Prompt)入门 :ChatGPT 4.0 高级功能指南

这段时间 GPT4 多了很多功能,今天主要是增加了 GPTs Store 的介绍和 创建 GPTs 的简单方法,那么我们开始吧,文末有彩蛋。 这里主要讲解如下几个点: 1: ChatGPT 4.0 插件的使用 2:ChatGPT 4.0 高级数据分…

【已解决】【hadoop】【hive】启动不成功 报错 无法与MySQL服务器建立连接 Hive连接到MetaStore失败 无法进入交互式执行环境

启动hive显示什么才是成功 当你成功启动Hive时,通常会看到一系列的日志信息输出到控制台,这些信息包括了Hive服务初始化的过程以及它与Metastore服务连接的情况等。一旦Hive完成启动并准备就绪,你将看到提示符(如 hive> &#…

大数据Azkaban(二):Azkaban简单介绍

文章目录 Azkaban简单介绍 一、Azkaban特点 二、Azkaban组成结构 三、Azkaban部署模式 1、solo-server ode(独立服务器模式) 2、two server mode(双服务器模式) 3、distributed multiple-executor mode(分布式多…

FPGA第 13 篇,使用 Xilinx Vivado 创建项目,点亮 LED 灯,Vivado 的基本使用(点亮ZYNQ-7010开发板的LED灯)

前言 在FPGA设计中,Xilinx Vivado软件是一款功能强大的设计工具,它不仅支持硬件描述语言(HDL)的开发,还提供了丰富的图形化设计界面,方便用户进行硬件设计、调试和测试。这里我们将详细介绍,如…

RabbitMQ 高级特性——事务

文章目录 前言事务配置事务管理器加上Transactional注解 前言 前面我们学习了 RabbitMQ 的延迟队列,通过延迟队列可以实现生产者生产的消息不是立即被消费者消费。那么这篇文章我们将来学习 RabbitMQ 的事务。 事务 RabbitMQ 是基于 AMQP 协议实现的,…

Gstreamer的webrtcbin插件

1、输入参数 static GOptionEntry entries[] {{"peer-id", 0, 0, G_OPTION_ARG_STRING, &peer_id, "String ID of the peer to connect to", "ID"},{"server", 0, 0, G_OPTION_ARG_STRING, &server_url, "Signalling se…

unity项目导出安卓工程后,在AndroidStudio打包报错:unityLibrary:BuildIl2CppTask‘.

下面这个是我在unity开发者社区提问后,他们回答得: 解决方案:我这边按照这几个方案检查了下,NDK和JDK都没问题,最后重启电脑才解决的,应该是文件被锁定了,我用的windows系统的。 验证&#xff…

一篇文章快速认识YOLO11 | 旋转目标检测 | 原理分析 | 模型训练 | 模型推理

本文分享YOLO11的旋转目标检测任务,在原始目标检测中,添加多一个角度预测,实现定向边界框检测。 其中旋转角度算法设计中,通过回归预测实现的。 目录 1、旋转目标检测概述 2、YOLO11中的OBB数据格式 3、分析模型配置参数 4、…

dmsql日志分析工具部署与使用DM8/DM7

dmsql日志分析工具部署与使用DM8/DM7 1 环境介绍2 JAVA 环境变量配置2.1 Os Kylin 10 JAVA 环境变量配置2.2 Windos7 JAVA环境变量配置 3 数据库配置3.1 数据库初始化参数3.2 数据库创建表 4 配置DMLOG日志分析工具4.1 Kylin v10 配置DMLOG日志分析工具4.2 执行日志分析4.3 Win…

Node-RED的面板的认识及操作

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📘 文章引言 📟 面板…

jvm虚拟机介绍

Java虚拟机(JVM)是Java语言的运行环境,它基于栈式架构,通过加载、验证、准备、解析、初始化等类加载过程,将Java类文件转换成平台无关的字节码,并在运行时动态地将其翻译成特定平台的机器码执行。 JVM的核心…

如何尽早地发现并抵御 DDoS 攻击?

近半年,随着软硬件服务的廉价化、规模化,国内外云厂商频繁遭受不明原因的大规模网络攻击,给很多网站带来了不良的影响。其实,DDoS 攻击这把「达摩斯之剑」一直高悬在各家互联网公司的头顶,虽然很多互联网企业对 DDoS 攻…

「C/C++」C++ STL容器库 之 std::list 双向链表容器

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

使用飞桨AI Studio平台训练数据,并进行图像识别分析得牡丹花测试

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

arcgis js 怎么加载geoserver发布的wms服务

arcgis js api加载wms服务,官方的参考样例: WMSLayer | Sample Code | ArcGIS Maps SDK for JavaScript 4.30 | Esri Developer 按照官方样例加载比较奇怪,我们平常习惯用url或者json的方式加载,稍微改一下就行,如下…

图---java---黑马

图 概念 图是由顶点(vertex)和边(edge)组成的数据结构,例如 该图有四个顶点:A,B,C,D以及四条有向边,有向图中,边是单向的。 有向 vs 无向 如果是无向图,那么边是双向的&#x…

AWS域名注册续费详解

在当今互联网时代,域名是建立在线品牌和业务的重要资产。许多企业和个人选择通过Amazon Web Services(AWS)进行域名注册,享受其高效的管理工具和强大的基础设施。然而,很多用户在注册域名后,可能会产生一个…

Docker安装ShardingSphere-proxy实现读写分离

1.输入以下命令安装proxy docker run -d \ > -v /test/server/proxy-a/conf:/opt/shardingsphere-proxy/conf \ > -v /test/server/proxy-a/ext-lib:/opt/shardingsphere-proxy/ext-lib \ > -e ES_JAVA_OPTS"-Xmx256m -Xms256M -Xmn128m" \ > -p 3321:33…