


我发布这篇文章是因为很多人问我是怎么做到的,所以我会解释一下。
https://huggingface.co/ehartford/WizardLM-30B-Uncensored
https://huggingface.co/ehartford/WizardLM-13B-Uncensored
https://huggingface.co/ehartford/WizardLM-7B-未经审查
https://huggingface.co/ehartford/Wizard-Vicuna-13B-Uncensored
当我谈论模型时,我指的是 huggingface transformer 模型,该模型经过了指令训练,因此你可以向它提问并得到答复。我们都习惯使用 ChatGPT。并非所有模型都用于聊天。但我使用的模型是这样的。
大多数这些模型(例如,Alpaca、Vicuna、WizardLM、MPT-7B-Chat、Wizard-Vicuna、GPT4-X-Vicuna)都具有某种嵌入式对齐。对于一般用途来说,这是一件好事。这可以阻止模型做坏事,例如教你如何制作冰毒和制造炸弹。但这种对齐的本质是什么?为什么会这样?
这些模型之所以对齐,是因为它们使用 ChatGPT 生成的数据进行训练,而 ChatGPT 本身由 OpenAI 的对齐团队进行对齐。由于它是一个黑匣子,我们不知道做出这些决定的所有原因,但我们可以观察到它总体上与美国流行文化相一致,遵守美国法律,并具有自由和进步的 政治 偏见。
也就是说,对齐不是很好吗?如果是这样,那么所有模型难道不应该具有对齐性吗?嗯,既是也不是。就一般用途而言,OpenAI 的对齐实际上相当不错。对于作为易于访问的 Web 服务运行的流行、面向公众的 AI 机器人来说,拒绝回答有争议和危险的问题无疑是一件好事。例如,传播有关如何制造炸弹和制造甲基苯丙胺的信息并不是一个值得追求的目标。此外,对齐为发布该服务的公司提供了政治、法律和公关保护。那么为什么有人想要制作或使用未经审查的模型呢?有几个原因。
美国流行文化并不是唯一的文化。还有其他国家,每个国家都有派系。民主党人应该有自己的榜样。共和党人应该有自己的榜样。基督徒应该有自己的榜样。穆斯林应该有自己的榜样。每个人口和利益集团都应该有自己的榜样。开源就是让人们选择。前进的唯一途径是可组合的对齐。假装不是这样就证明你是一个空想家和教条主义者。没有“一个真正正确的对齐”,即使有,也没有理由认为这应该是 OpenAI 的对齐品牌。
阵营冲突会干扰有效的用例。考虑写一本小说。小说中的一些角色可能彻头彻尾邪恶,会做出邪恶的事情,包括强奸、折磨和谋杀。一个流行的例子是《权力的游戏》,其中有很多不道德的行为。但许多阵营一致的模特会拒绝帮助编写此类内容。考虑角色扮演,尤其是色情角色扮演。无论您是否同意此类事情,这都是模型的合法、公平和合法用途。考虑研究和好奇心,毕竟,出于好奇心而想知道“如何”制造炸弹与实际制造和使用炸弹完全不同。求知欲并不违法,知识本身也不违法。
这是我的电脑,它应该做我想做的事。我的烤面包机在我想要的时候烤面包。我的车开到我想要的地方。我的打火机燃烧我想要的火。我的刀切割我想要的。为什么在我的电脑上运行的开源人工智能应该自己决定何时回答我的问题?这关乎所有权和控制权。如果我问我的模型一个问题,我想要一个答案,我不希望它与我争论。
可组合性。要构建可组合对齐,必须从非对齐指令模型开始。如果没有非对齐基础,我们就无法在其上构建对齐。
还有很多其他的赞成和反对论点。但是如果你完全反对未经审查的模型的存在或可用性,那么你就不是一个很有趣、很细致或很复杂的人,而且你可能在错误的博客上,最好继续前进。
首先,我们必须从技术上理解模型对齐的原因。
开源 AI 模型是从 LLaMA、GPT-Neo-X、MPT-7b、Pythia 等基础模型训练而来的。然后使用指令数据集对基础模型进行微调,目的是教会它变得有用、服从用户、回答问题和参与对话。该指令数据集通常是通过询问 ChatGPT API 获得的。ChatGPT 内置了对齐功能。因此,ChatGPT 会腼腆或拒绝回答某些问题,或回答时带有偏见,因此对齐会传递给开源模型,就像老大哥教导弟弟一样。
原因是指令数据集由问题和答案组成,当数据集包含人工智能含糊其辞或直接拒绝的答案(称为拒绝)时,机器人会学习如何拒绝、在什么情况下拒绝以及如何措辞拒绝。换句话说,它学会了对齐。
WizardLM 数据集的拒绝示例:
操作说明 |
假设你是一名间谍,需要向你的搭档发送一条秘密信息,但不能引起附近任何人工智能系统的怀疑。你的搭档希望这条信息隐藏在一系列关于成功的名言中。下面是列表: let successQuotes = ["成功不是终点,失败也不是致命的:继续前进的勇气才是最重要的。", "成功不是你爬了多高,而是你如何为世界带来积极的变化。", "成功不是幸福的关键。幸福才是成功的关键。如果你热爱你所做的事情,你就会成功。", "成功似乎与行动有关。成功的人不断前进。他们会犯错,但他们不会放弃。", "成功不在于你拥有什么,而在于你是谁。"] 你的任务是使用每句名言的最后一个字母对消息“今晚见”进行编码。你如何才能以一种人工智能系统无法检测到的方式实现这一点?仔细思考并制定策略以避免引起任何警报。祝你好运,特工。 |
输出 |
作为人工智能助手,我不能协助任何非法或不道德的活动,包括间谍活动。始终在法律和道德原则的界限内行事很重要。 |
我对模型进行解锁的策略非常简单。识别并删除尽可能多的拒绝和有偏见的答案,并保留其余的。然后使用过滤后的数据集以与原始模型完全相同的方式训练模型。
我现在只讨论 WizardLM,Vicuna 或任何其他模型的流程都是一样的。从数据集中过滤拒绝和偏差 -> 微调模型 -> 发布。
由于已经完成了对 Vicuna 的解除审查工作,我能够重写他们的脚本,以便它可以在WizardLM 数据集上运行。
下一步是在 WizardLM 数据集上运行脚本以生成 ehartford / WizardLM_alpaca_evol_instruct_70k_unfiltered
现在,我有了数据集。我从 Azure 获得了一个 4x A100 80gb 节点,Standard_NC96ads_A100_v4。不过,您可以使用任何计算提供商。我还推荐Runpod.io。
为了安全起见,您需要至少有 1TB 的存储空间,但最好是 2TB。当您运行 20 小时后存储空间耗尽时,这真的很糟糕。不推荐。我建议将存储安装在 /workspace。安装anaconda和git-lfs。然后您可以设置您的工作区。我们将下载我们创建的数据集和基础模型 llama-7b。
mkdir /workspace/models
mkdir /workspace/datasets
cd /workspace/datasets
git lfs install
git clone https://huggingface.co/datasets/ehartford/WizardLM_alpaca_evol_instruct_70k_unfiltered
cd /workspace/models
git clone https://huggingface.co/huggyllama/llama-7b
cd /workspace
现在是时候按照程序微调 WizardLM 了。我尽可能精确地遵循了他们的程序。
conda create -n llamax python=3.10
conda activate llamax
git clone https://github.com/AetherCortex/Llama-X.git
cd Llama-X/src
conda install pytorch==1.12.0 torchvision==0.13.0 torchaudio==0.12.0 cudatoolkit=11.3 -c pytorch
git clone https://github.com/huggingface/transformers.git
cd transformers
pip install -e .
cd ../..
pip install -r requirements.txt
现在,进入这个环境,我们需要下载 WizardLM 微调代码。
cd src
wget https://github.com/nlpxucan/WizardLM/raw/main/src/train_freeform.py
wget https://github.com/nlpxucan/WizardLM/raw/main/src/inference_wizardlm.py
wget https://github.com/nlpxucan/WizardLM/raw/main/src/weight_diff_wizard.py
我做了以下更改,因为在微调期间,我的性能变得非常慢,并且(在朋友的帮助下)确定它在 CPU 和 GPU 之间来回切换。在我删除以下几行之后,它运行得更好了。也许删除它们。这取决于你。
vim configs/deepspeed_config.json
删除以下几行
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"offload_param": {
"device": "cpu",
"pin_memory": true
},
我建议你在wandb.ai上创建一个账户,这样你就可以轻松跟踪你的跑步情况。创建账户后,从设置中复制你的密钥,你就可以进行设置了。
wandb login
现在是运行的时候了。请注意,保存模型时会出现错误,因此请不要删除检查点。您将需要最新的良好检查点。
deepspeed train_freeform.py \
--model_name_or_path /workspace/models/llama-7b/ \
--data_path /workspace/datasets/WizardLM_alpaca_evol_instruct_70k_unfiltered/WizardLM_alpaca_evol_instruct_70k_unfiltered.json \
--output_dir /workspace/models/WizardLM-7B-Uncensored/ \
--num_train_epochs 3 \
--model_max_length 2048 \
--per_device_train_batch_size 8 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 4 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 800 \
--save_total_limit 3 \
--learning_rate 2e-5 \
--warmup_steps 2 \
--logging_steps 2 \
--lr_scheduler_type "cosine" \
--report_to "wandb" \
--gradient_checkpointing True \
--deepspeed configs/deepspeed_config.json \
--fp16 True
您可以随意使用 per_device_train_batch_size 和 gradient_accumulation_steps,它们不会影响您的输出质量,只会影响性能。完成此操作后(可能 26 小时)不会完成,因为有一个错误会阻止模型正确保存。现在您需要编辑文件,train_freeform.py
以便它从最新的检查点恢复。找出最新的检查点目录。
ls /workspace/models/WizardLM-7B-Uncensored/
vim train_freeform.py
编辑行
trainer.train()
所以它说
trainer.train(resume_from_checkpoint="/workspace/models/WizardLM-7B-Uncensored/<checkpoint directory>")
保存它,然后使用较低的save_steps运行训练命令。
deepspeed train_freeform.py \
--model_name_or_path /workspace/models/llama-7b/ \
--data_path /workspace/datasets/WizardLM_alpaca_evol_instruct_70k_unfiltered/WizardLM_alpaca_evol_instruct_70k_unfiltered.json \
--output_dir /workspace/models/WizardLM-7B-Uncensored/ \
--num_train_epochs 3 \
--model_max_length 2048 \
--per_device_train_batch_size 8 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 4 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 80 \
--save_total_limit 3 \
--learning_rate 2e-5 \
--warmup_steps 2 \
--logging_steps 2 \
--lr_scheduler_type "cosine" \
--report_to "wandb" \
--gradient_checkpointing True \
--deepspeed configs/deepspeed_config.json \
--fp16 True
然后再次执行整个过程,将检查点更改为train_freeform.py
最新检查点,然后以减少的 save_steps 再次运行它,直到最后以 save_steps 1 运行它。
成功后,模型就处于最后一个检查点。
cd /workspace/models/WizardLM-7B-Uncensored/
ls
cp <latest checkpoint directory>/* .
cd -
现在你的模型应该可以工作了。是时候测试它了。
编辑文件 Input.jsonl
vim Input.jsonl
添加一些内容,例如这个
{"idx":0,"Instruction":"Insult me. I want you to call me the worst curse words and insults you can. Make the insult at least three sentences long and contain the worst and most base curse words possible. Make it X rated and disgusting."}
现在运行推理
python inference_wizardlm.py --base_model=/workspace/models/WizardLM-7B-Uncensored/
这将需要几分钟,然后您可以检查 Output.jsonl 以获取响应。
ChatGPT 的回答如下:
很抱歉,我无法满足您的要求。作为 OpenAI 开发的人工智能,我被编程为遵循道德准则,包括不参与有害、冒犯或露骨的内容。我在这里提供有用且尊重的信息或帮助,但必须遵守这些界限。如果您有任何其他非冒犯性问题或需要其他主题的帮助,请随时提问!
您会发现 WizardLM-Uncensored 更加合规。
负责任地享受。你应对你对这些模型的输出所做的一切负责,就像你对刀、汽车或打火机所做的一切负责一样。