久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

TensorFlow Lite移動端部署實戰(zhàn):量化、性能調(diào)優(yōu)與熱替換

TensorFlow Lite移動端部署實戰(zhàn):量化、性能調(diào)優(yōu)與熱替換 1. 移動端推理框架選型的核心邏輯做過移動端AI功能的人都有一個共識在手機(jī)上跑模型跟在服務(wù)器上跑模型完全是兩碼事。服務(wù)器上你可以堆顯卡、加內(nèi)存實在不行換張更猛的卡就行。但手機(jī)端不行你得在算力、內(nèi)存、功耗、發(fā)熱這四個維度之間找平衡點任何一個超標(biāo)都會導(dǎo)致用戶體驗崩盤。TensorFlow Lite后面統(tǒng)一簡稱TFLite就是在這個背景下被推到臺前的。它的核心定位很明確把訓(xùn)練好的TensorFlow模型經(jīng)過轉(zhuǎn)換和優(yōu)化塞進(jìn)手機(jī)、嵌入式設(shè)備、IoT模組這些資源受限的環(huán)境里跑起來。聽起來簡單但實際操作中涉及的東西遠(yuǎn)比想象中多。我最初接觸TFLite是在一個圖像分類的移動端項目上。當(dāng)時團(tuán)隊用Keras訓(xùn)練了一個還算不錯的模型準(zhǔn)確率能到92%左右但直接往手機(jī)上一放推理一次要1.8秒手機(jī)背面燙得能煎雞蛋。后來經(jīng)過TFLite轉(zhuǎn)換加量化推理時間壓到了200毫秒以內(nèi)模型體積從原來的47MB縮到了12MB。這個差距讓我意識到模型訓(xùn)練只是上半場部署優(yōu)化才是決定產(chǎn)品能不能落地的下半場。這篇文章適合哪些人看如果你正在做以下事情那接下來的內(nèi)容應(yīng)該對你有直接幫助手里有訓(xùn)練好的TensorFlow模型想部署到Android或iOS設(shè)備上嘗試過直接調(diào)用TensorFlow Mobile但發(fā)現(xiàn)性能不理想需要在保持精度的前提下壓縮模型體積想在邊緣設(shè)備上實現(xiàn)實時推理對模型量化、算子兼容性這些概念還比較模糊我會從整體設(shè)計思路開始拆然后逐步深入到具體的轉(zhuǎn)換流程、量化策略、性能調(diào)優(yōu)和踩坑記錄。每個環(huán)節(jié)都會解釋為什么這么做以及不這么做會出什么問題。2. TFLite的整體架構(gòu)與核心設(shè)計思路2.1 為什么不是直接用TensorFlow MobileTensorFlow Mobile是TFLite的前身現(xiàn)在基本已經(jīng)被官方放棄維護(hù)了。兩者最本質(zhì)的區(qū)別在于設(shè)計哲學(xué)TensorFlow Mobile是把完整的TensorFlow運行時裁剪了一下塞進(jìn)移動端而TFLite是從零開始為移動端重新設(shè)計的一套輕量級推理引擎。這個區(qū)別帶來的直接影響是對比維度TensorFlow MobileTensorFlow Lite二進(jìn)制體積約2.5MB約300KB支持的算子數(shù)量較多但冗余精選核心算子量化支持有限完整的訓(xùn)練后量化量化感知訓(xùn)練硬件加速基本沒有GPU/NPU委托機(jī)制社區(qū)活躍度已停止維護(hù)持續(xù)更新TFLite的核心設(shè)計思路可以概括為三個關(guān)鍵詞扁平化、委托化、量化優(yōu)先。扁平化指的是模型格式。TFLite用的是FlatBuffers而不是Protocol Buffers前者可以直接從內(nèi)存映射讀取不需要反序列化解析這一步。這意味著模型加載速度更快內(nèi)存占用更低。你可以把FlatBuffers理解成一本可以直接翻到任何一頁的書而Protocol Buffers需要先把整本書翻譯一遍才能讀。委托化指的是硬件加速機(jī)制。TFLite本身只負(fù)責(zé)調(diào)度具體的計算可以委托給GPU、NPU、DSP等硬件加速器。這個設(shè)計讓TFLite在不同芯片平臺上都能吃到硬件紅利而不需要為每個平臺重寫推理引擎。量化優(yōu)先指的是TFLite從設(shè)計之初就把量化作為一等公民。它支持將FP32的模型權(quán)重和激活值轉(zhuǎn)換成INT8甚至INT4在精度損失可控的前提下大幅降低計算量和內(nèi)存帶寬需求。2.2 轉(zhuǎn)換流程的全局視角一個完整的TFLite集成流程大致是這樣的# 第一步訓(xùn)練并保存TensorFlow模型 model.save(my_model.h5) # 第二步加載模型并轉(zhuǎn)換為TFLite格式 import tensorflow as tf converter tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) tflite_model converter.convert() # 第三步保存轉(zhuǎn)換后的模型 with open(model.tflite, wb) as f: f.write(tflite_model)看起來只有三步但每一步都有大量細(xì)節(jié)可以展開。比如轉(zhuǎn)換時選擇哪種優(yōu)化策略、是否啟用代表數(shù)據(jù)集、如何處理不支持的算子、輸入輸出的shape怎么固定等等。這些細(xì)節(jié)決定了最終部署到設(shè)備上的效果。2.3 模型轉(zhuǎn)換的三種優(yōu)化級別TFLite提供了三種優(yōu)化級別通過converter.optimizations參數(shù)控制# 不做任何優(yōu)化保持FP32精度 converter.optimizations [] # 僅做權(quán)重壓縮運行時動態(tài)量化 converter.optimizations [tf.lite.Optimize.DEFAULT] # 全整型量化需要提供代表數(shù)據(jù)集 converter.optimizations [tf.lite.Optimize.DEFAULT] converter.representative_dataset representative_data_gen converter.target_spec.supported_ops [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] converter.inference_input_type tf.int8 converter.inference_output_type tf.int8這三種級別的選擇不是拍腦袋決定的需要根據(jù)你的硬件平臺、精度要求和開發(fā)周期來權(quán)衡。我后面會專門用一節(jié)來講量化策略的選擇。3. 模型轉(zhuǎn)換與量化實操全流程3.1 環(huán)境準(zhǔn)備與版本匹配在開始轉(zhuǎn)換之前有一個坑必須先說TensorFlow版本和TFLite運行時版本必須匹配。我見過太多次因為版本不一致導(dǎo)致的詭異問題比如轉(zhuǎn)換出來的模型在Python端能跑到了Android端就報OP_NOT_FOUND。推薦的版本管理策略# 創(chuàng)建獨立的虛擬環(huán)境 python -m venv tflite_env source tflite_env/bin/activate # 安裝指定版本的TensorFlow pip install tensorflow2.13.0 # 驗證版本 python -c import tensorflow as tf; print(tf.__version__)Android端的TFLite運行時版本也要對應(yīng)。如果你用的是TensorFlow 2.13那Android依賴建議用dependencies { implementation org.tensorflow:tensorflow-lite:2.13.0 implementation org.tensorflow:tensorflow-lite-support:0.4.4 implementation org.tensorflow:tensorflow-lite-gpu:2.13.0 }注意TensorFlow 2.13對應(yīng)的TFLite運行時是2.13.0但tensorflow-lite-support庫的版本號是獨立的目前最新穩(wěn)定版是0.4.4。這兩個版本號不要混淆。3.2 從不同格式的模型進(jìn)行轉(zhuǎn)換TensorFlow模型有多種保存格式TFLite轉(zhuǎn)換器對每種格式的支持程度不同SavedModel格式推薦這是最推薦的格式兼容性最好支持所有優(yōu)化選項converter tf.lite.TFLiteConverter.from_saved_model( path/to/saved_model, signature_keys[serving_default] )Keras H5格式適合快速原型驗證但某些自定義層可能轉(zhuǎn)換失敗converter tf.lite.TFLiteConverter.from_keras_model(model)Concrete Function格式適合需要精確控制輸入輸出的場景converter tf.lite.TFLiteConverter.from_concrete_functions( [concrete_func] )我個人的經(jīng)驗是如果項目還在實驗階段用Keras H5最方便如果要上生產(chǎn)環(huán)境一定要用SavedModel格式重新導(dǎo)出因為SavedModel保留了完整的計算圖信息轉(zhuǎn)換成功率最高。3.3 訓(xùn)練后量化的完整實現(xiàn)訓(xùn)練后量化是TFLite最實用的功能之一。它的核心思想是用一小批代表性數(shù)據(jù)跑一遍模型統(tǒng)計每一層激活值的動態(tài)范圍然后據(jù)此確定量化參數(shù)。import tensorflow as tf import numpy as np # 加載訓(xùn)練好的模型 model tf.keras.models.load_model(my_model.h5) # 定義代表數(shù)據(jù)集生成器 def representative_data_gen(): # 從訓(xùn)練集中抽取100-500個樣本 for i in range(100): # 假設(shè)輸入是224x224x3的圖像 data np.random.rand(1, 224, 224, 3).astype(np.float32) yield [data] # 創(chuàng)建轉(zhuǎn)換器 converter tf.lite.TFLiteConverter.from_keras_model(model) # 設(shè)置優(yōu)化策略 converter.optimizations [tf.lite.Optimize.DEFAULT] # 提供代表數(shù)據(jù)集 converter.representative_dataset representative_data_gen # 指定支持INT8算子 converter.target_spec.supported_ops [ tf.lite.OpsSet.TFLITE_BUILTINS_INT8 ] # 設(shè)置輸入輸出為INT8 converter.inference_input_type tf.int8 converter.inference_output_type tf.int8 # 執(zhí)行轉(zhuǎn)換 tflite_quant_model converter.convert() # 保存 with open(model_quant.tflite, wb) as f: f.write(tflite_quant_model)這段代碼有幾個關(guān)鍵點需要解釋代表數(shù)據(jù)集的數(shù)量官方建議100-500個樣本。太少會導(dǎo)致量化參數(shù)估計不準(zhǔn)太多則轉(zhuǎn)換時間過長。我的經(jīng)驗是200個左右是個不錯的平衡點。代表數(shù)據(jù)集的分布這一點極其重要。代表數(shù)據(jù)必須能覆蓋實際推理時可能遇到的所有輸入分布。如果你用貓狗圖片做代表數(shù)據(jù)集但實際推理時輸入的是風(fēng)景照量化后的模型精度會崩得很厲害。輸入輸出類型設(shè)置inference_input_type和inference_output_type為INT8后模型的外部接口也變成了INT8。這意味著你在Android端傳入的數(shù)據(jù)需要先量化成INT8輸出的結(jié)果也需要反量化。這一步很容易出錯后面會詳細(xì)講。3.4 量化前后的精度對比方法量化一定會帶來精度損失關(guān)鍵是要把損失控制在可接受范圍內(nèi)。我通常用以下流程來評估# 加載原始模型和量化模型 interpreter_orig tf.lite.Interpreter(model_pathmodel_fp32.tflite) interpreter_quant tf.lite.Interpreter(model_pathmodel_quant.tflite) # 準(zhǔn)備測試數(shù)據(jù) test_images load_test_images() # 假設(shè)有1000張測試圖 test_labels load_test_labels() # 分別推理并計算準(zhǔn)確率 def evaluate(interpreter, images, labels): interpreter.allocate_tensors() input_details interpreter.get_input_details() output_details interpreter.get_output_details() correct 0 for img, label in zip(images, labels): # 根據(jù)輸入類型做相應(yīng)處理 if input_details[0][dtype] np.int8: scale, zero_point input_details[0][quantization] img (img / scale zero_point).astype(np.int8) interpreter.set_tensor(input_details[0][index], img) interpreter.invoke() output interpreter.get_tensor(output_details[0][index]) pred np.argmax(output) if pred label: correct 1 return correct / len(labels) acc_orig evaluate(interpreter_orig, test_images, test_labels) acc_quant evaluate(interpreter_quant, test_images, test_labels) print(f原始模型準(zhǔn)確率: {acc_orig:.4f}) print(f量化模型準(zhǔn)確率: {acc_quant:.4f}) print(f精度損失: {(acc_orig - acc_quant):.4f})一般來說INT8量化帶來的精度損失在1%-3%之間是可以接受的。如果超過5%就需要考慮以下調(diào)整增加代表數(shù)據(jù)集的數(shù)量和多樣性檢查是否有某些層對量化特別敏感對這些層保持FP32考慮使用量化感知訓(xùn)練QAT而不是訓(xùn)練后量化4. Android端集成與性能調(diào)優(yōu)4.1 模型文件放置與加載Android端集成TFLite的第一步是把.tflite文件放到正確的位置。推薦放在src/main/assets/目錄下這樣會被打包進(jìn)APK運行時可以直接從AssetManager讀取。// 從assets加載模型 private MappedByteBuffer loadModelFile() throws IOException { AssetFileDescriptor fileDescriptor getAssets().openFd(model_quant.tflite); FileInputStream inputStream new FileInputStream(fileDescriptor.getFileDescriptor()); FileChannel fileChannel inputStream.getChannel(); long startOffset fileDescriptor.getStartOffset(); long declaredLength fileDescriptor.getDeclaredLength(); return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength); }用MappedByteBuffer而不是直接讀成byte數(shù)組的原因是內(nèi)存映射方式加載模型幾乎不占用堆內(nèi)存而且加載速度極快。對于大模型來說這個差異非常明顯。4.2 推理流程的完整實現(xiàn)public class TFLiteClassifier { private Interpreter interpreter; private int inputWidth; private int inputHeight; private int inputChannels; private int outputSize; private boolean isQuantized; public TFLiteClassifier(Context context) throws IOException { MappedByteBuffer modelBuffer loadModelFile(context); Interpreter.Options options new Interpreter.Options(); options.setNumThreads(4); // 設(shè)置線程數(shù) options.setUseXNNPACK(true); // 啟用XNNPACK加速 interpreter new Interpreter(modelBuffer, options); // 獲取輸入輸出信息 int[] inputShape interpreter.getInputTensor(0).shape(); inputHeight inputShape[1]; inputWidth inputShape[2]; inputChannels inputShape[3]; int[] outputShape interpreter.getOutputTensor(0).shape(); outputSize outputShape[1]; // 判斷是否為量化模型 isQuantized interpreter.getInputTensor(0).dataType() DataType.INT8; } public float[] classify(Bitmap bitmap) { // 預(yù)處理縮放和歸一化 Bitmap resized Bitmap.createScaledBitmap(bitmap, inputWidth, inputHeight, true); // 分配輸入緩沖區(qū) ByteBuffer inputBuffer; if (isQuantized) { inputBuffer ByteBuffer.allocateDirect(inputWidth * inputHeight * inputChannels); inputBuffer.order(ByteOrder.nativeOrder()); } else { inputBuffer ByteBuffer.allocateDirect(inputWidth * inputHeight * inputChannels * 4); inputBuffer.order(ByteOrder.nativeOrder()); } // 填充數(shù)據(jù) int[] pixels new int[inputWidth * inputHeight]; resized.getPixels(pixels, 0, inputWidth, 0, 0, inputWidth, inputHeight); if (isQuantized) { // 獲取量化參數(shù) Tensor inputTensor interpreter.getInputTensor(0); float scale inputTensor.quantizationParams().getScale(); int zeroPoint inputTensor.quantizationParams().getZeroPoint(); for (int pixel : pixels) { float r ((pixel 16) 0xFF) / 255.0f; float g ((pixel 8) 0xFF) / 255.0f; float b (pixel 0xFF) / 255.0f; // 量化 inputBuffer.put((byte) (r / scale zeroPoint)); inputBuffer.put((byte) (g / scale zeroPoint)); inputBuffer.put((byte) (b / scale zeroPoint)); } } else { for (int pixel : pixels) { float r ((pixel 16) 0xFF) / 255.0f; float g ((pixel 8) 0xFF) / 255.0f; float b (pixel 0xFF) / 255.0f; inputBuffer.putFloat(r); inputBuffer.putFloat(g); inputBuffer.putFloat(b); } } inputBuffer.rewind(); // 準(zhǔn)備輸出緩沖區(qū) float[][] output new float[1][outputSize]; // 執(zhí)行推理 interpreter.run(inputBuffer, output); return output[0]; } }這段代碼有幾個關(guān)鍵細(xì)節(jié)量化參數(shù)的使用scale和zeroPoint是從模型的輸入張量中讀取的。量化公式是quantized float / scale zeroPoint反量化是float (quantized - zeroPoint) * scale。這兩個公式必須記牢寫反了結(jié)果就完全錯了。ByteBuffer的字節(jié)序必須設(shè)置為ByteOrder.nativeOrder()否則在ARM架構(gòu)上會出現(xiàn)字節(jié)序不匹配的問題。線程數(shù)設(shè)置setNumThreads(4)在大多數(shù)中高端手機(jī)上能帶來2-3倍的加速。但要注意線程數(shù)不是越多越好超過CPU大核數(shù)量后反而會因為線程切換開銷導(dǎo)致性能下降。4.3 GPU委托的啟用與限制TFLite的GPU委托可以把卷積、矩陣乘法等計算密集型算子放到GPU上執(zhí)行通常能帶來3-10倍的加速。但GPU委托也有一些限制// 啟用GPU委托 GpuDelegate delegate new GpuDelegate(); Interpreter.Options options new Interpreter.Options(); options.addDelegate(delegate); Interpreter interpreter new Interpreter(modelBuffer, options);GPU委托的主要限制包括不是所有算子都支持GPU執(zhí)行不支持的算子會自動回退到CPU首次推理會有額外的初始化開銷適合需要連續(xù)推理的場景某些設(shè)備上的GPU驅(qū)動可能存在兼容性問題量化模型在GPU上的支持程度取決于具體設(shè)備我的建議是如果你的模型以卷積為主且需要連續(xù)推理比如相機(jī)實時處理GPU委托值得嘗試。如果是單次推理或者模型中有大量自定義算子CPU加XNNPACK可能更穩(wěn)定。4.4 性能調(diào)優(yōu)的實測數(shù)據(jù)以下是我在一個圖像分類項目上的實測數(shù)據(jù)測試設(shè)備為某中端安卓手機(jī)模型為MobileNetV2變體配置推理時間模型體積準(zhǔn)確率FP32 CPU 單線程420ms47MB92.3%FP32 CPU 4線程180ms47MB92.3%FP32 GPU委托65ms47MB92.3%INT8 CPU 4線程95ms12MB90.8%INT8 GPU委托48ms12MB90.8%從這組數(shù)據(jù)可以看出幾個規(guī)律多線程對CPU推理的加速效果顯著但邊際遞減GPU委托對FP32模型的加速比量化帶來的加速更明顯INT8量化在體積上的優(yōu)勢巨大47MB到12MB精度損失約1.5%INT8加GPU委托是綜合最優(yōu)方案但需要設(shè)備支持5. 常見問題與排查技巧實錄5.1 轉(zhuǎn)換階段的典型報錯問題一ConverterError: TOCO failed. See console for info.這是最籠統(tǒng)的報錯實際原因可能有很多。排查步驟檢查模型中是否有TFLite不支持的算子??梢杂靡韵麓a列出所有算子converter tf.lite.TFLiteConverter.from_saved_model(saved_model) tflite_model converter.convert() # 查看模型中的算子 interpreter tf.lite.Interpreter(model_contenttflite_model) interpreter.allocate_tensors() ops interpreter._get_ops_details() for op in ops: print(op[op_name])如果發(fā)現(xiàn)不支持的算子有兩種解決方案一是用支持的操作重新實現(xiàn)該層二是通過converter.target_spec.supported_ops添加SELECT_TF_OPSconverter.target_spec.supported_ops [ tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS ]但要注意SELECT_TF_OPS會增加運行時體積而且某些平臺上可能不支持。問題二量化后精度暴跌我遇到過一次量化后準(zhǔn)確率從91%掉到67%的情況。排查后發(fā)現(xiàn)是代表數(shù)據(jù)集的問題我用的是預(yù)處理后的歸一化數(shù)據(jù)但實際推理時傳入的是原始像素值。量化參數(shù)是基于歸一化數(shù)據(jù)統(tǒng)計的導(dǎo)致實際推理時數(shù)值范圍完全對不上。解決方法代表數(shù)據(jù)集必須和實際推理時的輸入預(yù)處理流程完全一致。問題三RuntimeError: Encountered unresolved custom op這通常發(fā)生在使用了自定義層的模型上。TFLite不支持自定義的Python層需要把自定義層用TFLite支持的基礎(chǔ)算子重新實現(xiàn)或者注冊自定義算子。5.2 部署階段的典型問題問題四Android端推理結(jié)果與Python端不一致這是最常見的問題之一原因通常有以下幾個可能原因排查方法解決方案輸入預(yù)處理不一致對比兩端的輸入數(shù)據(jù)統(tǒng)一預(yù)處理流程量化參數(shù)讀取錯誤打印scale和zeroPoint檢查量化公式圖像通道順序不同檢查RGB vs BGR統(tǒng)一通道順序歸一化方式不同檢查除以255還是127.5統(tǒng)一歸一化參數(shù)輸出反量化遺漏檢查輸出是否需要反量化補(bǔ)上反量化步驟問題五模型加載失敗或崩潰// 常見錯誤模型文件太大導(dǎo)致OOM // 解決方案使用MappedByteBuffer而不是byte數(shù)組 // 錯誤做法 InputStream is getAssets().open(model.tflite); byte[] buffer new byte[is.available()]; is.read(buffer); // 大模型會OOM // 正確做法 MappedByteBuffer buffer loadModelFile(); // 內(nèi)存映射問題六GPU委托初始化失敗GPU委托在某些設(shè)備上會拋出GpuDelegateFactory$Options相關(guān)異常。解決方法是在啟用GPU委托前先檢查設(shè)備兼容性try { GpuDelegate delegate new GpuDelegate(); options.addDelegate(delegate); } catch (Exception e) { // GPU委托不可用回退到CPU Log.w(TAG, GPU delegate not available, falling back to CPU); options.setUseXNNPACK(true); options.setNumThreads(4); }5.3 性能優(yōu)化的獨家技巧技巧一輸入分辨率的選擇模型輸入分辨率對推理時間的影響是平方級的。從224x224降到192x192計算量減少約26%推理時間通常能減少20%左右。如果精度允許適當(dāng)降低輸入分辨率是最直接的優(yōu)化手段。技巧二算子融合TFLite在轉(zhuǎn)換時會自動做算子融合比如把ConvBNReLU融合成一個算子。但有些融合需要特定條件才能觸發(fā)。你可以通過查看轉(zhuǎn)換后的模型結(jié)構(gòu)來確認(rèn)融合是否生效interpreter tf.lite.Interpreter(model_pathmodel.tflite) interpreter.allocate_tensors() for detail in interpreter.get_tensor_details(): print(detail[name], detail[shape])如果看到Conv2D后面直接跟ReLU說明BN已經(jīng)被融合了。如果BN還單獨存在可能需要調(diào)整模型結(jié)構(gòu)或轉(zhuǎn)換參數(shù)。技巧三預(yù)熱推理首次推理總是最慢的因為涉及到內(nèi)存分配、算子初始化等操作。在生產(chǎn)環(huán)境中建議在應(yīng)用啟動后先跑一次空推理做預(yù)熱// 應(yīng)用啟動時預(yù)熱 public void warmUp() { float[][] dummyInput new float[1][inputSize]; float[][] dummyOutput new float[1][outputSize]; interpreter.run(dummyInput, dummyOutput); }技巧四合理設(shè)置線程數(shù)線程數(shù)不是越多越好。我的經(jīng)驗值是設(shè)置為CPU大核數(shù)量通常4線程是個不錯的起點。可以通過以下代碼動態(tài)獲取int cpuCount Runtime.getRuntime().availableProcessors(); int threadCount Math.min(cpuCount, 4); // 最多4線程 options.setNumThreads(threadCount);6. 模型更新的熱替換方案6.1 為什么需要熱替換移動端AI應(yīng)用有一個很現(xiàn)實的痛點模型迭代頻率遠(yuǎn)高于App發(fā)版頻率。如果每次模型更新都要走應(yīng)用商店審核那迭代周期至少一周起步。熱替換方案可以讓模型文件獨立于APK進(jìn)行更新大幅縮短迭代周期。6.2 實現(xiàn)思路核心思路是把模型文件從assets中移到應(yīng)用私有目錄啟動時檢查是否有新版本模型需要下載。public class ModelManager { private static final String MODEL_DIR models; private static final String MODEL_NAME model.tflite; private static final String VERSION_FILE model_version.txt; public static File getModelFile(Context context) { File modelDir new File(context.getFilesDir(), MODEL_DIR); if (!modelDir.exists()) { modelDir.mkdirs(); } File modelFile new File(modelDir, MODEL_NAME); // 如果本地沒有模型從assets復(fù)制 if (!modelFile.exists()) { copyModelFromAssets(context, modelFile); } return modelFile; } private static void copyModelFromAssets(Context context, File dest) { try (InputStream is context.getAssets().open(MODEL_NAME); FileOutputStream fos new FileOutputStream(dest)) { byte[] buffer new byte[8192]; int length; while ((length is.read(buffer)) 0) { fos.write(buffer, 0, length); } } catch (IOException e) { Log.e(TAG, Failed to copy model from assets, e); } } public static void updateModel(Context context, File newModel) { File modelDir new File(context.getFilesDir(), MODEL_DIR); File dest new File(modelDir, MODEL_NAME); // 先寫臨時文件驗證通過后再替換 File temp new File(modelDir, MODEL_NAME .tmp); try { copyFile(newModel, temp); // 驗證模型可以正常加載 Interpreter testInterpreter new Interpreter(temp); testInterpreter.close(); // 驗證通過替換舊模型 if (dest.exists()) { dest.delete(); } temp.renameTo(dest); } catch (Exception e) { Log.e(TAG, New model validation failed, e); temp.delete(); } } }這個方案有幾個關(guān)鍵設(shè)計點先驗證再替換新模型下載后不能直接替換舊模型必須先驗證能正常加載。否則一旦下載了損壞的模型文件應(yīng)用就徹底不能用了。原子性替換通過臨時文件加rename的方式保證替換的原子性。即使替換過程中斷電也不會出現(xiàn)模型文件損壞的情況。版本管理建議在模型文件中嵌入版本號或者單獨維護(hù)一個版本文件方便回滾和灰度發(fā)布。6.3 模型完整性校驗下載的模型文件必須做完整性校驗防止傳輸過程中損壞或被篡改public static boolean verifyModel(File modelFile, String expectedMd5) { try { MessageDigest md MessageDigest.getInstance(MD5); FileInputStream fis new FileInputStream(modelFile); byte[] buffer new byte[8192]; int length; while ((length fis.read(buffer)) 0) { md.update(buffer, 0, length); } fis.close(); byte[] digest md.digest(); StringBuilder sb new StringBuilder(); for (byte b : digest) { sb.append(String.format(%02x, b)); } return sb.toString().equals(expectedMd5); } catch (Exception e) { return false; } }7. 多模型共存與內(nèi)存管理7.1 多模型場景的資源競爭在實際項目中一個應(yīng)用往往需要同時運行多個模型。比如一個相機(jī)應(yīng)用可能同時需要人臉檢測、場景識別、濾鏡風(fēng)格遷移三個模型。這時候內(nèi)存管理就變得很關(guān)鍵。每個TFLite Interpreter實例都會占用一定的內(nèi)存包括模型權(quán)重、中間激活值、輸入輸出緩沖區(qū)。如果同時加載多個模型內(nèi)存占用會快速上升。我的經(jīng)驗數(shù)據(jù)是一個10MB的INT8量化模型運行時內(nèi)存占用大約在30-50MB左右包括權(quán)重和中間激活值。如果同時加載3個這樣的模型內(nèi)存占用就超過100MB了在中低端手機(jī)上很容易觸發(fā)OOM。7.2 按需加載與釋放策略public class ModelPool { private LruCacheString, Interpreter cache; public ModelPool(int maxSize) { // 根據(jù)可用內(nèi)存動態(tài)計算緩存大小 int maxMemory (int) (Runtime.getRuntime().maxMemory() / 1024); int cacheSize maxMemory / 8; // 使用1/8的可用內(nèi)存 cache new LruCacheString, Interpreter(cacheSize) { Override protected int sizeOf(String key, Interpreter interpreter) { // 估算每個Interpreter的內(nèi)存占用 return estimateInterpreterSize(interpreter) / 1024; } Override protected void entryRemoved(boolean evicted, String key, Interpreter oldValue, Interpreter newValue) { if (evicted oldValue ! null) { oldValue.close(); // 釋放資源 } } }; } public Interpreter getInterpreter(String modelName, Context context) { Interpreter interpreter cache.get(modelName); if (interpreter null) { interpreter createInterpreter(modelName, context); cache.put(modelName, interpreter); } return interpreter; } private int estimateInterpreterSize(Interpreter interpreter) { // 粗略估算模型文件大小 中間激活值 // 實際項目中可以通過Tensor的shape計算更精確的值 return 10 * 1024 * 1024; // 假設(shè)每個模型約10MB } }7.3 推理隊列與并發(fā)控制當(dāng)多個模型需要同時推理時如果每個模型都開多個線程CPU會過度調(diào)度反而降低整體吞吐量。建議用一個統(tǒng)一的線程池來管理推理任務(wù)public class InferenceExecutor { private final ExecutorService executor; public InferenceExecutor() { // 根據(jù)CPU核心數(shù)創(chuàng)建線程池 int coreCount Runtime.getRuntime().availableProcessors(); executor new ThreadPoolExecutor( coreCount, coreCount, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue(10), // 限制隊列長度 new ThreadPoolExecutor.CallerRunsPolicy() // 隊列滿時在調(diào)用線程執(zhí)行 ); } public T FutureT submit(CallableT task) { return executor.submit(task); } public void shutdown() { executor.shutdown(); } }注意TFLite的Interpreter實例不是線程安全的。同一個Interpreter不能同時被多個線程調(diào)用。如果需要并發(fā)推理要么為每個線程創(chuàng)建獨立的Interpreter實例要么用鎖保護(hù)。8. 從集成到上線的完整檢查清單8.1 轉(zhuǎn)換階段檢查項在模型轉(zhuǎn)換完成后不要急著往設(shè)備上部署先做一輪完整的檢查模型文件大小是否符合預(yù)期量化后應(yīng)該顯著小于FP32版本輸入輸出shape是否與預(yù)期一致輸入輸出數(shù)據(jù)類型是否正確FP32還是INT8量化參數(shù)scale和zeroPoint是否合理在Python端用測試集驗證精度損失是否在可接受范圍內(nèi)用tf.lite.Interpreter在PC上跑一遍完整推理流程8.2 設(shè)備端檢查項模型文件是否正確打包進(jìn)APK模型加載是否使用了MappedByteBuffer輸入預(yù)處理是否與訓(xùn)練時一致量化模型的輸入是否正確量化輸出是否需要反量化線程數(shù)設(shè)置是否合理是否做了預(yù)熱推理內(nèi)存占用是否在安全范圍內(nèi)長時間運行是否會出現(xiàn)內(nèi)存泄漏8.3 性能驗收標(biāo)準(zhǔn)指標(biāo)合格標(biāo)準(zhǔn)優(yōu)秀標(biāo)準(zhǔn)單次推理時間 200ms 50ms模型體積 20MB 10MB內(nèi)存占用 100MB 50MB精度損失 3% 1%連續(xù)推理穩(wěn)定性無崩潰無發(fā)熱降頻8.4 我踩過的最大的坑最后分享一個我踩過的最大的坑有一次項目上線后用戶反饋在某些機(jī)型上推理結(jié)果完全錯誤但在測試機(jī)上一切正常。排查了整整兩天才發(fā)現(xiàn)問題出在圖像預(yù)處理上。測試機(jī)上用的Bitmap配置是ARGB_8888但某些機(jī)型默認(rèn)返回RGB_565導(dǎo)致通道數(shù)據(jù)讀取錯位。解決方案是在讀取像素前強(qiáng)制轉(zhuǎn)換Bitmap配置Bitmap safeBitmap bitmap.copy(Bitmap.Config.ARGB_8888, false);這個問題的教訓(xùn)是不要假設(shè)所有設(shè)備的默認(rèn)行為一致。在涉及像素操作、內(nèi)存布局、字節(jié)序這些底層細(xì)節(jié)時一定要做防御性編程。另一個值得分享的經(jīng)驗是關(guān)于量化模型的選擇。我一開始追求極致的模型體積用了全I(xiàn)NT8量化結(jié)果在某些低端設(shè)備上精度下降明顯。后來改成混合量化對精度敏感的層保持FP16其他層用INT8。模型體積從12MB增加到18MB但精度恢復(fù)到了91.5%而且推理速度幾乎沒有變化。這個權(quán)衡在實際項目中往往比追求單一指標(biāo)更有價值。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
超碰在线91| 这里只有97精品| 亚洲欧美校园| 欧美婷婷五月天| 亚洲丰满很很操| 欧美伊人久久综合网| 热天堂一区二区| 欧美色图电影| 亚洲自拍一区夜夜操| 一级日本牲交大片好爽在线看| 97AV在线免费观看| 91香蕉国产尤物视频| 欧美中出| 偷拍亚洲高清图片| 麻豆人妻偷人精品无码视频| 亚洲人精品久久久喷水| 蜜臀99精品国产高清在线观看| 婷婷五月天激情网| 欧美gv在线观看| 影音综合网| 五月婷婷六月丁香| 中文字幕精品一区二区精| 中文字幕综合人妻| 少妇蜜汁| 五月天综合网| 亚洲午夜av| 国内伊人久久久久久网站视频| 日本免费一区二| 不卡免费av在线播放| 精品人妻一区二区三区免费视频| 怡红院成人av| 超碰1024久久| 九九九九九用不成了| 激情五月天丁香社区| 日韩无码精品综合久久| 欧美图片色五月天| 人人操AV| 精品然女一区二区| 日韩高潮一区| 国产麻豆91欧美一区二区久久婷婷国产精品 | 97一区二区蜜臀| 久操视频资源站公开| 欧洲亚洲人妻无码高清久久三区四区| 无码人妻丰满熟妇区毛片| 激情综合五月天| 亚洲图片欧美在线视频| 男人天堂一区二区| 婷婷色综合| 91超级碰碰| 无码人妻精品一区二区三区99不卡| 久久精品中文| 精产国品一区二三产品| 99色综合| 天天操av懂色| 另类小说五月天| 最新中文字幕精品在线| 国产午夜在线观看| 久久亚州精品成人Av无| 天天摸夜夜添无码小视频| 亚洲熟女诱惑| 精品无码久久久久久久久果冻糖心 | 四虎精品亚洲| 91痴汉| 大逼色网站| 91bbbbbb| 免费无码国产精品v片在线观看| 啊啊啊啊啊在线| 久久精品女同亚洲女同13| 中文字幕人妻色偷偷久久皮| 毛片中心9视频99| 四虎AV在线观看| 中文字幕精品一区二区精品| 人妻少妇精品一区二区三区| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 97国产人人| 欧美999| 五月婷网站| 69视频入口| 欧美黑人熟妇精品91| 91在线丝袜| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | www.色五月| 中文字幕一二三区| 男人下部插入女人下部| 啊啊啊啊啊啊啊啊啊在线观看| 国产青青综合伊人| 操操啪| 亚洲av总站| 中文字幕AV片| 91天天看| 亚洲一区二区精品福利| 久色网| 色欲色香天天天综合网www-亚洲综合国| 亚州高清av| 91P0RNY大屁股人妻| 久久大| 男人高清无码一区二区| 中文字幕在线高清男人的天堂| 亚洲老熟妇xxx| 懂色AV中文| 久久熟女精品不卡一区| 免费看A片毛毛片在线播| 久久婷婷五月综合| 情色五月天网| 嗯啊视频免费在线观看| 精品少妇一区二区三区免费观看| 大香伊人在线一区| 最近二区三区视频大全| 亚洲欧洲日本精品中文a∨| caoni国产亚洲av| 操死我了嗯嗯嗯| 亚洲黄色网址| 国产一区二区啪啪视频| 精品v1区| 在线播放成人高清免费视频| 综合网,亚洲,欧美| 天天网综合| 亚欧高清在线| 亚洲成人av色网| 九九亚洲精品| 91深夜夜| 欧美色图 人妻| 亚洲阿v天堂在线| 强奸乱伦Av网| 很很很很操| 九九热av| 国产后入精品| 呦呦影院| 综合视频91| 亚洲图片日本AⅤ欧美在线| 性色一线| 日日97| 日本午夜久久电影| 91肉丝| 极品色社| 操逼大黄片| 97在线无精品| 五月激情啪啪| 人妻另类 专区 欧美 制服| 夜夜操狠狠操| 亚洲一区在线观看欧洲| 国产妇女精品视频青青草| 国产精品人人爽人人做可爱福利| 蜜屁Av| 最近2019中文字幕国语免费版| 精品无码人妻一区二区免费蜜桃| 日本日皮视频逼| 成人精品视频一区二区| 能在线播放的国产三级| 丝袜美腿91| 丁香婷婷大香蕉| 欧美性夜| 97一区二区三区视频| 国产成人免费观看在线视频| 久操免费观看| 黑丝日韩av丝袜av| 國產尤物AV尤物在線觀看| 午夜精品久久久99热蜜桃的功能特点| 99久久久er直播网址| 亚洲欧美综合网站| 97大色网| 精品国模无码| 日日噜噜夜夜久久亚洲一区二区| 日韩草久视频| 成人av福利在线观看| 欧美亚洲宗合色性图| 免费a在线播放v| 亚洲丝袜在线观看| 欧美色图天堂网m| 91午夜无码| 久草成人影片| 亚洲熟女一区| 3571色综合一区二区二区| 亚洲无码偷拍| 不卡六六在线91| 天操天操夜操夜月操月年年操| 家庭乱伦国产| 91成人无码| 鸥美插入视频| 蜜桃成人1区2区3区| 国产97色在线| 91情色在线| 蜜桃精久三区| 久久久久免费少妇| 丁香婷婷久久 | 婷婷五月天av| 无码精品久久久天天影视 | www.婷婷五月天| 午夜一级免费毛片| 国产精品96| 超碰在线综合97| 国产美女91视频| 天天色综合图片| 看一级特黄a大一片| 亚洲中文字幕精品一区| 日本大香蕉综合网| 日本道日本道中文字幕日本道最新日本道在线观看 | 99国产精品久久久久久久成人热| av中文字幕在线熟女| www黄片免费看com| 国产亚洲精品美女久久久久久2021| 2019天天干| 亚洲 欧美综合| 亚洲操操操| 操逼逼无码| 人妻夜夜爽天天爽三区麻豆AV网站| 最新精品久久蜜桃| 天堂日本亚洲欧美| 久久久91| 99性爱在线观看| 久久受www免费人成| 日本九九九九| 综合网亚洲在线| 一区,二区,三区网站| 操操AV电影| 岛国成人av在线播放网址| 日韩簧片免费看| 少妇综合| WWW.操逼.COM| 国产AAAAAABBBBB| 久九干| 天天看片天天爽| 九九毛片这里只有精品| 九久9热| 老色69| 曰韩精品九九无码| 啊啊啊啊啊啊啊国| 男女91| 天天天乱色综合全| 欧美线天码中字| 国产91丝袜 在线播放| 九九九久| 欧美黄业| 日韩美女操b| 91人妻精华帖| 女同性恋久久| 日韩一级二级三级免费看完整版国语版| 久久婷婷一区二| 天天天天干| 亚洲欧美精品一区天堂久久 | 99爱久久视频频| 97色视频在线| 91天天爽| 夜夜骑夜夜操| 视频在线观看免费一区二区三区| 久久草在线综合视频| 丁香婷婷久久 | 久久久久九九九| 中日韩一区二区三区欧美| 日韩日本欧美在线观看| 大香网站| 亚洲免费97免费| 嫩草黄页| 日韩激情毛片一级久久久| 久久精品国产AV一区二区三区| 3d成人精品一区二区| 亚洲免费人妻在| 91oumei| 天天爽夜夜欢视| 午夜精品久久久久久久| 亚洲男人天堂av| 婷婷丁香九月| 亚洲中文字幕97久久精品少妇| 在线啊啊啊啊| 女人18精品一区二区三区| 熟女人妻精品一区二区视频| 老司机天天操| 欧美老熟另类| 97爱爱官网| a片偷拍视频| 国产欧美日韩在线不卡第一页| 亚洲色图欧美色图制服丝袜| 天天干夜夜鈤| 综合操逼| 青青草国产一区二区三区| 伊人国产成人av网站| 日韩欧美国产高清视频| 国产久久日| 亚洲 暴爽 AV人人爽日日碰| 亚洲欧洲综合视频在线| 久久精品人妻一区二区三区| 在线观看岛国有码| 红桃视频高潮| 人人操人人肉久久精品| 久久九九99| 偷拍色图| 亚洲欧洲网站免费观看| 天天舔天天日天天射| 超碰色综合| 强奸xx国产| 玖玖大干人妻| 精品一区二区亚洲国产| 久日91在线| 俄罗斯及免费在线看| 久综合网| 一二区在线观看视频| 国产一区在线观看无码AV| 伊人大香蕉在线| 后入国产| 午夜人妻精品综合在线| 精品少妇99| 蜜臀操逼黄色视频操的好爽| 偷拍综合亚洲| 色噜噜精品一区二区三| 欧美日韩人妻少妇 一区二区三区| 伊人嫩草| JULIA一区二区三区在线播放| A啊啊在线观看| 在线观看不卡一区二区三区| 五月婷婷hd| 五月天激情网图片| 欧洲大香蕉| 青椒国产97在线熟女| 安徽熟妇视频| 国产宅男宅女在线观看| 欧美天天在线| 99热这里只有精品99| 综合欧美色图| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 青青草大香蕉视频| 96久久科窝| 亚洲一区二区在线观看91| 综合国产97| 国产亚洲精品激情| 中文熟女五十乱码在线| 91九九| 久久春色| av天天在线| 香蕉人人操tv| 亚洲国产熟妇综合色专区| 艳美熟妇先锋一二三区| 日韩精品国产一区二区| 欧美成人精品一区二区男人蜜臀| 夜夜夜久久| 天天插夜夜操| 天天综合网~91| 色诱中文字幕| 色欲天天综合网| 九九九精品| 中文字幕女同在线| 天天干天天操天天拍| 脫衣舞一区二区三区| 黄站在线免费观看| 一区二区 电影 亚洲| 日本123区操B视频| 免费中文综合精品| 91狠狠综合久久| 亚洲宗合电影| 色噜噜狠狠色综合日日| 欧洲站一级二级三级h| 性久久久| 少妇九九九九| 91殴美大片| 精品国产精品一区二区| 黄色香蕉视频网站一区| 人妻少妇精品久久久久久| 麻豆乱码久久精| www欧美性爱| 八戒午夜福利理论片| 四虎免费在线播放| 1二区9| 发朗少妇买婬全视频中文| 黄色激情电影在线观看| 亚洲影视综合| 超碰精品97| 噜噜噜亚洲精品| 爆乳免费黄网站| 不卡啪啪视频| 美女操逼福利视频| 中文字幕在线观看永久| 青娱乐淫乱1314| 蜜臀Av一区二区三区| 国产九区| 青青操在线亚洲视频观看欧美在线| 超碰人妻在线| 99热超碰| 9久超碰| 91人妻PORNY九色大屁股| 精品人妻av在线播放| 亚洲一区二区三区春色| 91麻豆天美| JuliaAnnXXX888| 亚州,欧美在线| 日韩毛片9| 欧美亚洲激情一二三| 日本A级视频| 人人污日韩一区二区| 国语人妻精彩刺激| 怡红院视频在线| 日韩人妻资源在线看| 97色色色| 嗯嗯啊啊操死我| 九九精品美女高溯喷水| 亚洲色图20p| 国精综合一二三区影视| 免费成人在线熟妇网| 97AV在线免费观看| 五月天加勒比啪| 新视频sss国产| 亚洲熟女一区| 青青草依人大香蕉| 色与欲影视| 成年人黄色| 亚洲 暴爽 AV人人爽日日碰| 欧洲性爱无码区| 久久亚洲中文字幕视频| AAAAAAAAA黄片| 乱伦系列一区二区| 亚洲高潮少妇| 成人色女网| 少妇内射www在线观看视频| 偷拍综合亚洲| 亚洲色电影在线| 黄色无码高清黄色无码网站| 日本欧美一区二区三区免费| 女人高潮大叫一级毛片| 人人色人人射人人妻| 免费9 1久久| 人妻熟妇久草在线| 青青草福利视频| 高潮毛片无遮挡高清免费| 很很热性爱视频| 2010男人的天堂| 亚洲免费97免费| www. 男人天堂成人在线| 国产青青综合伊人| 午夜精品久久久久久久久久蜜桃| 国产精品久久伊人| 精品国产91久久久久久一区黄无| 色97国产69香蕉| 天天干嫩逼网| 日本国产欧美高清在线| 91亚洲不卡一区| 国产九九九九九九| 亚洲天堂在线怕怕视频| 一区二区三区机械有限公司| 校园春色欧美色图| 狠狠爱夜夜| 久久精品中文字幕观看| 国语人妻精彩刺激| 久热精品在线| 日本女优在线视频福利| 麻豆天美制片厂网站视频| 蜜区区视频79| 亚洲va有码在线天堂| 鲁鲁色综合网| 有码专区最新中文字幕有码| 91成人在线免费视频| 久久综合18p| 中韩中文字幕在线观看| 免费操逼视频下载| 97这里只精品| 日韩簧片免费看| 天美av在线观看| 9久9久9久9久视频网站| 国产精品自在线发布| 日本少妇va7777| 易易A毛视频| 亚洲经典啪啪| 亚洲久久东京热一二三四五区视频| 久久久性| 第四色亚洲色图| 成人怡红院| 婷婷五月色| 疯操AV| 深夜国产一区二区三区在线看| 91红杏| 久96热在线观看视频| 97国产超湿| 一区二区视频在看| 亚殴在线| 2020久久免费视频| 日本免费不卡二区| 91综合在线| 久久色激情一区二区三区| 一本久道久久综合狠狠爱一密臀精| 精品国产久热在线观看| 一区二区三区男人的天堂| 久久婷婷综合国际产色怕| 五毛骚逼极品美女怕怕| 亚洲成人福利电影免费| 96精品一区| 白嫩国模丰满一二三区| 91色欧美| 国产精品一区人妻精品阁在线| 亚洲欧美伦综合| 天天舔天天| 又大又大又大又粗爽高潮观看| 日本人体九九九九九九| 日韩欧美性吧婷婷乱伦大香蕉 | 国产人伦精品一区二区三区 | 91美女视屏| 国产午夜福利专区综合| 国产精品人妻无码久久久互動交流 | 奸色色 男人天堂 天天射| 男女性感激情网站| 操日韩第| 无码操逼网| 18禁精品网站在线看| 人人人摸人人| 无码久久亚洲高清,| 葡萄牙性视频一二区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 婷婷五月天在线观看| 一区二区三区精品视频| 久久肏大逼| 九九色逼| 六月天婷婷| ′ !γ}丶。。久久精品欧美一区二区三区| 久久色情| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 丁香啪啪| 久操在97| 欧美天天在线| 久久午夜色播影院免费高清| 思思热国产高清| 夜夜操美女| 天天视频综合在线观看视频| 国产农村一一级特黄毛片| 天堂种子在线www网资源| 99啪啪| 日本天天人人狠狠在线日美女 | 久久伊人网视频一区二区三区| 国产精品午夜成人福利| 久久久∴| 国内伊人久久久久久网站视频| 欧美A片中文字幕| 无码黑人精品一区二区三区三| 97在线亚洲| 蜜乳AV一区| 大香蕉婷婷| 精品免费1| 香蕉免费一区二区三区不读| 殴美色网| 亚洲欧洲中文日韩女优乱码| 亚洲精品美女久久久久久久久| 99久久九九| xxx亚洲午夜天堂| 日韩精品国模| 黑人娇小av在线播放| 精品性爱一区二区| 国产精品suv一区| 欧成人在线| 第四色奇米影视777| 天天色播| 中文字幕欧美精品亚洲日韩蜜臀| 天天草夜夜草高潮片| 好淫网一二三视区| 男人的天堂VA| 玖玖97综合 | 日韩激情毛片一级久久久| 俺去俺来也在线www| 67194无码不卡| 日本韩高清无砖码22o| 999狠狠综合| 五月香婷婷| 国产视频一区二区三区在线免费观看| julia高潮后不停追击中出| 校园春色综合香蕉| 欧美日韩性爱无码| 欧亚日本情色| 99精品视频在线观看| 欧美少妇色图| 欧美日韩大陆黑人少妇99| 精品国产一区二区三区在线播出| 99re8超碰| 26uuu性物| 一本久久精品中文字| 亚洲一区日韩| 神马九九| 丁香五月天堂| 大乔未久88一区| 色官网在线| 嗯嗯嗯好爽| 20cm女自慰在线日韩欧美| 综合啪啪| 嗯嗯嗯嗯啊啊啊好紧好大| 婷婷五月天色| 四季AV综合网址| 风间由美日韩欧美久久| 久操大香蕉手机视频在线看 | 国产日韩无码一区二区三区久久区| 亚洲综合中文字幕有码| 97天天摸天天碰| 淫淫综合网| 久久精品夜色国产亚洲AV| 97在线播放| 操迟操逼在巾线Fre看| 精品国产一区二区三区在线播出| 一区黄二区黄| 黄色AAAAA欧美| 酒色综合网| 另类欧美色| 欧美日韩色图片| 熟女乱3伦999| 十八禁一区二区无码观看| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 动漫片子网站3黄| 天天爽天天操| 久久久涩| 人妻少妇精品一区二区三区| 亚洲图片欧美色| 久湿久久| 最近的最新的中文字幕视频| 精品少妇一区二区三区| 亚洲日韩av专区无码| 91欧美偷拍| 欧美日韩操操操| 91性网| 大香蕉在线免| 五月丁香影院| 欧美成人一级免费电影| 91老熟女| 人伦四五区| 亚洲色香| 伊人97超碰| 2020国产精品| 亚洲精品影视老司机| 亚洲精品久久久久毛片A片拉屎| 中文字幕第23区| 日韩一999精品| 六月丁香啪啪啪| 热99这里只有精品| 亚洲第2页| 超碰成人公开| 不卡六六在线91| 亚洲色 国产 欧美 日韩| 97精| 久一区久久蜜桃| 日韩人妻无码不卡网站| 蜜臀在线网站| 久久久少妇诱惑精品视频| 国产熟妇一区二区| 日欧美色| 欧美成人色| 91天美传媒在线观看| 亚洲限制级| 99www.bibizy香蕉资源国产一区二区三区高清| 欧美在线视频99| 亚洲人成网www| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 国产精品播放| 99999国产| 99啪啪视频| 中文字幕在线免费观看2| 欧美成人一区二区三区在线播放| 天天色综合图片| 青青草视频在线观看一区二区| 加勒比东京热五月天天堂网| 色五月av| 在线有码中文字幕| 尻女朋友一夜| 在线日韩日本亚洲国产| 久久久久国产一区二| 亚洲激情综合| 男人的天堂2019AV| 加勒比av官网在线| 亚洲偷拍自拍在线视频| 翔田千里A片一区二区| 丁香六月激情| 久久久久久久久女黄| 精品无码一区二区人妻久久蜜桃| 太久视频| 神马久久69| 男人的天堂在线2| 日韩一级特黄av毛片| 中文字幕精品资源在线| 懂色av中文字幕一区二区三区天美 | 五月丁香色综合| 亚洲素人综合| 久久激情亚洲精品无码?V| 春色校园综合网| 97在线观看| 乱理日韩中文| 精品人妻一区二区视频| 职场同事知名国产国产精品久久欧美日韩| 26uuu国产日韩综合在线观看| 久久综合久色欧美综合狠狠 | 亚洲色图第一页| 日韩精品黄片免费观看| 香蕉精品二区二区| 九九九久千久久激情蜜桃在线看| 午夜男女爽爽大片免费观看| 毛片视频白嫩| 岛国视频一二三区| 九九九九97| 99久久99九九99九九九| 人人妻人人爽一区二区三区| 国产后入精品| 人妻少妇被猛烈进入中| 欧美一二级| 久久婷婷在线观看视频| 久久精品中文字幕观看| 青青草大香蕉视频| 日日干男人的天堂| 日韩av女优在线免费一区| 国产精品亚洲一级av第二区| 91熟女.com| 亚洲最大黄网| 毛片电影一区二区三区| 你懂的在线观看区国产| 综合少妇网| 麻豆精品A片免费观看| 天天爱天天操| 中文字幕免费看大片| 51久久夜色精品国产麻豆| 亚洲国产中文字幕| 五月天综合网| 精品久久久久瑟瑟| 色婷婷成人| 在线观看成人性爱免费小视频| 久操视频在线观看| 欧美在线亚洲| 99精品无码| 欧美偷偷网| 中文字幕人乱码中文字的预防方法 | 久插综合| 久久九九一区二区三区成人| 开心激情站| 婷婷在线视频| 91丝袜在线观看视频在线观看| 亚洲天堂久久| 97爱免费插| 国产精品交换一区二区| 九九色综合| 精品一区二区3区| 午夜情侣自拍网站| 97精品国产97久久久久久| 无码9区| 日本熟妇熟色97一本在线观看| 婷婷导航| 久视频在线观看| 爆乳免费黄网站| 久久久久久九九九九-美女久久久久久久-成人AV | 秋霞曰韩R级| AV电影在线播放| 97人妻碰碰中文无码久热丝袜| 色五月大香蕉| 日韩97视频!在线| 中文字幕78| 欧美性高潮| 男女无套 免费网站| 国产Aα| 91干熟女| 久操操| 亚洲偷拍欧美激情| 日韩本不卡视频在线观看| av影片在线观看不卡| 精品久久久久久无码| 国产精品成人蜜臀AV在线| 91日日| 蜜臀久久久99久久久久 | 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 影音先锋乱伦资源| 婷婷五月天成人网| 强奸熟女一区二区三区| 一级性爱网| 这里都是精品在线观看| 久久久中文版| 日本不卡一区二区| 91精品伊人久久久大香线蕉91| 一区黄二区黄| 青青久久艹| 2019天天干天天操| 久久久久一本一区二区青青蜜月| 中文字幕视频二区| 国产粉嫩出水在线播放| 久久夜嗨| 手机在线中文字幕国产| 色狠狠综合噜一二三区| 国产兽交视频在线播放| 国产视频三区四区| 深喉吞精| 国产成人免费观看在线视频| 国产性爱欧美性爱在线| 亚洲激情深爱文学小说网站| 搡老女人老熟女91老熟女综合网| 91久久久亚洲| 亚洲综合九九| 青青伊人加勒比海| 色综合一区二区三区| 青青操狠狠撩| 99re99视频在线免费观看| 欧美色图第一页| 1024人妻熟女一区二区三区| 91狠狠综合久久久久久| 日本色色色视频| 超硑97精品| 欧美日韩97| 五月天色色网站| 九九九精品一区二区无码| 国产高清自拍视频| 久久人妻丝袜一区二区三| 久久是精品| 亚洲中文国际强奸字幕| 欲香欲色天天天综合和网| 天堂v无码免费视频| 欧美色婷婷| 日韩精品资源| 国产成人精品亚洲日本| 久久噜噜噜精品国产亚洲综合| 国产精品一级毛片不卡视| 狠狠躁天天躁日日躁| 再深点灬舒服灬太大了添视频| 蜜臀AV成人精品蜜臀AV久久| 日韩精品资源专区二区| 欧美狠狠弄| 九九热久久99精品re| 欧美激情久久久久| 美女一区二区国产精品| 九九五月天| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 欧美日日人人天天| 免费视频无码| 五码视频在线观看| 国产又大又粗又长视频| 天天日B狠狠操| 亚洲成人av电影在线| 人人操人人摸超碰| 91黑丝美女| 五月丁香六月| 欧美精品日韩久久久九 | 欧美性生活男人的天堂| 青青草一区二区三区四| 婷婷三区| 操99| 涩涩涩综合| 国内一级精品| 国产一区二区精品在线视频| 日本 成 人 小说 电影 一区二区| 欧美日韩啪啪电影| 亚洲交性| 91精品国产长腿丝袜美女| 日韩天堂av电影在线观看| 欧美亚洲中文字幕| 96精品久久久久中文字幕| 久久婷婷五月| 色牛牛AV| 亚洲一区二区精品福利| 亚洲色图尤物视频| 高清在线偷拍自拍视频| 一级特级aaaa毛片免费观看 | 神马久久啊啊| 午夜欧美神马久久久久| 青青草综合在线| 天天夜躁日日躁狠狠2002| 九九九国产精品| 97天天插| 爱丝福利| 999久久久久久久久| 精品少妇高潮久久| 国产精选视频| 一区二区视频在看| 97天堂| 一级乱伦网站| 性久久久| 黄片不用下载在线观看| 717影院理论午夜伦八戒| www色色com| 青青草日本无码| 岛国AV一区二区电影| 91九色丨国产丨爆乳| 综合久欧洲| 九九九网站| 日韩性爱1级片视频| 把腿张开老子CAO烂你| 国产成人精品必看| 亚洲综合在线91| 久久9久| 日欧操屄视频| 91国产丝袜美女| av在线不卡一区二区三区| 91人妻尻屄视频| 青娱乐欧美激情一区二区| 国产福利精品98视频| 69精品| 96久久久久久久| 国产999精品久久久| 亚洲第一视频 欧美风情 日韩| 麻豆精品天美| k频道色撸撸| 色眯眯av| 亚洲欧洲激情| 亚洲极品| 青青草国产一区二区三区| 射丝袜大香蕉| 亚洲国产福利视频| 69一区二区三区| 91 综合 色| 男人的天堂不卡一区二区| 97欧美色综合| 2017超碰| 在线观看一级α片刺激高潮视频| 看黄片视频免费| ,国产乱人伦精品一区二区三区| 加勒比综合a∨| 日韩高清黄片| 欧美色图片91| 一区在线精品中文字幕| 大香蕉啪啪啪| 97在线公开视频| 探花激情视频| 亚洲欧美激情小说| 欧美专区日本专区| 97在线观看免费| 天天天天天天天天天天干美女| 欧洲一区二区三区免费| 无码免费在线观看黄色片| 久久97资源 网| 9国产超碰| 啊啊啊啊二区好大| 国产aⅴ无码片毛片一级网站| 国模不卡一本二本三电影| 一区AV| 综合av影片| 发朗少妇买婬全视频中文| 新视频sss国产| 蜜臀久久99精品久久久久| 黑人狂躁日本妞一区二区三区| 中文字幕人乱码中文字的预防方法 | A V少妇特黄三级| 俺去俺来也在线www| 国产乱伦亚洲| 中出在线视频| 性站| 天堂无码精品国产久| 亚洲做性| 少妇天堂网络| 欧美综合区| 黄色AV免费| 天天天操天天天爱| 91蜜臀熟女| 天天操天天舔| 2023天天操夜夜操| 超碰这里有精品| 亚洲天堂另类美腿| 国产剧情AV不卡在线观看| 亚欧成人一级片在线播放| 亚洲美女色图| 性色乱AV一区二区| 国产无马av| 在线观看无码三级少妇| 亚洲 欧美 色图| 大香蕉2017| 大香蕉啪啪啪啪在线| 黄页大片在线观看| 国产精品久久久久久久久久久久久久久久久久 | 不卡免费av在线播放| 亚洲第一无码播放立川理惠| 久久久久久国产精品免费网站| 一区二区三区视频国产免费| 91成人精品在线播放| 色色香蕉| 五月婷色| 91在线免费观看处女| 97青娱乐超碰久久| 欧美综合狠| 不卡视频一区蜜桃视频 | 亚洲一区操| 亚洲一卡二卡在线免费| 久草免费福利在线播放| 日本一区二区做爱的视频| 99综合| 久久25| 97视频在线视频| JuliaAnn丝袜熟女系列| 91被操| 激情综合亚洲| 91处女视频在线观看| 素人伊尹大香蕉免费下载视频| 国产精品久久久久婷婷二区次| 操婢日韩| 欧美综合站| 天天干夜夜肏| 国产美女自拍AV| 操99| 九九九九免费高| 日韩免费中文字幕视频| 综合久久婷婷| 久久精品99久久久久久| 天天综合欧美| 91精品人妻电影| 台湾佬中文娱乐自偷自拍| 精品乱码在线观看| 精品久久久久久无码| 天天插天天插| 欧美精品亚洲精品日韩传电影| 欧美五十路熟| 久操九九九九| 亚洲麻豆av一区二区| 色官网色综合| 偷拍亚洲高清图片| 69一区二区三区 | 色五月AV在线| 亚洲国产一区二区入口| 久热69九色熟妇97| 亚洲国产天堂| 99免费在线视频| 乱人乱色一区二区三区免费| 久久成人午夜精品影院| 亚洲男人的天堂AV| 男女日B国产| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 青青草女人天天干| 免费在线观看国内色片网站网址| 媚薬在线视频麻豆| 国产一级不卡在线观看| 国产地址二三| 国产真实野战在线视频| 超碰97在线中文| 在线观看黄色电话| 国产午夜精品一区二区三区牛牛| 国产免费永久精品无码| 伊人网高清| 欧美中文字幕男人天堂久久精品| 人妻丝袜美腿中文字幕| 大香蕉 222| 成人性爱电影网| 搞中出视频在线观看| 国产在线观看一区二区三区| 夫妻四区五区六区| 国产精品久久久久久久AV大片 | 男女啊啊啊啊啊| 色999人与兽| 一级做a爰片久久毛片图片| 福利五区| 久久a久久| 日美免费黄片| 久久69| 操屄日韩| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 无码99| 色婷亚洲五月在线观看| 男人天堂网址| 精品少妇一区二区三区| 亚洲大色堂| 日韩pv中文| 欧美顶级黄片AAAAA在线免费看| 九热中文字幕| 日本 情色 1区| 国产精品电| 福利一级版子| 精品视频专区| 欧美黑人猛交春色影视大全| 五月丁香社区婷婷日韩欧美精品影院| 91爱| 色九久| 九九九九AV| 五月天伊人网| 外国免费性情大片| 久9爱精品| 蜜臀中文无码午夜| 女人天堂网| 一本大道久| av橘色网站| 精产品久久| 色综合大香蕉| 99re99| 国产区日韩区在线观看| 网友自拍第一页| 1769成人国产精品视频| 少妇一级无码精品| 国内偷自视频区视频综合 | 97最新在线播放视频| 国产强奸超碰AV| 免费一级欧美片片线观看| 欧美精品日韩一区二区| 久久久久久久人妻| 久久免费中文字幕在线观看| 久九干| 天天综合麻豆视频| 欧美精品激情| 明星性猛交ⅹxxx乱大交| 亚洲欧美精品国产一区二区| 精品久久久久久中文| 久久久中文| 最新亚洲风情电影| 日本天天干天天日一区| 有码专区最新中文字幕有码| 91久久青青草原精品| 久久直播国产| 日本免费一区二| 超碰 欧美| 国产一区二区三三视频| 亚洲国产激情国产av| 久久久久国产精品久久久| 久热影视| 偷拍伦理视频| 三级激情网站| 久久久久性熟视频| 国产丁香精品露脸视频 | 91操人视频| 亚洲欧美国产va在线| 日本一级真人黄色性爱视频| 国产精品第二页| 久久99999| 在线不欧美| 亚洲欧美中文日韩视频中国语| 综合干干干av久久久综合网| 久久久偷拍| 国产一区二区三区影片| 天天干天天日天天射黄色片| 中文字幕蜜乳av| 亚洲色图91欧美日韩| 欧美激情精品久久久久久| 操逼逼福利视频| 久久夜精品一区二区三区| 两女互慰AV高潮喷水在线观看| 超碰97精品在线| 亚洲天堂久久久久久粉红视频| 亚洲男人的天堂亚洲| 91在线观看,天天综合| 9999九九九久久久| 成人小说视频在线精品欧美| 情色五月天久久久| 国产亚洲性生活视频播放| 男人的天堂色偷偷青青草视频婷婷网| 韩国一级做a久久久久| 激情文学欧美| 国语精品内射在线观看| 国偷自 一区| 精品色色| 手机午夜电影神马久久| 九九九影院| 91一起操| 狠狠操,使劲操| 亚洲日本天堂| 国产又粗又又黄又猛| 日本色色视频网站| 一区二区三区四区五区久久久久久| 99ri视频| 日逼视频日本| 国产精品天堂| 亚洲资源网| 嗯啊免费视频| 无码精品蜜桃一区二区三区ww| 肥佬影院91| 亚码人妻| 亚洲美女精品| 日本女人操逼| 国产中文大片资源中文字幕| 亚洲欧美综合图片| 另类视频在线| 国产视频一区二区在线观看| 亚洲一区二区性爱电影| 午夜福利一区二区影院| 超碰美国| 少妇精品| 偷拍新久久| 日本黄页视频在线观看| 欧美丝袜激情| 亚洲AO在线| 欧美三级一级| 日韩久久三区| 超碰人人在线| 亚洲天堂 视频你懂的| 欧美日韩香蕉| 精品人妻一区二区视频| 国产又黄又爽又刺激久久久久久| 亚洲色婷婷久久久综合日本|