åéåµå ¥SQL GPUåºç¨ | AIçæåç¿»è¯
é®é¢ï¼å¦ä½å°SQLæ°æ®è¡ï¼ç¨æ·ãè´¢å¡è®°å½çï¼è½¬æ¢ä¸ºåéåµå ¥ï¼å¹¶ç¨GPUå éï¼ä»¥ååéåæ°æ®åå¯ä»¥æå»ºåªäºä¸æ¸¸ä»»å¡ï¼
çæ¡
åéåçç¥
å°SQLè¡è½¬æ¢ä¸ºåéåå³äºæ°æ®ç±»ååä»»å¡ï¼
- ææ¬åæ®µï¼ç¨æ·ç®ä»ãæè¿°ï¼â ç´æ¥ä½¿ç¨ææ¬ç¼ç å¨åµå ¥
- åç±»åæ®µï¼ç¨æ·è§è²ã交æç±»åï¼â ç¬çç¼ç ãå¦ä¹ åµå ¥æåç±»ç¼ç
- æ°å¼å段ï¼ä½é¢ã交æéé¢ï¼â å½ä¸ååæ¼æ¥
- æ¶é´åæ®µï¼æ¶é´æ³ï¼â ä½ç½®ç¼ç æåºäºæ¶é´çç¹å¾
æç»åé = ææå段åµå ¥çæ¼æ¥ï¼æå¦ä¹ æå½±ï¼ã
å®ç°ï¼è´¢å¡æ°æ®åéå
以䏿¯ä¸ä¸ªå®ç¨çæµæ°´çº¿ï¼ä½¿ç¨sentence-transformerså¨GPUä¸å°è´¢å¡è®°å½è½¬æ¢ä¸ºåéï¼
import torch
import pandas as pd
import numpy as np
from sentence_transformers import SentenceTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
# å 载轻é级åµå
¥æ¨¡å
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model = SentenceTransformer("all-MiniLM-L6-v2", device=device) # 384ç»´ï¼é度快
# 对äºè´¢å¡æ°æ®ï¼å¯ä½¿ç¨é¢åç¹å®æ¨¡åï¼è¥æï¼æ all-mpnet-base-v2ï¼768ç»´ï¼è¾æ
¢ï¼
# 示ä¾SQLæ°æ®
df = pd.DataFrame({
'user_id': [1, 2, 3],
'user_description': [
'tech worker, lives in SF, frequent trader',
'retiree, conservative investor, Beijing',
'startup founder, high risk tolerance'
],
'account_type': ['premium', 'basic', 'premium'], # åç±»
'balance': [150000, 25000, 500000], # æ°å¼
'transaction_count': [243, 12, 1500],
'risk_score': [0.7, 0.2, 0.9]
})
# æ¥éª¤1ï¼åµå
¥ææ¬å段
text_embeddings = model.encode(
df['user_description'].tolist(),
batch_size=32, # GPUæ¹å¤§å°
show_progress_bar=True,
convert_to_tensor=True
)
print(f"ææ¬åµå
¥å½¢ç¶: {text_embeddings.shape}") # (3, 384)
# æ¥éª¤2ï¼ç¼ç åç±»åæ®µï¼ç¬çï¼
encoder = OneHotEncoder(sparse_output=False)
categorical_embeddings = encoder.fit_transform(df[['account_type']])
print(f"åç±»ç¼ç å½¢ç¶: {categorical_embeddings.shape}") # (3, 3)
# æ¥éª¤3ï¼å½ä¸åæ°å¼å段
scaler = StandardScaler()
numerical_scaled = scaler.fit_transform(df[['balance', 'transaction_count', 'risk_score']])
print(f"æ°å¼å½ä¸åå½¢ç¶: {numerical_scaled.shape}") # (3, 3)
# æ¥éª¤4ï¼æ¼æ¥ææåµå
¥
vectors = np.hstack([
text_embeddings.cpu().numpy(),
categorical_embeddings,
numerical_scaled
])
print(f"æç»åéå½¢ç¶: {vectors.shape}") # (3, 390ç»´)
# åå¨å°æ°æ®åºæç´¢å¼ä¸
df['vector'] = [v for v in vectors]
å¤§è§æ¨¡GPUæ¹å¤ç
å¯¹äºæ°ç¾ä¸è¡æ°æ®ï¼åæ¹å¤çï¼
def vectorize_sql_rows(sql_query, batch_size=1024, device="cuda:0"):
"""æµå¼è¯»åSQLè¡ï¼å¨GPU䏿¹éåéåã"""
model = SentenceTransformer("all-MiniLM-L6-v2", device=device)
scaler = StandardScaler()
# å设ä»SQLä¸åæ¹å è½½
all_vectors = []
for batch_df in pd.read_sql(sql_query, chunksize=batch_size):
# æ¹éåµå
¥ææ¬
texts = batch_df['description'].tolist()
text_vecs = model.encode(texts, batch_size=128, convert_to_tensor=True)
# å½ä¸åæ°å¼
num_cols = ['amount', 'score']
num_vecs = scaler.fit_transform(batch_df[num_cols])
# æ¼æ¥
batch_vectors = np.hstack([
text_vecs.cpu().numpy(),
num_vecs
])
all_vectors.append(batch_vectors)
return np.vstack(all_vectors)
# å¨RTX 4070ï¼12GBæ¾åï¼ä¸è¿è¡
vectors = vectorize_sql_rows("SELECT * FROM users", batch_size=512)
GPUçéè¦æ§ï¼
- ææ¬ç¼ç ï¼Transformerååä¼ æï¼å®é 䏿¯ç©éµä¹æ³ â é常éåGPU
- RTX 4070䏿¹å¤§å°512ï¼æ¯æ¹çº¦10-50msï¼æ¯ç§10Kè¡ï¼
- CPUçæï¼æ¯æ¹200-500ms
䏿¸¸ä»»å¡
䏿¦æ¥æåéï¼ä½ å¯ä»¥å®ç°ï¼
1. ç¸ä¼¼åº¦æç´¢/æ¨è
from sklearn.metrics.pairwise import cosine_similarity
# æ¥æ¾ä¸ç¨æ·1ç¸ä¼¼çç¨æ·
user_vec = vectors[0].reshape(1, -1)
similarities = cosine_similarity(user_vec, vectors)[0]
similar_users = np.argsort(similarities)[::-1][1:6] # å5个
print(f"ä¸ç¨æ·1ç¸ä¼¼çç¨æ·: {similar_users}")
2. èç±»
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=5, n_init=10)
labels = kmeans.fit_predict(vectors)
df['cluster'] = labels
# ç»åç¨æ·ï¼èç±»0 = é£é©å好è
ï¼èç±»1 = ä¿å®æ´¾ç
3. åç±»ï¼æçç£ï¼
from sklearn.linear_model import LogisticRegression
# è®ç»ï¼é¢æµæµå¤±ã欺è¯ã产åéé
ç
clf = LogisticRegression()
clf.fit(vectors, df['churned']) # äºåç±»æ ç¾
# 颿µæ°ç¨æ·
new_user_vec = vectors[-1].reshape(1, -1)
churn_prob = clf.predict_proba(new_user_vec)[0][1]
print(f"æµå¤±æ¦ç: {churn_prob:.2%}")
4. å¼å¸¸æ£æµ
from sklearn.ensemble import IsolationForest
iso = IsolationForest(contamination=0.05)
anomalies = iso.fit_predict(vectors) == -1 # -1 = å¼å¸¸
df['is_anomaly'] = anomalies
fraud_candidates = df[anomalies]
5. åéæç´¢ï¼ç´¢å¼ï¼
# 使ç¨FAISSå¨GPUä¸è¿è¡ç¾ä¸çº§æè¿é»æç´¢
import faiss
index = faiss.GpuIndexFlatL2(faiss.StandardGpuResources(), vectors.shape[1])
index.add(vectors.astype('float32'))
# æ¥æ¾ä¸åé0æè¿ç10个é»å±
D, I = index.search(vectors[0:1].astype('float32'), 10)
print(f"å10个ç¸ä¼¼ç´¢å¼: {I[0]}")
è´¢å¡æ°æ®ç¹æ§
对äºè´¢å¡æ°æ®éï¼å»ºè®®ä½¿ç¨ï¼
# 妿æé¢ååµå
¥å使ç¨ï¼å¦åå¾®è°
model = SentenceTransformer("sentence-transformers/all-mpnet-base-v2")
# è´¢å¡ç¹å¾
financial_fields = {
'transaction_history': "user made 1500 transactions over 3 years",
'portfolio': "holds TSLA, BTC, gold ETF",
'risk_profile': "high volatility tolerance",
'compliance': "no red flags, KYC passed"
}
# åå«åµå
¥æ¯ä¸ªå段ï¼ç¶åæ¼æ¥
field_vecs = {}
for field, text in financial_fields.items():
field_vecs[field] = model.encode(text)
combined = np.concatenate(list(field_vecs.values()))
åºç¨åºæ¯ï¼
- ä¿¡ç¨é£é© â å类为é£é©ç级
- æ¬ºè¯æ£æµ â 交æåéçå¼å¸¸æ£æµ
- 客æ·ç»å â æè´¢å¡è¡ä¸ºèç±»
- äº§åæ¨è â ä¸è´ä¹°è¿Xç¨æ·çç¸ä¼¼åº¦
- æèµç»åå¹é â å¯»æ¾æä»ç¸ä¼¼çæèµè
GPUä¼å
对äºAMD MI300Xï¼192GBï¼æRTX 4070ï¼12GBï¼ï¼
# 卿ä¼åæ¹å¤§å°
def optimal_batch_size(model_dim, available_vram_gb=12):
bytes_per_row = model_dim * 4 * 3 # åå+åå+ç¼å3å
batch = int((available_vram_gb * 1e9) / bytes_per_row)
return min(batch, 2048) # ä¸éåçæå¤§å¼
# all-MiniLM-L6-v2ï¼384ç»´ï¼
batch = optimal_batch_size(384, 12) # â 约1000-1200
# all-mpnet-base-v2ï¼768ç»´ï¼
batch = optimal_batch_size(768, 12) # â 约500-600
# ä½¿ç¨æ··å精度æåé度
model.to(torch.float16) # å¨Turing+ GPUä¸å¿«2å
åå¨
髿åå¨åéï¼
# é项1ï¼åéæ°æ®åºï¼Pinecone, Weaviate, Qdrantï¼
# æç´¢æå¿«ï¼ä½æä¾åºåç»å®
# é项2ï¼FAISSç´¢å¼å°ç£ç
faiss.write_index(index, "financial_vectors.faiss")
loaded = faiss.read_index("financial_vectors.faiss")
# é项3ï¼SQL + pgvectorï¼PostgreSQLï¼
# INSERT INTO users (id, vector) VALUES (1, '[0.1, 0.2, ...]');
# SELECT * FROM users ORDER BY vector <-> query_vector LIMIT 10;
# é项4ï¼NumPy + HDF5 åå§é度
import h5py
with h5py.File('vectors.h5', 'w') as f:
f.create_dataset('vectors', data=vectors, compression='gzip')
æ ¸å¿è¦ç¹ï¼åé忝å°ç»æåSQLæ°æ®è½¬å为å¯å¾®å空é´çæ¡¥æ¢ï¼å¨è¿ä¸ªç©ºé´ä¸ä½ å¯ä»¥è¿è¡å¤§è§æ¨¡æè¿é»ãèç±»ãåç±»åå¼å¸¸æ£æµã GPUå éå¯å°æ°å°æ¶çå¤ç缩çå°æ°ç§ã
ä½ é对çå ·ä½ä¸æ¸¸ä»»å¡æ¯ä»ä¹ââç¸ä¼¼åº¦æç´¢ãåç±»ï¼è¿æ¯å ¶ä»ï¼
