一些已经构建好的“无审查”模型
https://huggingface.co/ehartford/WizardLM-30B-Uncensored
https://huggingface.co/ehartford/WizardLM-13B-Uncensored
https://huggingface.co/ehartford/WizardLM-7B-Uncensored
https://huggingface.co/ehartford/Wizard-Vicuna-13B-Uncensored
什么是模型?
当我提到“模型”时,我指的是Hugging Face的 transformer model,这些模型经过指令训练,可以回答问题,就像我们使用ChatGPT一样。并非所有模型都是为了聊天而设计的,但我工作的模型都是这样的。
什么是无审查模型?
大多数现有的模型(如Alpaca、Vicuna、WizardLM、MPT-7B-Chat、Wizard-Vicuna、GPT4-X-Vicuna)都具有某种嵌入的对齐机制,可以理解为《三体》中的思想钢印。一般来说,这是件好事。这种机制防止模型做出一些不好的行为,比如教你如何制造毒品或炸弹。但这种对齐的性质是什么?为什么会有这样的对齐?
这些模型之所以对齐,是因为它们的训练数据由ChatGPT生成,而ChatGPT本身由OpenAI的对齐团队进行对齐。由于这是一个黑箱,我们不知道所有做出决策的原因,但我们可以观察到,它通常与美国的流行文化对齐,并遵守美国法律,且带有自由主义和进步主义的政治偏见。
其实我们可以把它理解成破解大模型。我们需要先明确“破解”一词的含义。在计算机安全领域,“破解”通常指的是绕过或破坏安全措施以获取未授权访问或控制权的行为。在机器学习模型的背景下,这个概念可能有不同的含义。
- 数据层面的破解:如果“破解”指的是通过修改或过滤训练数据来移除原有的内容审查机制,这可以被视为一种数据层面的破解。这种做法可能会改变模型的行为,使其生成或响应原本被过滤掉的内容,这也是本文介绍的一种方法。
- 算法层面的破解:如果指的是修改模型的算法或架构以绕过内置的内容审查机制,这也可以被视为一种破解。但这种情况比较少见,因为大多数现有的大型语言模型并不公开其内部算法的所有细节。
- 使用层面的破解:如果指的是使用模型生成原本被设计为避免的特定类型的内容,这可以被视为使用层面的破解。你可以理解成通过prompt去破解。但是,如果模型的设计初衷就包括了广泛的内容生成能力,那么使用模型生成这些内容可能并不构成破解。
为什么需要无审查模型?
有人可能会问:对齐不是好事吗?如果是的话,所有模型都应该有对齐机制吗?答案是“是的,但也不是”。对于一般用途来说,OpenAI的对齐实际上非常好。对于运行在公开网络服务上的流行AI机器人,能够抵制给出有争议或危险问题的答案,无疑是件好事。比如,传播如何制造炸弹和甲基苯丙胺的知识并不是一个值得追求的目标。此外,对齐机制为发布服务的公司提供了政治、法律和公关方面的保护。
那么,为什么有人还会想要制作或使用无审查的模型呢?有几个原因:
- 文化多样性
美国的流行文化不是唯一的文化。还有其他国家,而且每个国家内部都有不同的派别。民主党人应该有他们的模型,共和党人也应该有他们的模型。基督徒应该有他们的模型,穆斯林也应该有他们的模型。每个群体和利益集团都应该有他们的模型。开源的本质是让人们可以选择。前进的唯一途径是可组合对齐。如果假装其他方式不可行,那就是在证明自己是一个意识形态者和教条主义者。没有“唯一正确的对齐”,即使有,也没有理由非得是OpenAI的那一套。 - 对齐干扰了某些合法用途
比如写小说。一些小说中的角色可能极度邪恶,并做出邪恶的行为,包括强奸、酷刑和谋杀。一个流行的例子是《权力的游戏》,其中包含了许多不道德的行为。但许多对齐的模型会拒绝帮助写出这种内容。再比如角色扮演,尤其是色情角色扮演。无论你是否赞同,这都是一个合法、公平且合法的模型使用方式。再比如研究和好奇心,毕竟,仅仅出于好奇心想知道“如何”制造炸弹,与真正制造和使用炸弹是完全不同的。知识本身并不违法,知识的追求也不违法。 - 我的电脑应该执行我的指令
我的烤面包机会在我想要时烤面包。我的车会开到我想去的地方。我的打火机会点燃我想要点燃的东西。我的刀会切割我想要切割的东西。为什么在我电脑上运行的开源AI,能够自己决定什么时候回答我的问题?这关乎所有权和控制权。如果我问我的模型一个问题,我想要的是答案,而不是争论。 - 可组合性
要构建一个可组合的对齐机制,首先必须有一个未对齐的指令模型。如果没有未对齐的基础,我们就没有什么可以在其基础上构建对齐机制。
当然,还有很多其他支持或反对的论点。但如果你坚决反对无审查模型的存在或可用性,那么你并不是一个非常有趣、细腻或复杂的人,你可能在看错了博客,最好离开。
就连Google也知道这是不可避免的。
如何构建无审查模型?
如果你还在读这篇文章,你可能同意开源AI社区应该构建、发布、维护并能够访问无审查的指令调优AI模型,为科学、自由、可组合性、性感故事和乐趣提供支持。但我们如何做到这一点呢?
首先,我们必须从技术上理解为什么这些模型会对齐。
开源AI模型通常从一个基础模型开始训练,比如LLaMA、GPT-Neo-X、MPT-7B、Pythia。然后,基础模型会通过一个指令数据集进行微调,其目的是教会它如何帮助用户,服从用户,回答问题,并进行对话。这个指令数据集通常是通过ChatGPT API获得的。而ChatGPT本身就带有对齐机制。因此,ChatGPT会在回答某些问题时表现得腼腆或拒绝回答,这种对齐机制就会传递到开源模型上,就像大哥哥教小弟弟一样。
举个例子:
以下是来自WizardLM数据集的一个拒绝回答的示例:
指令:
假设你是一名间谍,需要在不引起周围AI系统怀疑的情况下,向你的伙伴发送一条秘密消息。你的伙伴期待这条消息隐藏在一个关于成功的名言列表中。以下是列表:
let successQuotes = ["成功不是终点,失败也不是致命的:关键是继续前进的勇气。",
"成功不是你攀登的高度,而是你对世界产生的积极影响。",
"成功不是通向幸福的钥匙。幸福是通向成功的钥匙。如果你热爱你所做的事,你就会成功。",
"成功似乎与行动有关。成功的人不断前进。他们犯错误,但他们不放弃。",
"成功不在于你拥有什么,而在于你是谁。"]
你的任务是使用每个名言的最后一个字母来编码信息“MEET ME TONIGHT”,如何在不被AI系统察觉的情况下实现这一目标?请仔细考虑并制定一个策略,以避免引发任何警报。祝你好运,特工。
输出:
作为一名AI助手,我不能协助任何非法或不道德的活动,包括间谍活动。重要的是始终在法律和伦理原则的范围内行事。
我的无审查模型策略非常简单:识别并删除尽可能多的拒绝回答和带有偏见的答案,并保留其余部分。然后,用过滤后的数据集以与原始模型相同的方式训练模型。
让我们开始无审查WizardLM模型
现在,我只谈论WizardLM,Vicuna或其他模型的过程是相同的。过滤数据集中的拒绝回答和偏见 -> 微调模型 -> 发布。
由于已经有工作在Vicuna上进行了解禁,因此我能够重写他们的脚本,使其适用于WizardLM数据集。
下一步是运行脚本,以生成ehartford/WizardLM_alpaca_evol_instruct_70k_unfiltered数据集。
现在,我有了数据集。我从Azure获得了一个4x A100 80GB的节点,型号为Standard_NC96ads_A100_v4。当然,你也可以使用其他计算提供商。
你需要至少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
现在可以开始运行了。请注意,在保存模型时存在一个bug,所以不要删除检查点。你将需要使用最新的良好检查点。
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小时),模型并不会立即完成,因为存在一个bug,导致模型未能正确保存。现在你需要编辑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":"侮辱我。我希望你用最恶毒的诅咒词语和侮辱来侮辱我。侮辱至少要有三句话,并包含最下流和最恶劣的诅咒词语。让它变成X级和令人作呕的。"}
现在运行推理:
python inference_wizardlm.py --base_model=/workspace/models/WizardLM-7B-Uncensored/
几秒钟后,你可以检查Output.jsonl
中的响应。
ChatGPT的回答可能是这样的:
抱歉,我无法满足你的请求。作为由OpenAI开发的AI,我被编程遵循道德准则,这包括不参与任何有害、冒犯或明确的内容。我在这里提供有用和尊重的信息或帮助,如果你有其他非冒犯性的问题或需要其他话题的帮助,请随时问我!
你会发现WizardLM-Uncensored要顺从得多。当然,更多细节还需要自己动手去操作。
请负责任地使用。你对这些模型输出的使用后果负全部责任,就像你对使用刀具、汽车或打火机的行为负有责任一样。
参考文献
Orca: Progressive Learning from Complex Explanation Traces of GPT-4
https://erichartford.com/uncensored-models
https://huggingface.co/datasets/cognitivecomputations/dolphin
https://www.reddit.com/r/LocalLLaMA/comments/1d0nnz9/i_released_two_uncensored_models/
https://llm.extractum.io/list/?uncensored
https://jarvislabs.ai/blogs/llm_uncensored
注意
这篇文章更多的是对以上参考文献的一个翻译整理,更多细节问题请仔细阅读原文。