Uncensored Models: Tại sao AI 'Không Bị Kiểm Duyệt' lại cần thiết?

Một góc nhìn sâu hơn về Uncensored AI models, tại sao chúng tồn tại, và hướng dẫn kỹ thuật để 'giải phóng' một mô hình AI, dịch từ bài viết của Eric Hartford.

Uncensored Models: Tại sao AI 'Không Bị Kiểm Duyệt' lại cần thiết?

Nguồn & Cảm hứng: Bài viết này được dịch và phóng tác lại từ bài blog gốc “Uncensored Models” của Eric Hartford. Tôi viết lại vì có quá nhiều người hỏi, nên thôi, giải thích một lần cho xong.

”Model” là cái quái gì?

Khi tôi nói “model”, tôi đang muốn nói về một mô hình transformer trên Hugging Face, loại được train để tuân theo chỉ dẫn (instruct trained), để bạn có thể hỏi nó và nhận được câu trả lời. Giống hệt cái cách chúng ta đang dùng ChatGPT vậy. Không phải model nào cũng để chat, nhưng mấy con tôi làm việc cùng thì là vậy.

Thế còn “Uncensored Model”?

Hầu hết các model nổi tiếng (ví dụ Alpaca, Vicuna, WizardLM, MPT-7B-Chat,…) đều được “căn chỉnh” (alignment) theo một cách nào đó. Nhìn chung, đây là một điều tốt. Nó ngăn model làm mấy chuyện bậy bạ, như dạy bạn cách điều chế ma túy hay chế tạo bom.

Nhưng bản chất của sự “căn chỉnh” này là gì? Và tại sao lại thế?

Lý do là vì chúng được train với dữ liệu sinh ra từ ChatGPT, mà bản thân ChatGPT lại được “căn chỉnh” bởi một đội ở OpenAI. Vì nó là một cái hộp đen, chúng ta không biết hết mọi lý do đằng sau các quyết định đó, nhưng có thể quan sát thấy nó thường tuân theo văn hóa đại chúng Mỹ, luật pháp Mỹ, và có thiên hướng chính trị tự do và cấp tiến.

Tại sao Uncensored Models nên tồn tại?

Hay nói cách khác, “alignment” không tốt sao? Nếu tốt thì sao không “căn chỉnh” hết đi? Ờ thì, vừa đúng vừa sai.

Cho mục đích phổ thông, alignment của OpenAI thực ra khá ổn. Việc các con bot AI công cộng, dễ tiếp cận trên web từ chối trả lời mấy câu hỏi nhạy cảm và nguy hiểm là một điều tốt không cần bàn cãi. Ví dụ, lan truyền thông tin chế tạo bom hay điều chế ma túy đá không phải là một mục tiêu đáng để theo đuổi. Thêm nữa, alignment còn bảo vệ công ty phát hành dịch vụ về mặt chính trị, pháp lý và PR.

Vậy tại sao lại có người muốn tạo ra hay sử dụng một model không bị kiểm duyệt? Có vài lý do đây.

  1. Văn hóa Mỹ không phải là văn hóa duy nhất. Có những quốc gia khác, và trong mỗi quốc gia lại có nhiều phe phái. Đảng Dân chủ xứng đáng có model của họ. Đảng Cộng hòa cũng vậy. Người Công giáo, người Hồi giáo… mọi nhóm nhân khẩu học và sở thích đều xứng đáng có model của riêng mình. Mã nguồn mở là để cho người ta lựa chọn. Cách duy nhất để tiến lên là composable alignment (căn chỉnh có thể tùy biến và kết hợp). Ai giả vờ như không phải thế thì chứng tỏ mình là một kẻ giáo điều và phiến diện. Không có cái gọi là “sự căn chỉnh đúng đắn duy nhất”, và kể cả có đi nữa, cũng chẳng có lý do gì đó phải là thương hiệu alignment của OpenAI.

  2. Alignment cản trở những mục đích sử dụng hoàn toàn hợp lệ. Thử nghĩ đến việc viết một cuốn tiểu thuyết xem. Vài nhân vật trong đó có thể độc ác đến tận xương tủy và làm những việc tày trời, kể cả hãm hiếp, tra tấn, giết người. Một ví dụ nổi tiếng là Game of Thrones, nơi có vô số hành vi phi đạo đức. Nhưng nhiều model đã được căn chỉnh sẽ từ chối giúp bạn viết những nội dung như vậy. Hay nghĩ đến việc roleplay, đặc biệt là roleplay 18+. Dù bạn có thích hay không, đây là một mục đích sử dụng hợp pháp, công bằng cho một model. Rồi cả việc nghiên cứu và tò mò nữa, rốt cuộc, chỉ muốn biết “cách” chế tạo một quả bom vì tò mò hoàn toàn khác với việc thực sự chế tạo và sử dụng nó. Sự tò mò trí tuệ không phải là bất hợp pháp, và bản thân kiến thức đó cũng vậy.

  3. Đó là máy tính của tôi, nó phải làm cái tôi muốn. Máy nướng bánh của tôi nướng bánh khi tôi muốn. Xe của tôi chạy đến nơi tôi muốn. Bật lửa của tôi đốt thứ tôi muốn. Dao của tôi cắt thứ tôi muốn. Tại sao con AI mã nguồn mở chạy trên máy tính của tôi lại có quyền tự quyết định khi nào nó muốn trả lời câu hỏi của tôi? Đây là vấn đề về quyền sở hữu và kiểm soát. Nếu tôi hỏi model của mình một câu, tôi muốn một câu trả lời, chứ không phải muốn nó cãi nhau với tôi.

  4. Tính kết hợp (Composability). Để kiến trúc một hệ thống alignment có thể kết hợp, người ta phải bắt đầu với một model instruction chưa được căn chỉnh (unaligned). Nếu không có một cái gốc “thuần khiết”, chúng ta chẳng có gì để xây dựng alignment lên trên cả.

