本地部署NovelAI实践

最近AI画画着实火了一番,不仅有卖prompt的,还有人把图卖给版权图库,这下子插画师真是凉凉。

之前出名的Dalle2在本地机器上部署比较困难,NovelAI不仅提供了web界面,还泄露了模型,这不试一下?

机器配置

处理器名称 HexaCore Intel Core i5-12490F, 4400 MHz (44 x 100)

显示适配器 NVIDIA GeForce GTX 1080 (8 GB)

系统内存 32581 MB (DDR4 SDRAM)

系统环境

  • 科学上网
  • git
  • Python 3.10.6

前期准备

Clone这个仓库AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI (github.com)

下载泄露的模型magnet:?xt=urn:btih:5bde442da86265b670a3e5ea3163afad2c6f8ecc

安装

打开clone的目录,运行web-ui.bat,这个脚本会自动安装PyTorch等依赖。

安装gfpgan时遇到了失败,报错连接github超时,需要科学上网。代理通常非全局,需要确认power shell是否能够使用。

配置后还是遇到了错误HTTP/2 stream 1 was not closed cleanly before end of the underlying stream,合理推测我的本地http代理不支持http2,所以把git默认协议改成http1.1。执行git config –global http.version HTTP/1.1。

然后又遇到了一个报错TimeoutError: The read operation timed out,看起来纯纯是因为网速慢,重试OK。

之后还是会运行失败(Can’t run without a checkpoint. Find and place a .ckpt file into any of those locations. The program will exit.),因为没有模型。所以把下载的模型放到models文件夹中,再重试。

最后还会下载一些依赖。

使用

用prompt生成图像,底下的negative prompt是避免生成的图像,可以直接复制:lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry。

食物

我吃过最久而不腻的食物,还是麦当劳。和肯德基相比,麦当劳只做快餐,不会有奇奇怪怪的面、饭,而它的汉堡,味道也很稳定,价格亦不贵(30+能吃饱,1+1套餐只要12.9)。麦当劳的汉堡没有过于浓烈的某种口味,因此也不容易腻。

除此之外,大多数餐馆,去过一次就不想再去了。有时候,甚至明知道不好吃,为了感受环境氛围,自讨苦吃。看着琳琅满目的餐馆,没有一家能让我心动。难道食物的快乐,也会消失吗?

LeetCode初试-最长回文子串

秋招的时候没有刷题,现在刷下试试。

第一版(排列所有字符,浪费内存):

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    const arr = [];
    const sArr = s.split('');
    sArr.reduce((p,c,i)=>{
        arr[i]=[]
        for(let idx=i+1;idx<=sArr.length;idx++){
            arr[i][idx] = sArr.slice(i,idx)
        }
    },[s[0]])
    const c = (str) => {
        for(let i=0;i<str.length/2;i++){
             if(str[i] === str[str.length -i-1]) 
             {
                 continue
             } else {
                 return false;
             }
        }
       return str;
    }
    let maxL = 0;
    let maxS = '';
    arr.forEach((v)=>{
        v.forEach((vv)=>{
            const r = c(vv);
            if(r.length>maxL){
                maxL=r.length;
                maxS = r.join('');
            }
        })
    })
    return maxS;
};

改良!

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {

    const cFU = (str,s,e) => {
        for(let i=0;i<(e-s)/2;i++){
             if(str[s+i] === str[e -i-1]) 
             {
                 continue
             } else {
                 return false;
             }
        }
       return true;
    }
    const sArr = s.split('');
    let maxL = 0;
    let maxS = [0,1];
    sArr.forEach((v,i)=>{
        for(let idx=i+1;idx<=sArr.length;idx++){
            const r = cFU(sArr,i,idx);
            if(r){
                if (idx - i > maxL) {
                    maxL = idx -i;
                       maxS=[i,idx];
                }
             
            }
            

        }
    })
    return s.slice.apply(s,maxS);
};

前端中的‘use’是什么意思

Vue.use()

use方法接受传入的插件,执行传入的函数,或对象的install方法。对于没有install方法的插件和库,可以包装一层。包装的好处即,可以在install方法中将该插件挂载到vue的原型上,可以注册directive、mixin、component、filter等。通缩地说,use的作用是配置组件与vue的联系。如果没有Vue.use,直接import库也是可行的。

React Hooks

1.它解决了什么问题

生命周期方法。Class Components拥有和Vue类似的生命周期方法,但函数式组件不方便定义这种方法。同时,生命周期方法按时间组织逻辑,但同一节点可能有多个操作先后进行,代码变得难以理解。

Class语法的限制。使用js的class语法有门槛,因为js的this相比其他语言更灵活,也更容易犯错。如果不使用剪头函数(可能会造成内存泄漏),那么不得不在代码中绑定方法的this(我们知道,在函数中,可以直接从上下文访问变量)。此外,class组件不利于代码预编译时做优化。

组件间状态复用。高阶组件和provider、consumer等概念增加了组件嵌套深度,客观上消耗了更多的认知资源。

2.如何使用

StateHook:以官网给的useState为例。它的返回值是一个数组,其中包含一个变量用于get,一个方法用于set。

import React, { useState } from 'react';

function Example() {
  // 声明一个叫 “count” 的 state 变量。
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

EffectHook这类Hook用于执行React概念外的操作(比如操作DOM、监听数据),也称为“副作用”。这类Hook接受一个方法作为参数,在每次React完成DOM操作后调用,而这个方法的返回值,React会在组件销毁时调用。其实不完全对应生命周期,因为efecthook只有两个时机。

其他Hook:如useContext,useReducer。和Redux中概念相同。

我们还发现,每次渲染组件时,useState不会重复创建,但组件内多次调用可以重复创建state变量。React可以(通过分析函数中有几次调用+运行时调用顺序)分清楚什么是渲染时重复调用,什么是多次调用。

3.为什么叫use?(官方解读)

你可能想知道:为什么叫 useState 而不叫 createState?
“Create” 可能不是很准确,因为 state 只在组件首次渲染的时候被创建。在下一次重新渲染时,
useState 返回给我们当前的 state。否则它就不是 “state”了!这也是 Hook 的名字总是以 use 开头的一个原因。

4.自定义Hook

自定义Hook是对StateHook与EffectHook或其他内置Hook的再封装,在内部调用这些Hook。自定义Hook是一个普通的use开头的函数。它的参数和返回值也可以自定义。

5.Hook的限制

一定要每次在最顶层按顺序调用。

不能在嵌套函数、条件判断或循环中使用。顺序是React判断state关系和变化的关键,顺序被破坏将导致错误的结果。

除非是自定义Hook,否则不要在普通函数中调用Hook。Hook的使用和组件渲染、顺序无法分割。

Vue3.0 Hooks

在vue3.0中,独立出了setup方法。这种做法与react并无本质区别,只是区分了create与use。有分析指出了mutable与immutable的区别,我觉得没有很大影响,显示使用setState和隐式调用setter对业务开发没什么影响。只是对数组、对象的监听有些不方便。