From
621 字
3 min
从零接触代码模型:第一次让 UniXcoder 读取 C 代码
概览
该系列文章用于跟踪信安作品的模型训练入门相关
特别鸣谢:G老师、英俊潇洒于学长
环境初步搭建
使用的是Ubuntu系统,并以此为基础创建虚拟环境
mkdir -p ~/projects/vuln-aicd ~/projects/vuln-ai
python3 -m venv .venvsource .venv/bin/activate接着升级基础工具
pip install -U pip setuptools wheel然后先安装最基础的一组
pip install torch transformers datasets scikit-learn pandas matplotlib这一组的作用如下
torch → 深度学习框架transformers → Hugging Face 模型库datasets → 数据集处理scikit-learn → 指标计算pandas → 表格数据处理matplotlib → 画图第一次加载UniXcoder tokenizer
在项目目录新建
mkdir -p srcnano src/test_tokenizer.py写入代码
from transformers import AutoTokenizer
model_name = "microsoft/unixcoder-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
code = """void f(char *input){ char buf[8]; strcpy(buf, input);}"""
tokens = tokenizer.tokenize(code)token_ids = tokenizer.convert_tokens_to_ids(tokens)
print("原始代码:")print(code)
print("\nTokens:")print(tokens)
print("\nToken IDs:")print(token_ids)
print("\nToken数量:")print(len(tokens))保存后运行并查看结果
原始代码:void f(char *input){char buf[8];strcpy(buf, input);}
Tokens: ['Ċ', 'void', 'Ġf', '(', 'char', 'Ġ*', 'input', ')', 'Ċ', '{', 'Ċ', 'ĠĠĠ', 'Ġchar', 'Ġbuf', '[', '8', '];', 'Ċ', 'ĠĠĠ', 'Ġstrcpy', '(', 'buf', ',', 'Ġinput', ');', 'Ċ', '}', 'Ċ']
Token IDs: [317, 895, 412, 126, 1285, 426, 1376, 127, 317, 209, 317, 377, 1108, 2200, 177, 142, 823, 317, 377, 16542, 126, 1091, 130, 1586, 388, 317, 211, 317]
Token数量: 28不难看出,Unicoder在读这段代码时,是先将原代码按模型自己的子词规则切为若干部分,转化为token,再将token映射为对应的数字来输入并处理
接下来新建py文件并写入
nano src/test_encode.py
from transformers import AutoTokenizer
model_name = "microsoft/unixcoder-base"tokenizer = AutoTokenizer.from_pretrained(model_name)
code = """void f(char *input){ char buf[8]; strcpy(buf, input);}"""
encoded = tokenizer( code, truncation=True, max_length=512, padding="max_length", return_tensors="pt")
print("input_ids shape:")print(encoded["input_ids"].shape)
print("\nattention_mask shape:")print(encoded["attention_mask"].shape)
print("\n前40个 input_ids:")print(encoded["input_ids"][0][:40])
print("\n前40个 attention_mask:")print(encoded["attention_mask"][0][:40])运行后看到
input_ids shape:torch.Size([1, 512])
attention_mask shape:torch.Size([1, 512])
前40个 input_ids:tensor([ 0, 317, 895, 412, 126, 1285, 426, 1376, 127, 317, 209, 317, 377, 1108, 2200, 177, 142, 823, 317, 377, 16542, 126, 1091, 130, 1586, 388, 317, 211, 317, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
前40个 attention_mask:tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])torch.Size 的1 代表一个样本,512 代表每条样本统一整理成 512 个 token 位置,而 attention_mask 后面这么多 0 也是因为原样本只有 28 个 token,所以后面部分基本上都是填充的 padding,0 代表的是无关紧要的 padding,1 则是模型需要认真看的内容,这就是“padding + mask”的配合工作
从零接触代码模型:第一次让 UniXcoder 读取 C 代码
https://blog.leeshang.top/posts/vuln-ai/模型训练/