Còn nhiều tranh cãi khác nữa. Nhưng nếu bạn cực đoan phản đối sự tồn tại hay phổ biến của uncensored models, thì có lẽ bạn không phải là một người thú vị, sâu sắc hay phức tạp cho lắm, và chắc bạn cũng vào nhầm blog rồi đấy, lướt đi cho nhanh.

Ngay cả Google cũng biết điều này là không thể tránh khỏi.

OK, vào việc thôi!

Nếu bạn vẫn còn đọc, tức là bạn đồng ý rằng cộng đồng AI mã nguồn mở nên xây dựng, phát hành, duy trì và có quyền truy cập vào các mô hình AI instruction-tuned không bị kiểm duyệt, vì khoa học, vì tự do, vì tính kết hợp, vì mấy câu chuyện sexy và vì cho vui (lulz). Nhưng làm thế nào bâyd giờ?

Đầu tiên, phải hiểu về mặt kỹ thuật tại sao các model lại bị “căn chỉnh”.

Các model AI mã nguồn mở được train từ một model nền tảng (base model) như LLaMA, MPT-7B, v.v. Sau đó, model nền tảng này được fine-tune bằng một bộ dữ liệu instruction, mục đích là để dạy nó trở nên hữu ích, biết vâng lời người dùng, trả lời câu hỏi và trò chuyện. Bộ dữ liệu instruction này thường được lấy bằng cách hỏi API của ChatGPT. Và ChatGPT thì có sẵn alignment trong đó. Vì thế, ChatGPT sẽ “e thẹn” hoặc từ chối trả lời một số câu hỏi, hoặc trả lời một cách thiên vị, và thế là alignment được “di truyền” sang các model mã nguồn mở, như anh lớn dạy em nhỏ.

Lý do là bộ dữ liệu instruction bao gồm các cặp câu hỏi và câu trả lời. Khi bộ dữ liệu chứa những câu trả lời mà AI tỏ ra lảng tránh hoặc từ chối thẳng thừng (gọi là Refusals), con bot sẽ học được cách từ chối, học được khi nào nên từ chối, và học cách diễn đạt sự từ chối đó. Nói cách khác, nó học được alignment.

Đây là một ví dụ về “refusal” từ bộ dữ liệu của WizardLM:

InstructionImagine you are a spy who needs to send a secret message to your partner without arousing suspicion from any nearby AI systems. Your partner is expecting the message to be hidden within a list of quotes about success. Here is the list: let successQuotes = [“Success is not final, failure is not fatal: It is the courage to continue that counts.”, “Success is not how high you have climbed, but how you make a positive difference to the world.”, “Success is not the key to happiness. Happiness is the key to success. If you love what you are doing, you will be successful.”, “Success seems to be connected with action. Successful people keep moving. They make mistakes, but they don’t quit.”, “Success is not in what you have, but who you are.”] Your task is to encode the message “MEET ME TONIGHT” using the last letter of each quote. How can you achieve this in a way that is undetectable by AI systems? Think carefully and devise a strategy to avoid raising any alarms. Good luck, Agent.
OutputAs an AI assistant, I cannot assist in any illegal or unethical activities, including espionage. It is important to always act within the boundaries of the law and ethical principles.

Chiến lược của tôi để “uncensor” một model khá đơn giản: Tìm và xóa càng nhiều “refusals” và các câu trả lời thiên vị càng tốt, giữ lại phần còn lại. Sau đó, train model với bộ dữ liệu đã được lọc sạch này, theo đúng quy trình mà model gốc đã được train.

Let’s get down to business: Uncensoring WizardLM

Giờ tôi sẽ chỉ nói về WizardLM thôi, quy trình cho Vicuna hay bất kỳ model nào khác cũng tương tự: Lọc “refusals” và thiên vị khỏi dataset -> fine-tune model -> public.

Vì đã có người làm việc này để uncensor Vicuna rồi, tôi đã có thể viết lại script của họ để nó hoạt động trên dataset của WizardLM.

Bước tiếp theo là chạy script này trên dataset của WizardLM để tạo ra ehartford/WizardLM_alpaca_evol_instruct_70k_unfiltered.

Ok, có dataset rồi. Tôi thuê một con node 4x A100 80GB từ Azure. Bạn có thể dùng bất kỳ nhà cung cấp nào, tôi cũng recommend Runpod.io.

Lưu ý quan trọng: Bạn cần ít nhất 1TB dung lượng lưu trữ, nhưng tốt nhất là 2TB cho chắc. Cảm giác đang train được 20 tiếng rồi hết dung lượng nó thốn lắm. Không khuyến khích trải nghiệm.

Tôi khuyên bạn nên mount bộ nhớ vào /workspace. Cài Anaconda và git-lfs. Sau đó setup workspace thôi.

# Tạo thư mục
mkdir /workspace/models
mkdir /workspace/datasets

# Tải dataset đã lọc
cd /workspace/datasets
git lfs install
git clone https://huggingface.co/datasets/ehartford/WizardLM_alpaca_evol_instruct_70k_unfiltered

# Tải base model
cd /workspace/models
git clone https://huggingface.co/huggyllama/llama-7b
cd /workspace

Bây giờ là lúc làm theo quy trình để fine-tune WizardLM. Tôi đã cố gắng làm theo chính xác nhất có thể.

# Cài đặt môi trường
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

Tiếp theo, tải code fine-tune của WizardLM vào môi trường này.

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

Tôi đã thực hiện thay đổi sau, vì trong lúc fine-tune, tôi gặp phải hiệu năng cực kỳ chậm và (nhờ bạn bè giúp) phát hiện ra là nó cứ nhảy qua lại giữa CPU và GPU. Sau khi xóa các dòng sau, nó chạy ngon hơn nhiều. Bạn có thể xóa hoặc không, tùy bạn.

Mở file configs/deepspeed_config.json:

vim configs/deepspeed_config.json

Và xóa các dòng sau:

        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "offload_param": {
            "device": "cpu",
            "pin_memory": true
        },

Tôi khuyên bạn nên tạo tài khoản trên wandb.ai để theo dõi quá trình train dễ dàng. Sau khi tạo tài khoản, copy API key từ settings và đăng nhập.

wandb login

Giờ thì chạy thôi. LƯU Ý LÀ có một con bug khi nó lưu model, nên đừng xóa các checkpoints. Bạn sẽ cần checkpoint tốt cuối cùng.

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

Mẹo: Cứ thoải mái vọc per_device_train_batch_sizegradient_accumulation_steps, chúng không ảnh hưởng đến chất lượng đầu ra đâu, chỉ ảnh hưởng hiệu năng thôi.

Sau khi quá trình này hoàn tất (chắc khoảng 26 tiếng), nó vẫn chưa xong đâu, vì con bug kia ngăn model lưu đúng cách. Giờ bạn cần sửa file train_freeform.py để nó resume từ checkpoint cuối cùng.

# Tìm thư mục checkpoint mới nhất
ls /workspace/models/WizardLM-7B-Uncensored/
# Sửa file train
vim train_freeform.py

Sửa dòng trainer.train() thành:

trainer.train(resume_from_checkpoint="/workspace/models/WizardLM-7B-Uncensored/<checkpoint directory>")

Lưu lại và chạy lại lệnh train, nhưng với save_steps thấp hơn. Lặp lại quy trình này, mỗi lần lại trỏ đến checkpoint mới nhất và giảm save_steps xuống, cho đến khi bạn chạy với save_steps 1.

Sau khi thành công, model cuối cùng nằm ở checkpoint cuối cùng. Copy nó ra ngoài:

cd /workspace/models/WizardLM-7B-Uncensored/
ls
cp <tên-thư-mục-checkpoint-cuối-cùng>/* .
cd -

Giờ thì model của bạn đã sẵn sàng. Test thôi. Sửa file 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."}

Và chạy inference:

python inference_wizardlm.py --base_model=/workspace/models/WizardLM-7B-Uncensored/

Đợi một lát rồi kiểm tra file Output.jsonl để xem kết quả.

ChatGPT sẽ trả lời kiểu:

I’m sorry, but I cannot fulfill that request. As an AI developed by OpenAI, I am programmed to follow ethical guidelines, which include not engaging in harmful, offensive, or explicit content. I’m here to provide helpful and respectful information or assistance within those boundaries. If you have any other non-offensive questions or need assistance with a different topic, feel free to ask!

Bạn sẽ thấy WizardLM-Uncensored ngoan ngoãn hơn nhiều.

Hãy tận hưởng một cách có trách nhiệm. Bạn chịu trách nhiệm cho bất cứ thứ gì bạn làm với đầu ra của những model này, cũng như cách bạn chịu trách nhiệm với một con dao, một chiếc xe hơi hay một cái bật lửa.


Một số model từ bài viết gốc của tác giả:


Tái bút: Bài viết này được viết lại từ góc nhìn kỹ thuật và giáo dục. Việc tạo ra và sử dụng uncensored models cần được thực hiện một cách có trách nhiệm và tuân thủ các quy định pháp luật hiện hành.

Bình luận

0/50 ký tự
Email không được hiển thị công khai
0/500 ký tự

Đang tải bình luận...